Застосування стохастичного варіативного умовиводу до Байєсової суміші Гаусса


9

Я намагаюся реалізувати модель Гауссової суміші зі стохастичними варіаційними висновками, слідуючи цій роботі .

введіть тут опис зображення

Це пгм суміші Гаусса.

Згідно з документом, повний алгоритм стохастичного варіаційного висновку: введіть тут опис зображення

І я все ще дуже плутаю метод масштабування його до GMM.

По-перше, я подумав, що локальний параметр - це просто а інші - все глобальні параметри. Будь ласка, виправте мене, якщо я помилявся. Що означає крок 6 ? Що я повинен зробити для досягнення цього?qzas though Xi is replicated by N times

Чи можете ви мені допомогти в цьому? Спасибі заздалегідь!


Це говорить про те, що замість того, щоб використовувати весь набір даних, зрабіть одну точку даних і зробіть вигляд, що у вас точок даних однакового розміру. У багатьох випадках це буде еквівалентно множенням очікування з однією точкою даних по . NN
Daeyoung Lim

@DaeyoungLim Дякую за вашу відповідь! Я зрозумів, що ви маєте на увазі зараз, але я все ще плутаю те, що статистичні дані слід оновлювати локально, а які слід оновлювати в усьому світі. Наприклад, ось реалізація суміші Гаусса, чи не могли б ви сказати мені, як масштабувати її до svi? Я трохи загублений. Дуже дякую!
користувач5779223

Я не прочитав весь код, але якщо ви маєте справу з моделлю суміші Гаусса, змінні індикатора компонента суміші повинні бути локальними змінними, оскільки кожна з них пов'язана лише з одним спостереженням. Отже, латентні змінні компонентів суміші, які слідують за розподілом Мулінуллі (також відомий як розподіл в ML), є у вашому описі вище. zi,i=1,,N
Daeyoung Lim

@DaeyoungLim Так, я розумію, що ви сказали досі. Отже, для варіаційного розподілу q (Z) q (\ pi, \ mu, \ lambda), q (Z) має бути локальною змінною. Але є велика кількість параметрів, пов'язаних з q (Z). З іншого боку, також існує багато параметрів, пов'язаних з q (\ pi, \ mu, \ lambda). І я не знаю, як їх належним чином оновити.
користувач5779223

Вам слід використовувати припущення середнього поля, щоб отримати оптимальні варіативні розподіли для варіаційних параметрів. Ось посилання: maths.usyd.edu.au/u/jormerod/JTOpapers/Ormerod10.pdf
Daeyoung Lim

Відповіді:


2

