1차원 파라미터 θ의 변분분포를 q(θ)=N(m,s2)로 둔다. ELBO는
L(m,s)=Eq[logp(D,θ)−logq(θ)]
이다. 기대값은 재매개변수화 θ=m+sε, ε∼N(0,1)로 Monte Carlo 추정한다.
elbo_mc(log_joint, m, s, eps): 표준정규 표본 배열 eps(리스트일 수도 있다)로 만든 θ들에서 logp(D,θ)−logq(θ)의 평균. log_joint는 θ 배열을 받아 같은 shape의 logp(D,θ) 배열을 돌려주는 함수다. s≤0이면 ValueError.
kl_gaussians(m1, s1, m2, s2): 두 1차원 가우시안 사이의 KL을 닫힌 꼴로 계산한다.
KL(N(m1,s12)∥N(m2,s22))=logs1s2+2s22s12+(m1−m2)2−21
테스트는 사후분포가 가우시안이고 logp(D)를 아는 경우에 L=logp(D)−KL(q∥p(θ∣D))가 성립하는지 확인한다. q가 사후분포와 같으면 표본이 몇 개든 추정값이 정확히 logp(D)가 된다(추정 분산 0)는 점도 확인한다. logp(D,θ)−logq(θ)가 그때 어떤 함수가 되는지 생각해 본다.