सबसे पहले, कुछ नोट्स जो मुझे SVI पेपर की समझ बनाने में मदद करते हैं:
- वैश्विक मापदंडों के परिवर्तनीय पैरामीटर के लिए मध्यवर्ती मूल्य की गणना में, हम एक डेटा बिंदु का नमूना लेते हैं और हमारे पूरे डेटा को आकार का दिखावा करते हैं N क्या वह एकल बिंदु था, N बार।
- ηg वैश्विक चर की पूर्ण सशर्त के लिए प्राकृतिक पैरामीटर है β। नोटेशन का उपयोग तनाव के लिए किया जाता है कि यह देखे गए डेटा सहित वातानुकूलित चर का एक फ़ंक्शन है।
के मिश्रण में k गाऊसी, हमारे वैश्विक पैरामीटर माध्य और सटीक (उलटा विचरण) पैरामीटर हैं μk,τkप्रत्येक के लिए परम। अर्थात्,ηg इस वितरण के लिए प्राकृतिक पैरामीटर है, फॉर्म का एक सामान्य-गामा
μ,τ∼N(μ|γ,τ(2α−1)Ga(τ|α,β)
साथ में η0=2α−1, η1=γ∗(2α−1) तथा η2=2β+γ2(2α−1)। (बर्नार्डो और स्मिथ, बेयसियन थ्योरी ; ध्यान दें कि यह सामान्य रूप से देखे जाने वाले चार-पैरामीटर सामान्य-गामा से भिन्न होता है ।)a,b,m के लिए परिवर्तनीय मापदंडों का संदर्भ लें α,β,μ
की पूर्ण सशर्त μk,τk परम के साथ एक सामान्य-गामा है η˙+⟨∑Nzn,k, ∑Nzn,kxN, ∑Nzn,kx2n⟩, कहाँ पे η˙पूर्व है। (zn,kवहाँ भी भ्रामक हो सकता है; यह समझ में आता है एक के साथ शुरूexpln(p)) के लिए लागू चाल ∏Np(xn|zn,α,β,γ)=∏N∏K(p(xn|αk,βk,γk))zn,k, और पाठक के लिए बीजगणित की उचित मात्रा के साथ समाप्त होता है।)
इसके साथ, हम SVI छद्मकोड के चरण (5) को पूरा कर सकते हैं:
ϕn,k∝exp(ln(π)+Eqln(p(xn|αk,βk,γk))=exp(ln(π)+Eq[⟨μkτk,−τ2⟩⋅⟨x,x2⟩−μ2τ−lnτ2)]
वैश्विक मापदंडों को अपडेट करना आसान है, क्योंकि प्रत्येक पैरामीटर डेटा की गणना या उसके पर्याप्त आंकड़ों में से एक से मेल खाता है:
λ^=η˙+Nϕn⟨1,x,x2⟩
यहां बताया गया है कि बहुत अधिक कृत्रिम, आसानी से वियोज्य डेटा (नीचे कोड) पर प्रशिक्षित होने पर डेटा की सीमांत संभावना कई पुनरावृत्तियों की तरह दिखती है। पहला प्लॉट प्रारंभिक, यादृच्छिक वैरिएबल मापदंडों और के साथ संभावना दर्शाता है0पुनरावृत्तियों; प्रत्येक बाद में दो पुनरावृत्तियों की अगली शक्ति के बाद है। कोड मेंa,b,m के लिए परिवर्तनीय मापदंडों का संदर्भ लें α,β,μ।
#!/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