การใช้การอนุมานสุ่มสโทคาสต์กับ Bayesian Mixture of Gaussian


9

ฉันกำลังพยายามใช้โมเดล Gaussian Mixture ด้วยการอนุมานแปรปรวนแบบสุ่มต่อจากบทความนี้

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือ pgm ของส่วนผสมแบบเกาส์เซียน

ตามที่กระดาษ, อัลกอริทึมเต็มรูปแบบของการอนุมานสุ่มแปรผันคือ: ป้อนคำอธิบายรูปภาพที่นี่

และฉันยังคงสับสนอย่างมากเกี่ยวกับวิธีการขยายสู่ GMM

ก่อนอื่นฉันคิดว่าพารามิเตอร์ความแปรปรวนในท้องถิ่นเป็นเพียงและอื่น ๆ เป็นพารามิเตอร์ระดับโลกทั้งหมด โปรดแก้ไขฉันหากฉันผิด ขั้นตอนที่ 6 หมายถึงอะไร ฉันควรทำอย่างไรเพื่อให้บรรลุเป้าหมายนี้qzas though Xi is replicated by N times

คุณช่วยฉันด้วยเรื่องนี้ได้ไหม ขอบคุณล่วงหน้า!


มันบอกว่าแทนที่จะใช้ทั้งชุดข้อมูลตัวอย่างหนึ่งดาต้าพอยน์และแกล้งคุณมีดาต้าพอยน์ที่มีขนาดเท่ากัน ในหลายกรณีนี้จะเทียบเท่ากับการคูณความคาดหวังกับหนึ่ง DataPoint โดยไม่มีข้อความNN
Daeyoung Lim

@ DaeyoungLim ขอบคุณสำหรับคำตอบของคุณ! ฉันได้สิ่งที่คุณหมายถึงตอนนี้ แต่ฉันก็ยังสับสนว่าสถิติใดควรได้รับการอัปเดตภายในเครื่องและสถิติใดที่ควรได้รับการอัปเดตทั่วโลก ตัวอย่างเช่นนี่คือการนำไปใช้ของการผสมผสานของ Gaussian คุณช่วยบอกฉันเกี่ยวกับการปรับขนาดเป็น svi ได้ไหม? ฉันหลงทางนิดหน่อย ขอบคุณมาก!
user5779223

ฉันไม่ได้อ่านรหัสทั้งหมด แต่ถ้าคุณกำลังจัดการกับรูปแบบการผสมแบบเกาส์ตัวแปรตัวบ่งชี้องค์ประกอบการผสมควรเป็นตัวแปรในตัวเนื่องจากแต่ละตัวนั้นเกี่ยวข้องกับการสังเกตเพียงครั้งเดียว ดังนั้นตัวแปรแฝงในองค์ประกอบที่ผสมตามการกระจาย Multinoulli (หรือเรียกอีกอย่างว่าการกระจายหมวดหมู่ใน ML) คือในคำอธิบายของคุณด้านบน zi,i=1,,N
Daeyoung Lim

@DaeyoungLim ใช่ฉันเข้าใจสิ่งที่คุณพูดจนถึง ดังนั้นสำหรับการแจกแจงความแปรปรวน q (Z) q (\ pi, \ mu, \ lambda), q (Z) ควรเป็นตัวแปรเฉพาะที่ แต่มีพารามิเตอร์จำนวนมากที่เกี่ยวข้องกับ q (Z) ในทางกลับกันก็มีหลายพารามิเตอร์ที่เกี่ยวข้องกับ q (\ pi, \ mu, \ lambda) และฉันไม่รู้ว่าจะอัปเดตอย่างเหมาะสมได้อย่างไร
user5779223

คุณควรใช้สมมติฐานค่าเฉลี่ยเขตข้อมูลเพื่อรับการแจกแจงความแปรปรวนที่ดีที่สุดสำหรับพารามิเตอร์ความแปรปรวน นี่คือข้อมูลอ้างอิง: 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 และ gibbs) สำหรับแบบจำลองการผสมแบบเกาส์ (ที่มีความแปรปรวนที่รู้จัก)