Цей підручник ( https://chrisdxie.files.wordpress.com/2016/06/in-depth-variational-inference-tutorial.pdf ) відповідає на більшість ваших запитань, і, ймовірно, буде простіше зрозуміти, ніж оригінальний документ SVI як він конкретно проходить через усі деталі впровадження SVI (і координатного відбору VI та гібсового відбору) для моделі Гауссової суміші (з відомою дисперсією).


1

По-перше, кілька записок, які допомагають мені зрозуміти документ SVI:

  • Обчислюючи проміжне значення для варіаційного параметра глобальних параметрів, ми вибираємо одну точку даних і робимо вигляд, що весь наш набір даних розміру N це був єдиний пункт, N разів.
  • ηг є природним параметром для повної умовної глобальної змінної β. Позначення використовується для підкреслення того, що це функція умовних змінних, включаючи спостережувані дані.

У суміші к Гаусси, наші глобальні параметри - це параметри середньої та точної (оберненої дисперсії) мкк,τкпарами для кожного. Це є,ηг - природний параметр цього розподілу, нормальна гамма форми

мк,τN(мк|γ,τ(2α-1)Га(τ|α,β)

з η0=2α-1, η1=γ(2α-1) і η2=2β+γ2(2α-1). (Бернардо і Сміт, теорія Байєса ; зауважте, що це трохи відрізняється від чотирьох параметрів Normal-Gamma, які ви зазвичай бачите .) Ми будемо використовуватиа,б,м для позначення варіативних параметрів для α,β,мк

Повна умовна мкк,τк - це нормальна гамма з парами η˙+Nzн,к, Nzн,кхN, Nzн,кхн2, де η˙є пріоритетним. (Thezн,ктам також можуть бути заплутані; є сенс починати здосвідln(p)) трюк, застосований до Np(хн|zн,α,β,γ)=NК(p(хн|αк,βк,γк))zн,к, і закінчуючи неабиякою кількістю алгебри, залишеної читачеві.)

З цим ми можемо завершити крок (5) псевдокоду SVI за допомогою:

ϕн,кдосвід(лн(π)+Еqln(p(хн|αк,βк,γк))=досвід(ln(π)+Еq[мккτк,-τ2х,х2-мк2τ-lnτ2)]

Оновити глобальні параметри простіше, оскільки кожному параметру відповідає кількість даних або одна з його достатньої статистики:

λ^=η˙+Nϕн1,х,х2

Ось як виглядає гранична ймовірність даних за багатьох ітерацій, коли вони навчаються на дуже штучних, легко відокремлюваних даних (код нижче). Перший сюжет показує ймовірність з початковими, випадковими варіаційними параметрами та0ітерації; кожна наступна - після наступної сили двох ітерацій. У кодіа,б,м відносяться до змінних параметрів для α,β,мк.

введіть тут опис зображення

введіть тут опис зображення

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Aug 12 12:49:15 2018

@author: SeanEaster
"""

import numpy as np
from matplotlib import pylab as plt
from scipy.stats import t
from scipy.special import digamma 

# These are priors for mu, alpha and beta

def calc_rho(t, delay=16,forgetting=1.):
    return np.power(t + delay, -forgetting)

m_prior, alpha_prior, beta_prior = 0., 1., 1.
eta_0 = 2 * alpha_prior - 1
eta_1 = m_prior * (2 * alpha_prior - 1)
eta_2 = 2 *  beta_prior + np.power(m_prior, 2.) * (2 * alpha_prior - 1)

k = 3

eta_shape = (k,3)
eta_prior = np.ones(eta_shape)
eta_prior[:,0] = eta_0
eta_prior[:,1] = eta_1
eta_prior[:,2] = eta_2

np.random.seed(123) 
size = 1000
dummy_data = np.concatenate((
        np.random.normal(-1., scale=.25, size=size),
        np.random.normal(0.,  scale=.25,size=size),
        np.random.normal(1., scale=.25, size=size)
        ))
N = len(dummy_data)
S = 1

# randomly init global params
alpha = np.random.gamma(3., scale=1./3., size=k)
m = np.random.normal(scale=1, size=k)
beta = np.random.gamma(3., scale=1./3., size=k)

eta = np.zeros(eta_shape)
eta[:,0] = 2 * alpha - 1
eta[:,1] = m * eta[:,0]
eta[:,2] = 2. * beta + np.power(m, 2.) * eta[:,0]


phi = np.random.dirichlet(np.ones(k) / k, size = dummy_data.shape[0])

nrows, ncols = 4, 5
total_plots = nrows * ncols
total_iters = np.power(2, total_plots - 1)
iter_idx = 0

x = np.linspace(dummy_data.min(), dummy_data.max(), num=200)

while iter_idx < total_iters:

    if np.log2(iter_idx + 1) % 1 == 0:

        alpha = 0.5 * (eta[:,0] + 1)
        beta = 0.5 * (eta[:,2] - np.power(eta[:,1], 2.) / eta[:,0])
        m = eta[:,1] / eta[:,0]
        idx = int(np.log2(iter_idx + 1)) + 1

        f = plt.subplot(nrows, ncols, idx)
        s = np.zeros(x.shape)
        for _ in range(k):
            y = t.pdf(x, alpha[_], m[_], 2 * beta[_] / (2 * alpha[_] - 1))
            s += y
            plt.plot(x, y)
        plt.plot(x, s)
        f.axes.get_xaxis().set_visible(False)
        f.axes.get_yaxis().set_visible(False)

    # randomly sample data point, update parameters
    interm_eta = np.zeros(eta_shape)
    for _ in range(S):
        datum = np.random.choice(dummy_data, 1)

        # mean params for ease of calculating expectations
        alpha = 0.5 * ( eta[:,0] + 1)
        beta = 0.5 * (eta[:,2] - np.power(eta[:,1], 2) / eta[:,0])
        m = eta[:,1] / eta[:,0]

        exp_mu = m
        exp_tau = alpha / beta 
        exp_tau_m_sq = 1. / (2 * alpha - 1) + np.power(m, 2.) * alpha / beta
        exp_log_tau = digamma(alpha) - np.log(beta)


        like_term = datum * (exp_mu * exp_tau) - np.power(datum, 2.) * exp_tau / 2 \
            - (0.5 * exp_tau_m_sq - 0.5 * exp_log_tau)
        log_phi = np.log(1. / k) + like_term
        phi = np.exp(log_phi)
        phi = phi / phi.sum()

        interm_eta[:, 0] += phi
        interm_eta[:, 1] += phi * datum
        interm_eta[:, 2] += phi * np.power(datum, 2.)

    interm_eta = interm_eta * N / S
    interm_eta += eta_prior

    rho = calc_rho(iter_idx + 1)

    eta = (1 - rho) * eta + rho * interm_eta

    iter_idx += 1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.