1

ครั้งแรกโน้ตเล็ก ๆ น้อย ๆ ที่ช่วยให้ฉันรู้สึกถึงกระดาษ SVI:

  • ในการคำนวณค่ากลางสำหรับพารามิเตอร์แปรผันของพารามิเตอร์โลกเราตัวอย่างข้อมูลจุดหนึ่งและหลอกชุดข้อมูลของเราทั้งหมดของขนาดคือการที่จุดเดียวครั้งNN
  • ηgคือพารามิเตอร์ธรรมชาติสำหรับเงื่อนไขเต็มรูปแบบของตัวแปรโลก\สัญกรณ์จะใช้ในการเน้นว่ามันเป็นฟังก์ชั่นของตัวแปรปรับอากาศรวมถึงข้อมูลที่สังเกตได้ β

ในส่วนผสมของ Gaussians พารามิเตอร์ส่วนกลางของเราคือพารามิเตอร์ค่าเฉลี่ยและความแม่นยำ (แปรปรวนผกผัน) params สำหรับแต่ละพารามิเตอร์ นั่นคือเป็นพารามิเตอร์ธรรมชาติสำหรับการแจกแจงนี้ซึ่งเป็นแกมมาปกติของแบบฟอร์มkμk,τkηg

μ,τN(μ|γ,τ(2α1)Ga(τ|α,β)

กับ ,และalpha-1) (เบอร์นาร์โดและสมิ ธทฤษฎีเบย์ทราบว่าสิ่งนี้แตกต่างกันเล็กน้อยจากสี่ตัวแปรปกติที่คุณจะเห็น ) เราจะใช้เพื่ออ้างถึงพารามิเตอร์ตัวแปรสำหรับη0=2α1η1=γ(2α1)η2=2β+γ2(2α1)a,b,mα,β,μ

เงื่อนไขทั้งหมดของเป็นแกมมาปกติที่มี params , ,โดยที่ก่อนหน้านี้ (ในนั้นยังอาจทำให้เกิดความสับสนมันทำให้รู้สึกเริ่มต้นด้วยเคล็ดลับที่ใช้กับและลงท้ายด้วยจำนวนพีชคณิตที่เหลือจากผู้อ่าน)μk,τkη˙+Nzn,kNzn,kxNNzn,kxn2η˙zn,kexpln(p))Np(xn|zn,α,β,γ)=NK(p(xn|αk,βk,γk))zn,k

ด้วยสิ่งนี้เราสามารถทำขั้นตอน (5) ของ pseudocode SVI ด้วย:

ϕn,kexp(ln(π)+Eqln(p(xn|αk,βk,γk))=exp(ln(π)+Eq[μkτk,τ2x,x2μ2τlnτ2)]

การอัพเดตพารามิเตอร์โกลบอลนั้นง่ายกว่าเนื่องจากแต่ละพารามิเตอร์สอดคล้องกับจำนวนข้อมูลหรือหนึ่งในสถิติที่เพียงพอ:

λ^=η˙+Nϕn1,x,x2

นี่คือความเป็นไปได้ที่ข้อมูลส่วนใหญ่จะดูเหมือนมากกว่าการทำซ้ำหลายครั้งเมื่อฝึกอบรมกับข้อมูลที่ประดิษฐ์ได้มากและแยกได้ง่าย (รหัสด้านล่าง) พล็อตแรกแสดงความน่าจะเป็นที่มีพารามิเตอร์ความแปรปรวนเริ่มต้นสุ่มและการวนซ้ำครั้ง แต่ละอันตามมาคือหลังจากการใช้พลังงานครั้งต่อไปของการวนซ้ำสองครั้ง ในรหัสอ้างถึงพารามิเตอร์แปรผันสำหรับ\0a,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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.