icon

変分オートエンコーダの理論と実装

公開: 2025-07-12 / 最終更新: 2025-07-13
VAE生成モデル確率モデル

論文を読みながらVAEを徹底的に理解する。

論文情報

Kingma, Diederik P., and M. Welling. "Auto-Encoding Variational Bayes." International Conference on Learning Representations, 2013.

VAE(変分オートエンコーダ)は2014年4月に行われたICLR2014にて発表されたモデルである。論文は2013年12月にarxivにて公開された。この研究は10年後のICLR2024にてTest of Time Awardに輝いている。10年経ってもなお、その貢献が学術分野に大きな影響を残していると言える。筆頭著者のKingma氏はこのVAE以外にもAdam最適化(ICLR2015)やGlow(NeurIPS2018)など深層学習という分野に多くの貢献を残している。

確率モデルのパラメータ推定とその課題

VAEが解決する課題を理解するために、その背景をまず理解する。

得られたデータX={x(1),x(2),,x(N)}X=\{x^{(1)},x^{(2)},\ldots,x^{(N)}\}の分布を推定する代表的な手法として、最尤推定がある。最尤推定は生成モデルの学習にも用いられ、GANのような異端児を除いた多くのモデルが最尤推定に基づいた学習を行っている。

最尤推定では尤度が最大になるパラメータを求める。

θ^ML=arg maxθpθ(X)=arg maxθnpθ(x(n))\begin{align} \hat\theta_\text{ML} &= \argmax_\theta p_\theta(X) \\ &= \argmax_\theta \prod_n p_\theta(x^{(n)}) \end{align}

最尤推定以外にも分布を推定する方法は存在し、例えばMAP推定では尤度ではなく事後確率が最大となるパラメータを求める。

θ^MAP=arg maxθp(θX)=arg maxθpθ(X)p(θ)\begin{align} \hat\theta_\text{MAP} &= \argmax_\theta p(\theta|X) \\ &= \argmax_\theta p_\theta(X)p(\theta) \end{align}

最尤推定やMAP推定のようなパラメータのある一点を求める推定は点推定と括られる。一方で、パラメータの一点ではなくパラメータの分布を求める手法も存在し、それはベイズ推定と呼ばれる。

p(θX)=pθ(X)p(θ)p(X)\begin{align} p(\theta|X) = \frac{p_\theta(X)p(\theta)}{p(X)} \end{align}

いずれの推定手法も初めにモデル化を行う必要がある。ここでのモデル化とは、確率変数xxの発生過程をパラメータθ\thetaで記述することを指す。最尤推定ではパラメータθ\thetaに従う確率分布pθ(x)p_\theta(x)、MAP推定・ベイズ推定ではそれに加えて事前分布p(θ)p(\theta)を定義する。

モデル化はxxの性質や背景をよく観察した上で行われる。xxがシンプルである場合、そのモデルp(x)p(x)として我々がよく知る扱いやすい分布を仮定できる。その場合は各種推定を解析的に行うことができるので、とても嬉しい。しかしそのようなケースは稀で、特に生成モデルが欲しいと感じるような高次元で複雑なデータに対して、扱いやすいシンプルな分布を仮定することは不可能に等しい。

Loading image...

そのような場面によく用いられる手法が、潜在変数の仮定である。xxの裏に、xxをよく表したより本質的な情報zzが存在すると仮定し、その周辺化によってxxの分布を表す。このzzを潜在変数と呼ぶ。

p(x)=zp(xz)p(z)\begin{align} p(x) = \sum_z p(x|z)p(z) \end{align}

この形は非常に表現力が高く、各分布p(z)p(z)p(xz)p(x|z)に対してそこまで複雑な分布を仮定せずとも、複雑なxxをよく表せる。実際、上の図の右側は混合ガウスモデルという潜在変数モデルの可視化である。このモデル化ではデータxxが次のような流れで得られることを仮定している。

  1. p(z)p(z)からzzがサンプリングされる
  2. p(xz)p(x|z)からxxがサンプリングされる

Loading image...

しかしこの分布の和の形は扱うのが非常に困難であり、各種推定において解析解を得ることは難しくなる。

EMアルゴリズム

潜在変数モデルの点推定を行う代表的な手法として、EMアルゴリズムが存在する。この手法は混合ガウスモデルのように潜在変数が離散的な場合に適用できる。

最尤推定を例に説明する。EMアルゴリズムでは対数尤度を次のように分解する。

lnpθ(X)=L(θ,q(Z))+DKL[q(Z)pθ(ZX)]\begin{align} \ln p_\theta(X) = \mathcal L(\theta, q(Z)) + D_{KL}[q(Z)\|p_\theta(Z|X)] \end{align}

qqは何らかの確率分布。L\mathcal Lは変分下界と呼ばれ、次のように表される。

L(θ,q(Z))=Zq(Z)lnpθ(X,Z)q(Z)\begin{align} \mathcal L(\theta, q(Z)) = \sum_Z q(Z)\ln \frac{p_\theta(X,Z)}{q(Z)} \end{align}

📖

変分下限と呼ぶ資料も多いが、ここでは論文に倣って変分下界または下界と呼ぶ。

L(θ,ϕ;x(i))\mathcal L(\theta, \phi; \bold x^{(i)}) is called the (variational) lower bound

*下界=Lower Bound, 下限=Lower Limit

下界という言葉が示すように、以下が常に成り立つ。KL情報量の非負性から容易に納得できる。

lnpθ(X)L(θ,q(Z))\begin{align} \ln p_\theta(X) \geq \mathcal L(\theta, q(Z)) \end{align}

これらの関係は次のように表せる。

Loading image...

EMアルゴリズムでは以下を繰り返すことで対数尤度を大きくする:

  1. KL情報量をqqについて最小化
  2. 変分下界をθ\thetaについて最大化

KL情報量は2つの確率分布が完全に一致するときにのみ最小値0を取る。つまりステップ1では次を行う。

q(Z)pθ(ZX)=pθ(X,Z)Zpθ(X,Z)\begin{align} q(Z) &\larr p_\theta(Z|X) \\ &= \frac{p_\theta(X,Z)}{\sum_{Z'} p_\theta(X,Z')} \end{align}

対数尤度自体はqqに依存しないので、qqを更新することで変化するのは下界とKL情報量の比率になる。KL情報量を小さくすることで、下界はその分大きくなる。

ステップ2ではこのqqの下で下界を最大化する。下界は数学的に扱いやすい性質を持ち、zzが離散的な場合はθ\thetaに関する最大化を解析的に行える。

θarg maxθL(θ,q(Z))\begin{align} \theta \larr \argmax_\theta \mathcal L(\theta, q(Z)) \end{align}

そしてその新たなθ\thetaの下で再度qqを更新し、と繰り返すことで目的の対数尤度を大きくすることが可能である。この更新によって対数尤度が単調増加(厳密には単調非減少)することは数学的に示せる。

EMアルゴリズムは、パラメータθ\thetaの下での潜在変数ZZに関する事後分布pθ(ZX)p_\theta(Z|X)が計算可能であるという好ましい状況によって成り立つ手法である。ZZが離散的であることで事後分布の計算に必要な周辺尤度(分母)を総当たりによって求められるようになる。

変分ベイズ

EMアルゴリズムは潜在変数モデルの点推定を行うが、潜在変数モデルのベイズ推定を行いたい場面もある。それを行う手法が変分ベイズ(Variational Bayse)である。変分推論と呼ばれたりもする。

潜在変数モデルにおけるベイズ推定では、パラメータと潜在変数を同一視する。

Z:={Z,θ}\begin{align} Z := \{Z,\theta\} \end{align}

潜在変数ZZはデータXXの発生に関わる確率変数であるため、パラメータを確率変数とするベイズ的な立場の下ではパラメータθ\thetaも潜在変数に含まれる。

変分ベイズでは、データXXが得られた下での潜在変数ZZの事後分布を求める。

p(ZX)\begin{align} p(Z|X) \end{align}

しかし複雑なモデル化の下でこの事後分布を求めることは困難である。そこで、事後分布を別の分布q(Z)q(Z)で近似することを考える。

q(Z)p(ZX)\begin{align} q(Z) \approx p(Z|X) \end{align}

近似精度を表す指標としてKL情報量を採用し、その最小化を目指す。

DKL[q(Z)p(ZX)]\begin{align} D_{KL}[q(Z) \| p(Z|X)] \end{align}

そしてこのKL情報量はこのように表せる。

DKL[q(Z)p(ZX)]=lnp(X)L(q(Z))\begin{align} D_{KL}[q(Z)\|p(Z|X)] = \ln p(X) - \mathcal L(q(Z)) \end{align}

この式はEMアルゴリズムで出てきた分解をパラメータθ\thetaで周辺化することで得られる。ここで、周辺対数尤度lnp(X)\ln p(X)qqに依らない定数であることがわかる。つまりKL情報量の最小化は下界の最大化と同じ意味になる。

変分ベイズでは、変分下界をqqについて最大化することで事後分布を近似する。しかし多くの場合でその最大化が素直にできない。そこで平均場近似という簡略化を行う。これはいくつかの潜在変数が独立であるという仮定で、この仮定の下、座標上昇法による下界の最大化を行う。なおこの最大化の過程で変分法という汎関数の停留点を求める手法を用いるため、変分ベイズという名前がついている。


💡

この章のまとめ

  • 確率モデルのパラメータを推定する手法として最尤推定、MAP推定、ベイズ推定がある。xxにシンプルな確率モデルを仮定できるときはこれらの推定が解析的に行える。
  • xxが複雑なときは潜在変数を仮定する: p(x)=zp(xz)p(z)p(x)=\sum_z p(x|z)p(z)
  • 潜在変数モデルの点推定はEMアルゴリズム、ベイズ推定には変分ベイズを用いる。しかしこれらの手法は、潜在変数が連続的な場合や、平均場近似が成り立たないような複雑なモデルにおいては適用できない。

VAEの目的

潜在変数モデルにおける上記パラメータ推定手法の課題を解決するモデルとして変分オートエンコーダ(VAE; Variational Autoencoder)というモデルが提案された。

EMアルゴリズムでは潜在変数モデルにおける点推定を実現したが、適用場面は潜在変数が離散的であるという特殊なケースに限られる。また変分ベイズでは潜在変数モデルにおけるベイズ推定を実現したが、多くの場合で平均場近似という強い簡略化が必要になり、複雑なモデルに適用することは難しい。

VAEはそれらの問題をまとめて解決する手法として提案された。連続的な潜在変数を持つモデルにおけるパラメータに関する点推定潜在変数に関するベイズ推定を同時に行う。この目的は論文にも分かりやすく書いてある。

The strategy in this section can be used to derive a lower bound estimator (a stochastic objective function) for a variety of directed graphical models with continuous latent variables. We will restrict ourselves here to the common case where we have an i.i.d. dataset with latent variables per datapoint, and where we like to perform maximum likelihood (ML) or maximum a posteriori (MAP) inference on the (global) parameters, and variational inference on the latent variables.

本稿では点推定の中でも最尤推定に絞ってVAEを説明する。つまり目的を次の2つとする。

  1. 尤度pθ(X)p_\theta(X)を大きくするθ\thetaを求める
  2. その下での潜在変数ZZに関する事後分布pθ(ZX)p_\theta(Z|X)を求める

潜在変数が離散的である場合、目的1はEMアルゴリズムによって実現でき、目的2についてはいかなるθ\thetaについて解析的に行える。ここから考えると、VAEはEMアルゴリズムを進化させて連続的な潜在変数に対応させたものとも見られる。EMアルゴリズム・変分ベイズ・VAEの位置関係をまとめると次のようになる。

目的連続的な潜在変数
EMアルゴリズムパラメータに関する点推定
(& 潜在変数に関するベイズ推定)
扱えない
変分ベイズ潜在変数に関するベイズ推定扱いづらい
VAEパラメータに関する点推定
& 潜在変数に関するベイズ推定
扱える

😐

扱いづらいってのは、扱えるけど、そこまで複雑なもの(例えば、都合よく平均場近似が行えないもの)は扱えないって感じかな。

VAEのモデル化

これらの目的を達成するための具体的なモデル化を見ていこう。

得られたxxが複雑でシンプルなモデルでは記述できない場面、潜在変数zzを導入することで高い表現力をモデルに与えようとするのであった。離散的なzzではこうなる。

p(x)=zp(xz)p(z)\begin{align} p(x) = \sum_z p(x|z)p(z) \end{align}

しかしこれでも表現力が足りないことがある。得られたデータが画像のような高次元データであると、離散的な潜在変数では十分な表現力が得られない。そこで連続的な潜在変数を仮定する。VAEではこれを考える。

p(x)=zp(xz)p(z)dzxRDxzRDz\begin{align} p(\bm x) &= \int_{\bm z} p(\bm x|\bm z)p(\bm z) \, d\bm z \\ \bm x &\in \R^{D_x} \\ \bm z &\in \R^{D_z} \\ \end{align}

以後観測データxxと潜在変数zzはベクトルとする。

まずは事前分布p(z)p(\bm z)を決める。といってもこれは割と適当で良い。というか考えようがない。VAEにおける潜在変数の仮定とは、x\bm xのより本質的な情報を表した何かが存在するというものであり、それ以上の仮定は行わない。ただかといって、具体的にモデル化しないと先へ進めないので、実装時は我々にとって都合のいいようなモデル化を適当に行なっておく。基本的には標準正規分布N(0,I)\mathcal N(\bm 0, I)かな。サンプリングもしやすいし、扱いやすいし、これでいいでしょ。

実際、z\bm zが連続である程度の次元数を持っていればその時点でそれなりの表現力を持つため、どのような分布であっても、現実世界で観測されるデータを表すにはほとんど場合で十分である(多様体仮説)。そのためVAEでは、z\bm zにはx\bm xよりもずっと低い次元の空間を仮定することが多い(Dz<DxD_z < D_x)。ちなみに、この「生成したいデータの裏に、サンプリングが容易な何らかの潜在変数が存在する」という仮定は多くの生成モデルの出発点である(VAE、GAN、Flow、DDPM)。

次にそのz\bm zからx\bm xへの対応として条件付き分布p(xz)p(\bm x|\bm z)をモデル化する。しかしz\bm zは多次元連続ベクトルなので自力で細かく記述することは難しい。そこで、DNN(Deep Neural Network)を用いる。DNNは表現力が高いので、多様な表現を持つz\bm zをうまく扱えると仮定する。具体的には、z\bm zを受け取って何らかの確率分布のパラメータψ^\hat\psiを出力するDNNを定義し、条件付き分布をモデル化する。

pθ(xz)=p(x;ψ^θ)ψ^θ=DNNθ(z)\begin{align} p_\theta(\bm x|\bm z) &= p(\bm x;\hat\psi_\theta) \\ \hat\psi_\theta &= \text{DNN}_\theta(\bm z) \end{align}

そしてこのときのpθ(xz)p_\theta(\bm x|\bm z)にもシンプルな分布を仮定してよい。どれくらいシンプルにしていいかというと、まずx\bm xの各要素xix_iがそれぞれ独立であると仮定してよい。

pθ(xz)=p(x;ψ^θ)=i=1Dxp(xi;ψ^θ,i)\begin{align} p_\theta(\bm x|\bm z) &= p(\bm x;\hat{\bm\psi}_\theta) \\ &= \prod_{i=1}^{D_x} p(x_i;\hat\psi_{\theta,i}) \end{align}

さらにその上でp(xi;ψ^θ,i)p(x_i;\hat\psi_{\theta,i})にはベルヌーイ分布や正規分布といった我々がよく知る扱いやすい分布を仮定する。xix_iが二値ないしそう見てしまっても問題ないような場面ではベルヌーイ分布を仮定し、

pθ(xz)=Bernoulli(x;λ^θ)=i=1Dx((λ^θ,i)xi+(1λ^θ,i)1xi)λ^θ=DNNθ(z)RDx\begin{align} p_\theta(\bm x|\bm z) &= \text{Bernoulli}(\bm x; \hat{\bm\lambda}_\theta) \\ &= \prod_{i=1}^{D_x} ((\hat\lambda_{\theta,i})^{x_i} + (1 - \hat\lambda_{\theta,i})^{1-x_i}) \\ \hat{\bm\lambda}_\theta &= \text{DNN}_\theta(\bm z) \in\R^{D_x} \end{align}

それ以外の場面では分散固定の正規分布を仮定する。

pθ(xz)=N(x;μ^θ,I)μ^θ=DNNθ(z)RDx\begin{align} p_\theta(\bm x|\bm z) &= \mathcal N(\bm x; \hat{\bm\mu}_\theta, I) \\ \hat{\bm\mu}_\theta &= \text{DNN}_\theta(\bm z) \in\R^{D_x} \end{align}

大抵のモデル化はこのいずれかになる。

ちなみに、xix_iが独立であると仮定しているが、実際は当然そんな訳がない。例えばx\bm xが画像を表したベクトルでxix_iがある一つのピクセルの色を表しているとすると、隣り合うピクセルには強い相関があるはずである。それらが独立であると仮定した場合、pθ(xz)p_\theta(\bm x|\bm z)は観測データを表すのにやや不正確であると言える。

そのような問題もあってか、VAEを用いてデータを生成する際は、pθ(xz)p_\theta(\bm x|\bm z)からのサンプリングに通常の確率的な手法ではなく、最も確率密度の高い点を出力するという決定的な手法を取ることが多い。そのような点はシンプルなpθ(xz)p_\theta(\bm x|\bm z)の下では解析的に得られる、つまりDNNが出力したパラメータψ^θ\hat{\bm\psi}_\thetaによって一意に求められる。そしてそのψ^θ\hat{\bm\psi}_\thetaの各要素ψ^θ,i\hat\psi_{\theta,i}は独立ではないため、これによって比較的正確なサンプルが得られるようになる。これはz\bm zx\bm xの対応関係の記述を全てDNNに任せるということである。

例えばpθ(xz)p_\theta(\bm x|\bm z)に正規分布を仮定した場合、最も確率密度の高い点はその平均μ^θ=DNNθ(z)\hat{\bm\mu}_\theta=\text{DNN}_\theta(\bm z)と一致する。つまり、サンプリングしたz\bm zをDNNに入れて出てきたものがそのまま生成結果となる。分散を固定する理由はこれで、そもそも分散をz\bm zによって変化させたい場面が存在しないからである。

連続的な潜在空間が持つ多様性により、このような一部が決定的なサンプリング手法でもまあまあ多様なデータが生成できる。なおこの決定的なサンプリングは、独立性に加えて分散が非常に小さい分布であるという仮定を行い、その分布からサンプリングしている、と見ることもできる。


一旦ここまでのモデル化を整理する。

pθ(X)=n=1Npθ(x(n))pθ(x)=zpθ(xz)p(z)dzpθ(xz)=p(x;ψ^θ)ψ^θ=DNNθ(z)\begin{align} p_\theta(X) &= \prod_{n=1}^N p_\theta(\bm x^{(n)}) \\ p_\theta(\bm x) &= \int_{\bm z} p_\theta(\bm x|\bm z)p(\bm z) \, d\bm z \\ p_\theta(\bm x|\bm z) &= p(\bm x; \hat{\bm\psi}_\theta) \\ \hat{\bm\psi}_\theta &= \text{DNN}_\theta(\bm z) \end{align}

p(z)p(\bm z)はパラメータθ\thetaに依存しない固定分布。x\bm xの発生過程を図で表すとこう。

Loading image...


さて、最初に掲げた目的をもう一度見てみよう。

  1. 尤度pθ(X)p_\theta(X)を大きくするθ\thetaを求める
  2. その下での事後分布pθ(ZX)p_\theta(Z|X)を求める

ここで、先のモデル化では2を達成することができない。以下の事後分布を求めることは事実上不可能であるため。

pθ(ZX)=pθ(XZ)p(Z)Zpθ(XZ)p(Z)dZ\begin{align} p_\theta(Z|X) = \frac{p_\theta(X|Z)p(Z)}{\int_{Z'} p_\theta(X|Z')p(Z')dZ'} \end{align}

pθ(XZ)p_\theta(X|Z)は多層のニューラルネットで記述されるので、その積分なんて求められるわけがない。ZZは多次元連続ベクトルなので、GMMのように取りうるすべてのZZで総当たりをすることもできない。

ここで変分ベイズの手法を踏襲する。変分ベイズでは、直接求められない事後分布p(ZX)p(Z|X)の代わりに別の分布を持ち出して事後分布を近似した。これを真似して、pθ(ZX)p_\theta(Z|X)を近似する分布としてqϕ(ZX)q_\phi(Z|X)を定義する。そしてこのqqを先ほどと同じようにDNNでモデル化する。

qϕ(ZX)=n=1Nqϕ(z(n)x(n))qϕ(zx)=p(z;ψ^ϕ)ψ^ϕ=DNNϕ(x)\begin{align} q_\phi(Z|X) &= \prod_{n=1}^N q_\phi(\bm z^{(n)}|\bm x^{(n)}) \\ q_\phi(\bm z|\bm x) &= p(\bm z; \bm{\hat\psi}_\phi) \\ \bm{\hat\psi}_\phi &= \text{DNN}_\phi(\bm x) \end{align}

qϕ(zx)q_\phi(\bm z|\bm x)にはほとんどの場合で独立な正規分布を仮定する。p(z)p(\bm z)に標準正規分布を仮定する場合、同じ分布を仮定しておくと後の計算が楽になる。この場合、DNNは正規分布の平均と分散を出力する。

qϕ(zx)=N(z;μ^ϕ,σ^ϕ2I)μ^ϕ,σ^ϕ=DNNϕ(x)RDz\begin{align} q_\phi(\bm z|\bm x) &= \mathcal N(\bm z; \hat{\bm\mu}_\phi, \hat{\bm\sigma}_\phi^2I) \\ \hat{\bm\mu}_\phi, \hat{\bm\sigma}_\phi &= \text{DNN}_\phi(\bm x) \in \R^{D_z} \end{align}

🤔

変分オートエンコーダの「変分」はここから来ている。変分ベイズの変分。しかし「変分ベイズ」の由来となった変分法とは全く関係がない。VAEでは変分法使わないからね。つまり変分オートエンコーダは、変分ベイズの中の変分法とは全く関係のない部分を使って「変分」を名乗っていることになる。なんか面白いね。


最後にモデル化をまとめる。

まず確率モデルを次のように定義する。

pθ(X)=n=1Npθ(x(n))pθ(x)=zpθ(xz)p(z)dzpθ(xz)=p(x;ψ^θ)ψ^θ=DNNθ(z)\begin{align} p_\theta(X) &= \prod_{n=1}^N p_\theta(\bm x^{(n)}) \\ p_\theta(\bm x) &= \int_{\bm z} p_\theta(\bm x|\bm z)p(\bm z) \, d\bm z \\ p_\theta(\bm x|\bm z) &= p(\bm x; \hat{\bm\psi}_\theta) \\ \hat{\bm\psi}_\theta &= \text{DNN}_\theta(\bm z) \end{align}

そして事後分布は素直に求められないので、次のように近似する。

pθ(ZX)qϕ(ZX)=n=1Nqϕ(z(n)x(n))qϕ(zx)=p(z;ψ^ϕ)ψ^ϕ=DNNϕ(x)\begin{align} p_\theta(Z|X) &\approx q_\phi(Z|X) \\ &= \prod_{n=1}^N q_\phi(\bm z^{(n)}|\bm x^{(n)}) \\ q_\phi(\bm z|\bm x) &= p(\bm z; \hat{\bm\psi}_\phi) \\ \hat{\bm\psi}_\phi &= \text{DNN}_\phi(\bm x) \end{align}

VAEはこれら二つのモデルによって構成される。

VAEの学習

学習目標を再再掲する。

  1. 尤度pθ(X)p_\theta(X)を大きくするθ\thetaを求める
  2. その下での事後分布pθ(ZX)p_\theta(Z|X)を求める

2については別の分布で近似するものとしたので、次のように書き換える。

  1. 尤度pθ(X)p_\theta(X)を大きくするθ\thetaを求める
  2. その下での事後分布pθ(ZX)p_\theta(Z|X)をよく表す近似分布qϕ(ZX)q_\phi(Z|X)を求める

この目標に向かって学習を進めよう。


まず、これらの目標をより厳密に記述する。この二つの達成度合いを表す具体的な値を考える。

1の尤度の大きさは対数尤度で表すと良さそう:

lnpθ(X)\begin{align} \ln p_\theta(X) \end{align}

2の近似の精度については、変分ベイズに倣ってKL情報量を使おう:

DKL[qϕ(ZX)pθ(ZX)]\begin{align} D_{KL}[q_\phi(Z|X)\|p_\theta(Z|X)] \end{align}

さてこうすると、我々の目標は、1を最大化しながら2を最小化することとなる。ここで、片方にマイナスをかけて目標の方向(最大化 or 最小化)を揃え、この2つを足すことを考える。そうすると、その足した値を最大化ないし最小化すればよいことになる。

KL情報量にマイナスをかけて足してみよう。すると目標はその足した値の最大化となる。

lnpθ(X)DKL[qϕ(ZX)pθ(ZX)]\begin{align} \ln p_\theta(X) - D_{KL}[q_\phi(Z|X)\|p_\theta(Z|X)] \end{align}

さてこの式、どこかで似たものを見た気がする。EMアルゴリズムで出てきた変形かな。

lnpθ(X)=L(θ,q(Z))+DKL[q(Z)pθ(ZX)]\begin{align} \ln p_\theta(X) = \mathcal L(\theta,q(Z)) + D_{KL}[q(Z) \| p_\theta(Z|X)] \end{align}

パラメータの書き方を合わせて、移項すると?

lnpθ(X)DKL[qϕ(ZX)pθ(ZX)]=L(θ,ϕ)\begin{align} \ln p_\theta(X) - D_{KL}[q_\phi(Z|X)\|p_\theta(Z|X)] = \mathcal L(\theta,\phi) \end{align}

先の目標が変分下界L(θ,ϕ)\mathcal L(\theta, \phi)という一つの項で記述できた。つまり、1. 尤度の最大化と、2. KL情報量の最小化、という2つの目標を、変分下界の最大化という一つの目標で表すことができた。そしてこれがVAEの学習目標となる。


下界の最大化は勾配法で行う。勾配を求めるために、下界を分かりやすい形に変形する。

L(θ,ϕ)=lnpθ(X)DKL[qϕ(ZX)pθ(ZX)]=lnpθ(X)Eqϕ(ZX)[lnqϕ(ZX)lnpθ(ZX)]=lnpθ(X)Eqϕ(ZX)[lnqϕ(ZX)lnpθ(X,Z)+lnpθ(X)]=Eqϕ(ZX)[lnqϕ(ZX)lnpθ(X,Z)]=Eqϕ(ZX)[lnqϕ(ZX)lnpθ(XZ)lnp(Z)]=Eqϕ(ZX)[lnpθ(XZ)]Eqϕ(ZX)[lnqϕ(ZX)lnp(Z)]=Eqϕ(ZX)[lnpθ(XZ)]DKL[qϕ(ZX)p(Z)]\begin{align} \mathcal L(\theta,\phi) &= \ln p_\theta(X) - D_{KL}[q_\phi(Z|X)\|p_\theta(Z|X)] \\ &= \ln p_\theta(X) - \mathbb E_{q_\phi(Z|X)}[\ln q_\phi(Z|X) - \ln p_\theta(Z|X)] \\ &= \ln p_\theta(X) - \mathbb E_{q_\phi(Z|X)}[\ln q_\phi(Z|X) - \ln p_\theta(X,Z) + \ln p_\theta(X)] \\ &= -\mathbb E_{q_\phi(Z|X)}[\ln q_\phi(Z|X) - \ln p_\theta(X,Z)] \\ &= -\mathbb E_{q_\phi(Z|X)}[\ln q_\phi(Z|X) - \ln p_\theta(X|Z) - \ln p(Z)] \\ &= \mathbb E_{q_\phi(Z|X)}[\ln p_\theta(X|Z)] - \mathbb E_{q_\phi(Z|X)}[\ln q_\phi(Z|X) - \ln p(Z)] \\ &= \mathbb E_{q_\phi(Z|X)}[\ln p_\theta(X|Z)] - D_{KL}[q_\phi(Z|X) \| p(Z)] \\ \end{align}

一項目は近似事後分布qϕ(ZX)q_\phi(Z|X)の下での条件付き対数尤度lnpθ(XZ)\ln p_\theta(X|Z)の期待値。二項目は潜在変数ZZに関する近似事後分布と事前分布のKL情報量。この勾配を計算し、その勾配に基づいてパラメータの更新を繰り返すことで、下界を最大化する。

Reparameterization Trick

変分下界を期待値とKL情報量の二つの項に分解した。求めたいものはこれらの勾配である。KL情報量の項については解析的に求められることが多く、勾配もそこからの逆伝播で求められるが、期待値の項についてはそうもいかない。まだθ\thetaについては比較的簡単な近似ができるが、ϕ\phiに関する微分は非常に厄介で、期待値の確率分布qϕ(ZX)q_\phi(Z|X)を記述しているためθ\thetaで使える近似手法も使えない。

ここで、ある期待値のその分布のパラメータに関する勾配を求めることを考える。

θEpθ(x)[f(x)]\begin{align} \nabla_\theta \mathbb E_{p_\theta(x)}[f(x)] \end{align}

これは変分下界における期待値の項の勾配を求める問題の一般化である。そして値は次のように変形を進めることで近似できる。

θEpθ(x)[f(x)]=θxf(x)pθ(x)dx=xf(x)θpθ(x)dx=xf(x)pθ(x)θlnpθ(x)dx=Epθ(x)[f(x)θlnpθ(x)]1Ll=1Lf(x(l))θlnpθ(x(l))x(l)pθ(x)\begin{align} \nabla_\theta \mathbb E_{p_\theta(x)}[f(x)] &= \nabla_\theta \int_x f(x) p_\theta(x) \, dx \\ &= \int_x f(x) \nabla_\theta p_\theta(x) \, dx \\ &= \int_x f(x) p_\theta(x) \nabla_\theta \ln p_\theta(x) \, dx \\ &= \mathbb E_{p_\theta(x)} [f(x) \nabla_\theta \ln p_\theta(x)] \\ &\approx \frac{1}{L} \sum_{l=1}^L f(x^{(l)}) \nabla_\theta \ln p_\theta(x^{(l)}) \\ x^{(l)} &\sim p_\theta(x) \end{align}

2-3行目の変換には対数微分のトリックを使った。

xlnf(x)=xf(x)f(x)xf(x)=f(x)xlnf(x)\begin{align} \nabla_x \ln f(x) &= \frac{\nabla_x f(x)}{f(x)} \\ \nabla_x f(x) &= f(x) \nabla_x \ln f(x) \end{align}

これで期待値の勾配を推定できる。この推定手法はREINFORCEアルゴリズムにおける方策勾配の近似にも使われており、そのままREINFORCEと呼ばれたりする。スコア関数θlnpθ(x)\nabla_\theta \ln p_\theta(x)を用いるのでスコア関数推定量と呼ばれたりもする。本稿でもそう呼ぼうと思う。

変分下界の期待値の項の勾配もスコア関数推定量で近似できる。pθ(x)=qϕ(ZX)p_\theta(x)=q_\phi(Z|X)f(x)=lnpθ(XZ)f(x)=\ln p_\theta(X|Z)を代入すればいい。

ϕEqϕ(ZX)[lnpθ(XZ)]=Eqϕ(ZX)[lnpθ(XZ)ϕlnqϕ(ZX)]1Ll=1Llnpθ(XZ(l))ϕlnqϕ(Z(l)X)Z(l)qϕ(ZX)\begin{align} \nabla_\phi \mathbb E_{q_\phi(Z|X)}[\ln p_\theta(X|Z)] &= \mathbb E_{q_\phi(Z|X)} [\ln p_\theta(X|Z) \nabla_\phi \ln q_\phi(Z|X)] \\ &\approx \frac{1}{L} \sum_{l=1}^L \ln p_\theta(X|Z^{(l)}) \nabla_\phi \ln q_\phi(Z^{(l)}|X) \\ Z^{(l)} &\sim q_\phi(Z|X) \end{align}

しかしこの推定量には問題点がある。

この値は期待値の不偏推定量なので、LL\to\inftyの極限で真の値と一致するが、現実的にはLLを何らかの有限な値に設定する必要がある。LLを有限な値に設定する場合、気になるのはそのばらつきである。もし推定量が大きな分散を持つ場合、真の値から外れた値を取ることが多くなる。

ここから、勾配法における勾配を不偏推定で近似する場面において、その分散が大きいことは、「各ステップで行うパラメータ更新が正しい方向への更新にならない可能性が高い」と言える。そして実際に、スコア関数推定量は大きな分散を持つことが知られている。これではVAEの学習が効率的に行えない。

📖

スコア関数による推定は論文内で「ナイーブな推定手法」と呼ばれている。そしてその推定量が大きな分散を持つことは別の論文に書いてあるらしい(読んでないから知らん):
Paisley, John, David Blei, and Michael Jordan. "Variational Bayesian inference with stochastic search." arXiv preprint arXiv:1206.6430 (2012).

The usual (naïve) Monte Carlo gradient estimator for this type of problem is: ϕEqϕ(z)[f(z)]=Eqϕ(z)[f(z)qϕ(z)logqϕ(z)]1Ll=1Lf(z(l))qϕ(z(l))logqϕ(z(l))\nabla_{\phi} \mathbb{E}_{q_{\phi}(\mathbf{z})}[f(\mathbf{z})] = \mathbb{E}_{q_{\phi}(\mathbf{z})}[f(\mathbf{z})\nabla_{q_{\phi}(\mathbf{z})} \log q_{\phi}(\mathbf{z})] \approx \frac{1}{L}\sum_{l=1}^{L} f(\mathbf{z}^{(l)})\nabla_{q_{\phi}(\mathbf{z}^{(l)})} \log q_{\phi}(\mathbf{z}^{(l)}) where z(l)qϕ(zx(i))\mathbf{z}^{(l)} \sim q_{\phi}(\mathbf{z}|\mathbf{x}^{(i)}). This gradient estimator exhibits very high variance (see e.g. [BJP12]) and is impractical for our purposes.

最後の文の”impractical”は「非現実的」という意味になるかな。”our purposes”が具体的に何であるかにも依るが、それについてはこの論文の一文目にヒントがある。

How can we perform efficient inference and learning in directed probabilistic models, in the presence of continuous latent variables with intractable posterior distributions, and large datasets?

この“efficient inference and learning”(効率的な推論と学習)が”our purposes”(VAEの目的)の一つなのではないだろうか。そして、スコア関数推定量ではそれを満たせない。この推定量で学習を行うためには、LLをある程度大きな値に設定して分散を小さくする必要があるが、それをすると勾配の推定にいちいち大量のコストがかかるようになり、それはとても非効率的である。


この問題を解決するため、Kingmaらは新たな勾配近似手法としてReparameterization Trickを提案した。日本語では再パラメータ化トリックと呼ばれる。

改めて目的を整理すると、我々が欲しいものは「期待値の勾配」であった。この時、この期待値をモンテカルロ法で近似してそれを微分する、というアプローチが最も愚直に感じる。

θEpθ(x)[f(x)]θ1Ll=1Lf(x(l))x(l)pθ(x)\begin{align} \nabla_\theta \mathbb E_{p_\theta(x)}[f(x)] &\approx \nabla_\theta \frac{1}{L}\sum_{l=1}^L f(x^{(l)}) \\ x^{(l)} &\sim p_\theta(x) \end{align}

しかし、この近似を成立させるためには下段のサンプリング過程x(l)pθ(x)x^{(l)} \sim p_\theta(x)がパラメータθ\thetaについて微分できなければならず、その要件は一般的な場面で満たせない。これに対しKingmaらは、いくつかの緩い条件の下ではその要件をクリアできると主張した。具体的には、サンプリング過程を次のように書き直せる場合、サンプリング過程をパラメータで微分できるようになることを示した。

x~=gθ(ϵ)ϵp(ϵ)\begin{align} \tilde x &= g_\theta(\epsilon) \\ \epsilon &\sim p(\epsilon) \end{align}

適当な分布からノイズϵ\epsilonを取得し、それを用いて確率変数x~\tilde xをパラメータθ\thetadeterministic=決定論的に記述した。これによって確率変数x~\tilde xがパラメータθ\thetaで微分できるようになり、x~pθ(x)\tilde x \sim p_\theta(x)となるようなノイズ分布p(ϵ)p(\epsilon)θ\thetaについて微分可能な関数gθ(ϵ)g_\theta(\epsilon)をうまく見つけることができれば、pθ(x)p_\theta(x)からのサンプリング過程がθ\thetaで微分できるようになる。例えば正規分布の場合、p(ϵ)p(\epsilon)を標準正規分布にすることで再パラメータ化が可能である。

xN(μ,σ2)x~=μ+σϵwhereϵN(0,1)\begin{align} &\, x \sim \mathcal N(\mu, \sigma^2) \\ \Leftrightarrow &\, {\tilde x} = \mu + \sigma\cdot\epsilon \quad \text{where} \quad \epsilon \sim \mathcal N(0, 1) \end{align}

ある分布や変数をパラメータを用いて記述することをパラメータ化(Parameterization)と呼ぶ。先の書き直しは、本来微分できなかったサンプリング過程を微分できる形で改めて(再び)パラメータ化したことになる。Reparameterization(再パラメータ化)という名前はそこからきているのでしょう。

直感的には、この書き直しは、サンプリングという微分ができない操作をパラメータθ\thetaとは関係のない部分に逃がしたものと言える。

Loading image...

θ\thetaxxが確率的な過程を経ずに繋がることで、微分ができるようになる。

また、具体例をもとに別の捉え方もしてみよう。y=f(x)y=f(x)xxについての微分は、「xxが少し違う値だった時にyyがその何倍変わっていたか」と捉えられる。これをサンプリングについても考えてみる。例えば、平均μ\muの正規分布から一つのサンプルxxを取得したとして、仮にμ\muが少しずれていた場合にxxがどれくらいずれていたかを考える。もしこれが分かれば、サンプリングという確率的な過程を微分できそう。すると、μ\muがずれることで正規分布はそのまま平行移動するだけなので、xxも同じ方向に同じ量だけずれていただろうと想像できる。μ\muが少しずれたときにxxも同じだけずれるとすると、この場合のxxμ\muに関する微分を1と定義できそう。

μx=1xN(μ,σ2)\begin{align} \nabla_\mu x &= 1 \\ x &\sim \mathcal N(\mu, \sigma^2) \end{align}

実際に、先のx~\tilde xμ\muについて微分すると1になるね。このように、分布のパラメータが確率変数に与える影響が比較的シンプルに表せるとき、このような再パラメータ化が可能になる。


では、このReparameterization Trickを用いて変分下界の期待値の項の微分を近似することを考えよう。期待値を次のように近似し、各パラメータで微分する。

Eqϕ(ZX)[lnpθ(XZ)]1Ll=1Llnpθ(XZ(l))Z(l)qϕ(ZX)\begin{align} \mathbb E_{q_\phi(Z|X)}[\ln p_\theta(X|Z)] &\approx \frac{1}{L} \sum_{l=1}^L \ln p_\theta(X|Z^{(l)}) \\ Z^{(l)} &\sim q_\phi(Z|X) \end{align}

θ\thetaに関する微分は素直にできるのでヨシ。ϕ\phiに関する微分はReparameterization Trickを使用する。Z(l)Z^{(l)}を再パラメータ化することでϕ\phiに関する微分を可能にする。

Z(l)=gϕ(ϵ,X)ϵp(ϵ)\begin{align} Z^{(l)} &= g_\phi(\epsilon, X) \\ \epsilon &\sim p(\epsilon) \end{align}

例えば、正規分布を仮定する場合はこう。

z(l)=μ^ϕ+σ^ϕϵRDzμ^ϕ,σ^ϕ=DNNϕ(x)RDzϵN(0,I)RDz\begin{align} \bm z^{(l)} &= \bm{\hat\mu}_\phi + \bm{\hat\sigma}_\phi \cdot \bm\epsilon \in\R^{D_z} \\ \bm{\hat\mu}_\phi, \bm{\hat\sigma}_\phi &= \text{DNN}_\phi(\bm x) \in \R^{D_z} \\ \bm\epsilon &\sim \mathcal N(\bm 0, I)\in \R^{D_z} \end{align}

これで、勾配をより正確に推定することが可能になった。実際に、1サンプルあたりのZZのサンプル数LLについて、論文では次のように述べられている。

In our experiments we found that the number of samples LL per datapoint can be set to 11 as long as the minibatch size MM was large enough, e.g. M=100M = 100.

バッチサイズがある程度大きければL=1L=1で十分な近似ができるらしい。すごいね。

📖

Reparameterization Trickによる推定量がスコア関数推定量より小さいな分散を持つことの具体的な説明や証明は論文に書かれていない。そのあたりの比較が気になる人は、以下の記事やその参考文献が参考になると思うので、読んでみて。

REINFORCE vs Reparameterization Trick – Syed Ashar Javed – Learning to learn


最後に変分下界の近似を整理する。バッチサイズをある程度大きくし、L=1L=1とすることを想定する。VAE学習の各ステップでは、得られたミニバッチの下で次の下界を求め、各パラメータθ\thetaϕ\phiの勾配を誤差逆伝播で計算する。

L(θ,ϕ)lnpθ(XZ)DKL[qϕ(ZX)p(Z)]Z=gϕ(ϵ,X)ϵp(ϵ)\begin{align} \mathcal L(\theta,\phi) &\approx \ln p_\theta(X|Z') - D_{KL}[q_\phi(Z|X) \| p(Z)] \\ Z' &= g_\phi(\epsilon, X) \\ \epsilon &\sim p(\epsilon) \end{align}

ここで、この算出過程をよく見ると、このモデルがオートエンコーダと見なせることがわかる。分かりやすく、ある一つのデータx(n)\bm x^{(n)}が得られた下での近似変分下界を定義し、算出の流れを見てみる。

L~(θ,ϕx(n))=lnpθ(x(n)z)DKL[qϕ(zx(n))p(z)]\begin{align} \tilde{\mathcal L}(\theta, \phi| \bm x^{(n)}) &= \ln p_\theta(\bm x^{(n)}|\bm z') - D_{KL}[q_\phi(\bm z|\bm x^{(n)}) \| p(\bm z)] \end{align}

特に一項目の条件付き対数尤度に着目する。この項は次の流れで算出される。

  1. DNNϕ\text{DNN}_\phix(n)\bm x^{(n)}を与えて事後分布のパラメータψ^ϕ\hat{\bm\psi}_\phiを取得
  2. Reparameterization Trickを用いてψ^ϕ\hat{\bm\psi}_\phiに従う確率分布p(z;ψ^ϕ)p(\bm z;\hat{\bm\psi}_\phi)からのサンプルz\bm z’を取得
  3. DNNθ\text{DNN}_\thetaz\bm z'を与えて条件付き分布のパラメータψ^θ\hat{\bm\psi}_\thetaを取得
  4. ψ^ϕ\hat{\bm\psi}_\phiの下でのx(n)\bm x^{(n)}の確率密度p(x=x(n);ψ^ϕ)p(\bm x=\bm x^{(n)}; \hat{\bm\psi}_\phi)を求め、対数に変換する

ここで、ステップ4で得られる条件付き対数尤度について考える。条件付き分布p(xz)p(\bm x|\bm z)に正規分布を仮定した場合、対数尤度は初めに与えたデータx(n)\bm x^{(n)}とその正規分布の平均μ^θ\hat{\bm\mu}_\thetaの負の二乗和誤差になる。なおこの平均μ^θ\hat{\bm\mu}_\thetaDNNθ\text{DNN}_\thetaが出力するベクトルそのものである。

lnpθ(x(n)z)=lnN(x(n);μ^θ,I)=x(n)μ^θ2+const\begin{align} \ln p_\theta(\bm x^{(n)}|\bm z') &= \ln \mathcal N(\bm x^{(n)}; \hat{\bm\mu}_\theta, I) \\ &= -\|\bm x^{(n)} - \bm{\hat\mu}_\theta \|^2 + \text{const} \\ \end{align}

次に、条件付き分布にベルヌーイ分布を仮定した場合でも考えてみる。この場合の対数尤度は、初めに与えたデータx(n)\bm x^{(n)}とそのベルヌーイ分布のパラメータλ^θ\hat{\bm\lambda}_\thetaの負のバイナリ交差エントロピー誤差になる。このパラメータλ^θ\bm{\hat\lambda}_\thetaDNNθ\text{DNN}_\thetaが出力するベクトルそのものである。

lnpθ(x(n)z)=lnBernoulli(x(n);λ^θ)=i=1Dx(xi(n)lnλ^θ,i+(1xi(n))ln(1λ^θ,i))\begin{align} \ln p_\theta(\bm x^{(n)}|\bm z') &= \ln \text{Bernoulli}(\bm x^{(n)}; \hat{\bm\lambda}_\theta) \\ &= \sum_{i=1}^{D_x} (x_i^{(n)} \ln \hat\lambda_{\theta,i} + (1 - x_i^{(n)})\ln (1 - \hat\lambda_{\theta,i})) \end{align}

DNNθ\text{DNN}_\thetaから得られるデータをx^\hat{\bm x}と表すことにしよう。今までψ^θ\hat{\bm\psi}_\thetaと表していたやつだね。するとステップ4では、(基本的なモデル化の下では、)適当な距離関数を用いてx(n)\bm x^{(n)}x^\hat{\bm x}の誤差を求めていることになる。これは再構成誤差と呼べる。このステップ4を踏まえると、ステップ1から4の流れは、与えられたデータを一度低次元の潜在表現に変換したのち、そこから元のデータを復元するように見える。

Loading image...

そしてこの流れは正にオートエンコーダである。変分オートエンコーダという名前はここから来ている。またここから、分布の記述に用いるDNNはエンコーダ・デコーダと呼ばれる。DNNϕ\text{DNN}_\phiがエンコーダ、DNNθ\text{DNN}_\thetaがデコーダということ。

また変分下界の二項目のKL情報量は、エンコーダが出力する事後分布のパラメータψ^ϕ\hat{\bm\psi}_\phi を調整している。これは正則化項とも呼ばれ、エンコーダを介して得られる潜在変数が指定した分布に従うような調整を行う。

深層学習モデルの学習は、通常、目的関数を最小化の対象として記述し、勾配降下法による最小化を行う。VAEの目的関数を最小化の目標として記述し直すと負の変分下界となり、それを構成する二つの項はオートエンコーダに倣うと次のように呼べる。

L~(θ,ϕx(n))=lnpθ(x(n)z)再構成誤差+DKL[qϕ(zx(n))p(z)]正則化項\begin{align} -\tilde{\mathcal L}(\theta, \phi| \bm x^{(n)}) &= \underbrace{-\ln p_\theta(\bm x^{(n)}|\bm z')}_{再構成誤差} + \underbrace{D_{KL}[q_\phi(\bm z|\bm x^{(n)}) \| p(\bm z)]}_{正則化項} \end{align}

このことから、VAEは潜在変数を指定した分布に制限したオートエンコーダと見ることができる。

💡

VAEを初めからオートエンコーダとして捉え、出力から入力まで勾配を届けるためにReparameterization Trickを使う、という説明をよく見るが、これはあくまでも簡略化した説明で、論文に従うならばその逆が正しい説明である。期待値の勾配を求めたいが、従来の手法では分散が大きいため、Reparameterization Trickという手法を提案し、その結果、学習プロセスがオートエンコーダに見えるようになった、というのが論文の流れになる。

生成モデルとしてのVAE

VAEの学習では変分下界の最大化を目指すが、そのモチベーションは以下であった。

  1. 尤度pθ(X)p_\theta(X)を大きくするθ\thetaを求める
  2. その下での事後分布pθ(ZX)p_\theta(Z|X)を求める

この目標を一つにまとめたものが変分下界の最大化だったね。

maxθ,ϕL(θ,ϕ)=maxθ,ϕ(lnpθ(X)DKL[qϕ(ZX)pθ(ZX)])\begin{align} \max_{\theta, \phi} \mathcal L(\theta, \phi) = \max_{\theta, \phi} \Big( \ln p_\theta(X) - D_{KL}[q_\phi(Z|X)\|p_\theta(Z|X)] \Big) \end{align}

対数尤度が一つ目の目標、KL情報量が二つ目の目標に対応する。ではここで、「生成モデルだけが欲しい」という状況を考えてみる。生成モデルの学習時に気にするのは尤度の大きさのみなので、二つ目の目標は無くなる。

maxθlnpθ(X)\begin{align} \max_\theta \ln p_\theta(X) \end{align}

しかしこの場合でも目的関数は変分下界のままである。下界を二種類のパラメータθ,ϕ\theta, \phiについて最大化することで間接的な対数尤度の最大化を図る。理由はごく単純で、対数尤度を直接大きくする方法がないから。


さて、対数尤度は手に負えないけど下界なら扱えるという点は一旦納得するとして、果たしてその下界の最大化は本当に対数尤度の最大化と繋がるのだろうか?下界はあくまでも二つの目標をまとめたもので、片方が実現できなくてももう片方が強く実現されていれば全体としては達成される。要は、仮に対数尤度が減少していても、その減少幅を負のKL情報量の増加幅が上回っていればそれらの和である下界は大きくなるということ。つまり下界を大きくしても対数尤度が大きくなっているとは限らない。

Loading image...

また、lnpθ(X)L(θ,ϕ)\ln p_\theta(X) \geq \mathcal L(\theta, \phi)という関係性を用いた、「下からの評価を最大化することで間接的に対数尤度を最大化する」という説明もよく見られるが、やはりこれも下界の最大化と対数尤度の最大化が繋がることは示しておらず、依然として腑に落ちない。「多くの場合で成り立っているので経験則的に成り立つ」という説明はまだ納得感があるものの、できることならそれを数学的に示したいものである。ということで、本章ではそれを示そうと思う。


対数尤度の微分を見てみよう。

θlnpθ(X)=1pθ(X)θpθ(X)\begin{align} \nabla_\theta \ln p_\theta(X) &= \frac{1}{p_\theta(X)} \nabla_\theta p_\theta(X) \end{align}

微分を整理する

θpθ(X)=θZpθ(X,Z)dZ=Zθpθ(X,Z)dZ\begin{align} \nabla_\theta p_\theta(X) &= \nabla_\theta \int_Z p_\theta(X,Z) \, dZ \\ &= \int_Z \nabla_\theta p_\theta(X,Z) \, dZ \end{align}

さてここで、

θlnpθ(X,Z)=1pθ(X,Z)θpθ(X,Z)pθ(X,Z)θlnpθ(X,Z)=θpθ(X,Z)\begin{align} \nabla_\theta \ln p_\theta(X, Z) &= \frac{1}{p_\theta(X, Z)} \nabla_\theta p_\theta(X, Z) \\ p_\theta(X, Z) \nabla_\theta \ln p_\theta(X, Z) &= \nabla_\theta p_\theta(X, Z) \end{align}

より、こうなる。

θpθ(X)=Zpθ(X,Z)θlnpθ(X,Z)dZ\begin{align} \nabla_\theta p_\theta(X) &= \int_Z p_\theta(X, Z) \nabla_\theta \ln p_\theta(X, Z) \, dZ \end{align}

これを代入すると

θlnpθ(X)=1pθ(X)Zpθ(X,Z)θlnpθ(X,Z)dZ=Zpθ(X,Z)pθ(X)θlnpθ(X,Z)dZ=Zpθ(ZX)θlnpθ(X,Z)dZ=Epθ(ZX)[θlnpθ(X,Z)]\begin{align} \nabla_\theta \ln p_\theta(X) &= \frac{1}{p_\theta(X)} \int_Z p_\theta(X, Z) \nabla_\theta \ln p_\theta(X, Z) \, dZ \\ &= \int_Z \frac{p_\theta(X, Z)}{p_\theta(X)} \nabla_\theta \ln p_\theta(X, Z) \, dZ \\ &= \int_Z p_\theta(Z|X) \nabla_\theta \ln p_\theta(X, Z) \, dZ \\ &= \mathbb E_{p_\theta(Z|X)} [\nabla_\theta \ln p_\theta(X,Z)] \end{align}

同時分布の勾配の期待値になった。対数尤度の微分なので、これが対数尤度を大きくするパラメータθ\thetaの方向ということになる。

さて今度は、変分下界を大きくするパラメータθ\thetaの方向を見てみよう。まず下界を少し変形する。

L(θ,ϕ)=Zqϕ(ZX)lnpθ(X,Z)qϕ(ZX)dZ=Zqϕ(ZX)lnpθ(X,Z)dZZqϕ(ZX)lnqϕ(ZX)dZ\begin{align} \mathcal L(\theta,\phi) &= \int_Z q_\phi(Z|X)\ln\frac{p_\theta(X,Z)}{q_\phi(Z|X)}dZ \\ &= \int_Z q_\phi(Z|X)\ln p_\theta(X,Z)\,dZ - \int_Z q_\phi(Z|X)\ln q_\phi(Z|X)\,dZ \end{align}

これをθ\thetaで偏微分すると

θL(θ,ϕ)=θZqϕ(ZX)lnpθ(X,Z)dZ=Zqϕ(ZX)θlnpθ(X,Z)dZ=Eqϕ(ZX)[θlnpθ(X,Z)]\begin{align} \nabla_\theta \mathcal L(\theta,\phi) &= \nabla_\theta \int_Z q_\phi(Z|X)\ln p_\theta(X,Z)\,dZ \\ &= \int_Z q_\phi(Z|X) \nabla_\theta \ln p_\theta(X,Z)\,dZ \\ &= \mathbb E_{q_\phi(Z|X)} [\nabla_\theta \ln p_\theta(X,Z)] \end{align}

こちらも同時分布の勾配の期待値になった。これらを並べてみよう。

θlnpθ(X)=Epθ(ZX)[θlnpθ(X,Z)]θL(θ,ϕ)=Eqϕ(ZX)[θlnpθ(X,Z)]\begin{align} \nabla_\theta \ln p_\theta(X) &= \mathbb E_{p_\theta(Z|X)} [\nabla_\theta \ln p_\theta(X,Z)] \\ \nabla_\theta \mathcal L(\theta,\phi) &= \mathbb E_{q_\phi(Z|X)} [\nabla_\theta \ln p_\theta(X,Z)] \end{align}

どちらも同時分布の勾配の期待値であるが、確率分布が異なることがわかる。対数尤度の勾配はθ\thetaの下での真の事後分布pθ(ZX)p_\theta(Z|X)、下界の勾配は近似事後分布qϕ(ZX)q_\phi(Z|X)。もし近似事後分布が真の事後分布と完全に一致していれば、当然これらの勾配も一致する。つまりその地点において下界を大きくする方向が対数尤度を大きくする方向と完全に一致する。実際その場合のKL情報量は0になるので、対数尤度=下界が成り立つ。

近似事後分布が真の事後分布と完全に一致していなくとも、それらがある程度近ければ、これらの勾配もある程度近い値になるだろうと考えられる。つまり下界を大きくする方向にθ\thetaを動かせば、対数尤度もそれなりに大きくなることが期待できる。反対に、近似事後分布が真の事後分布から離れている場合はそれらの勾配も離れるだろうと予想できる。つまり、下界を大きくする方向にθ\thetaを動かしても対数尤度が大きくならない可能性が高くなる。

以上を踏まえ、下界 L(θ,ϕ)\mathcal L(\theta,\phi)θ\thetaϕ\phiについて更新するとどのようなことが起こるかを考えてみる。θ,ϕ\theta, \phiをランダムに初期化した場合、初めからϕ\phiによる事後分布の近似精度が良いことはなかなかないだろう。事後分布の近似精度が悪い場合、下界の勾配と対数尤度の勾配が揃いづらい。つまり学習が開始された初期の段階では、下界を更新しても対数尤度lnpθ(X)\ln p_\theta(X)はあまり上昇しないと予想できる。

ではKL情報量DKL[qϕ(ZX)pθ(ZX)]D_{KL}[q_\phi(Z|X)\|p_\theta(Z|X)]はどうだろう。下界の中でϕ\phiが関わっているのはこの項だけなので、少なくともϕ\phiの勾配はこのKL情報量を小さくする方向に向いていると言える。問題はθ\thetaも同時に更新されることであるが、θ\thetaに関する勾配もある程度はこのKL情報量を小さくする方向を向いているはずである。対数尤度の勾配がどれだけKL情報量の最小化を邪魔するかは分からないが、ϕ\phiによる更新を完全に打ち消すような影響を毎ステップで与えられるとは考えづらく、更新を繰り返すことでKL情報量の最小化は徐々に達成されていくと考えられる。

KL情報量がある程度小さくなる、すなわち事後分布の近似精度がある程度向上すれば、下界の勾配と対数尤度の勾配が同じ方向を向くことになり、下界の最大化を通じた対数尤度の最大化が実現されるようになる。これが、下界の最大化が対数尤度を大きする説明である。下界の最大化を開始すると、学習初期の段階でこそ対数尤度は上昇しないが、次第に事後分布の近似精度が上がり、対数尤度が上昇するようになる。

VAEにおいて、対数尤度の最大化+事後分布の近似推論を目指す場合でも、対数尤度の最大化のみを目指す場合でも、やることは変わらず下界の最大化であることが説明できた。

VAEの実装

実際に適当なデータを用いてVAEを学習させ、生成モデルを獲得しよう。

MNIST手書き数字画像

MNIST手書き数字画像を学習させ、手書き数字画像の生成モデルを作る。MNIST手書き数字は以下のような画像データ。

Loading image...

実装にあたり、具体的なモデル化を行う必要がある。次のモデルを具体的に定義する。

  • 事前分布p(z)p(\bm z)
  • 事後分布qϕ(zx)q_\phi(\bm z|\bm x)
  • 条件付き分布pθ(xz)p_\theta(\bm x|\bm z)

モデル化の章でも述べた通り、事前分布には特に理由もなく標準正規分布を仮定する。また変分下界のKL情報量の計算を楽にしたいので、事後分布にも正規分布を仮定する。

条件付き分布について、今回は、手書き数字画像の各ピクセルが黒か白の二値であると仮定し、ベルヌーイ分布を仮定する。実際はその間の色も多く含まれているが、手書き数字画像における各ピクセルの本質的な情報は「そのピクセルに線が引かれているかどうか」というbooleanなものであるため、二値とみなしてしまう。なお実際に二値に変換するわけではない。あくまでもそう見なすだけ。0と1の間の値でもベルヌーイ分布の確率密度はそれっぽく求められるので、別にそれでいい。

ということでモデル化まとめ。

p(z)=N(0,I)qϕ(zx)=N(μ^ϕ,σ^ϕ2I)whereμ^ϕ,σ^ϕ=DNNϕ(x)pθ(xz)=Bernoulli(λ^θ)whereλ^θ=DNNθ(z)\begin{align} p(\bm z) &= \mathcal N(\bm 0, I) \\ q_\phi(\bm z|\bm x) &= \mathcal N(\hat{\bm\mu}_\phi, \hat{\bm\sigma}_\phi^2I) \quad \text{where} \quad \hat{\bm\mu}_\phi, \hat{\bm\sigma}_\phi = \text{DNN}_\phi(\bm x) \\ p_\theta(\bm x|\bm z) &= \text{Bernoulli}(\hat{\bm\lambda}_\theta) \quad \text{where} \quad \hat{\bm\lambda}_\theta = \text{DNN}_\theta(\bm z') \end{align}

ではこれを実装していこう。まずはエンコーダから。なお本章で実装するニューラルネットのネットワーク構造は論文の実験で使用されたものと同じ。

class Encoder(nn.Module):
    def __init__(self, w, h, h_dim, z_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(w * h, h_dim),
            nn.Tanh(),
            nn.Linear(h_dim, z_dim * 2)
        )
 
    def forward(self, x):
        x = x.view(len(x), -1)
        params = self.net(x)
        mu, log_sigma = params.chunk(2, dim=-1)
        return mu, log_sigma

画像を受け取って正規分布のパラメータμ^ϕ,σ^ϕ\hat{\bm\mu}_\phi, \hat{\bm\sigma}_\phiを出力するモデルを適当なニューラルネットで定義した。なおσ^\hat{\bm\sigma}の非負性を満たすことが難しいため、対数領域で出力している。後で元に戻せばいい。

次にデコーダ。

class Decoder(nn.Module):
    def __init__(self, w, h, h_dim, z_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(z_dim, h_dim),
            nn.Tanh(),
            nn.Linear(h_dim, w * h),
            nn.Sigmoid(),
        )
        self.w = w
        self.h = h
 
    def forward(self, z):
        x_hat = self.net(z)
        x_hat = x_hat.view(-1, 1, self.w, self.h)
        return x_hat

出力されるx_hatλ^θ\hat{\bm\lambda}_\thetaってこと。

最後にこれをまとめたモデルVAEを実装する。

class VAE(nn.Module):
    def __init__(self, w, h, h_dim, z_dim):
        super().__init__()
        self.encoder = Encoder(w, h, h_dim, z_dim)
        self.decoder = Decoder(w, h, h_dim, z_dim)
 
    @staticmethod
    def reparameterization(mu, log_sigma):
        eps = torch.randn_like(mu)
        z = mu + torch.exp(log_sigma / 2) * eps
        return z
 
    def forward(self, x):
        mu, log_sigma = self.encoder(x)
        z = self.reparameterization(mu, log_sigma)
        x_hat = self.decoder(z)
        return x_hat, mu, log_sigma

エンコーダで事前分布のパラメータを求め、Reparameterization Trickで潜在変数zz'をサンプリングし、デコーダでx^\hat{\bm x}を得る。最終的に得られたx^\hat{\bm x}に加え、lossの計算に必要なμ^ϕ\hat{\bm\mu}_\phiσ^ϕ\hat{\bm\sigma}_\phiも返す。

ではこれを実際に学習していく。まず損失関数を定義する。負の変分下界がこちら。

L~(θ,ϕx(n))=lnpθ(x(n)z)+DKL[qϕ(zx(n))p(z)]\begin{align} -\tilde{\mathcal L}(\theta, \phi| \bm x^{(n)}) &= -\ln p_\theta(\bm x^{(n)}|\bm z') + D_{KL}[q_\phi(\bm z|\bm x^{(n)}) \| p(\bm z)] \end{align}

再構成誤差はこうなる。バイナリ交差エントロピー。

lnpθ(x(n)z)=Bernoulli(x(n);λ^θ)=i=1Dx(xi(n)lnλ^θ,i+(1xi(n))ln(1λ^θ,i))\begin{align} -\ln p_\theta(\bm x^{(n)}|\bm z') &= -\text{Bernoulli}(\bm x^{(n)}; \hat{\bm\lambda}_\theta) \\ &= -\sum_{i=1}^{D_x} (x_i^{(n)} \ln \hat\lambda_{\theta,i} + (1 - x_i^{(n)})\ln (1 - \hat\lambda_{\theta,i})) \end{align}

で、KL情報量はこう。

DKL[qϕ(zx(n))p(z)]=12i=1Dz(1+lnσϕ,i2σϕ,i2μϕ,i2)\begin{align} D_{KL}[q_\phi(\bm z|\bm x^{(n)}) \| p(\bm z)] &= \frac{1}{2} \sum_{i=1}^{D_z} (1 + \ln \sigma_{\phi,i}^2 - \sigma_{\phi,i}^2 - \mu_{\phi,i}^2) \end{align}

多変量正規分布同士のKL情報量が以下であることを用いた。

DKL[q(x)p(x)]=12(logΣpΣq+tr(Σp1Σq)+(μqμp)Σp1(μqμp)D)p(x)=N(μp,Σp)q(x)=N(μq,Σq)\begin{align} D_{KL}[q(\bm x)\|p(\bm x)] &= \frac{1}{2} \left( \log \frac{|\Sigma_p|}{|\Sigma_q|} + \text{tr} (\Sigma_p^{-1}\Sigma_q) + (\bm{\mu}_q - \bm{\mu}_p)^\top \Sigma_p^{-1} (\bm{\mu}_q - \bm{\mu}_p) - D \right) \\ p(\bm x) &= \mathcal N(\bm\mu_p, \Sigma_p) \\ q(\bm x) &= \mathcal N(\bm\mu_q, \Sigma_q) \\ \end{align}

ということで、損失関数は以下。

L~(θ,ϕx(n))=lnpθ(x(n)z)+DKL[qϕ(zx(n))p(z)]=i=1Dx(xi(n)lnλ^θ,i+(1xi(n))ln(1λ^θ,i))12i=1Dz(1+lnσϕ,i2σϕ,i2μϕ,i2)\begin{align} -\tilde{\mathcal L}(\theta, \phi| \bm x^{(n)}) &= -\ln p_\theta(\bm x^{(n)}|\bm z') + D_{KL}[q_\phi(\bm z|\bm x^{(n)}) \| p(\bm z)] \\ &= -\sum_{i=1}^{D_x} (x_i^{(n)} \ln \hat\lambda_{\theta,i} + (1 - x_i^{(n)})\ln (1 - \hat\lambda_{\theta,i})) \notag\\ &\quad\, - \frac{1}{2} \sum_{i=1}^{D_z} (1 + \ln \sigma_{\phi,i}^2 - \sigma_{\phi,i}^2 - \mu_{\phi,i}^2) \end{align}

これを実装するとこうなる。

def loss_fn_bernoulli(x_hat, x_sample, mu, log_sigma):
    loss_recons = F.binary_cross_entropy(x_hat, x_sample, reduction="sum")
    loss_reg = -0.5 * (1 + log_sigma - log_sigma.exp() - mu ** 2).sum()
    loss = loss_recons + loss_reg
    return loss    

正則化項の1はパラメータに依らない定数項なので、消しても学習結果は変わらない。

ではこれを用いて学習ループを書いていく。

def train_mnist(model, optimizer, n_epochs):
    model.train()
    prog.start(
        n_iter=len(train_mnist_dataloader),
        n_epochs=n_epochs,
    )
    for _ in range(n_epochs):
        for (x, _) in train_mnist_dataloader:
            x_hat, mu, log_sigma = model(x)
            loss = loss_fn_bernoulli(x_hat, x, mu, log_sigma)
            loss.backward()
            optimizer.step()
            optimizer.zero_grad()
            prog.update(loss.item())

学習させてみる。z\bm zの次元数DzD_zは2にする。隠れ状態の次元数は論文に倣って500。

h_dim, z_dim = 500, 2
vae = VAE(w_mnist, h_mnist, h_dim, z_dim)
optimizer = optim.Adam(vae.parameters())
train_mnist(vae, optimizer, 5)
1/5: ########## 100% [00:00:05.49] loss: 18539.47030 
2/5: ########## 100% [00:00:05.28] loss: 16925.79591 
3/5: ########## 100% [00:00:04.98] loss: 16501.74070 
4/5: ########## 100% [00:00:05.21] loss: 16237.67862 
5/5: ########## 100% [00:00:05.93] loss: 15997.84893  

性能を確かめてみよう。まずは再構成誤差。

Loading image...

一段目が入力画像x\bm x、二段目が再構成画像x^\hat{\bm x}、三段目が差分xx^|\bm x - \hat{\bm x}|。入力画像をよく再現できていることがわかる。ちなみに潜在変数をより高次元にするとこの精度が上がる。例えばDz=20D_z=20で学習させるとこんな感じ。

Loading image...

線がくっきりになった。差分を見ても精度向上が感じられる。

次に潜在変数の分布を見てみる。エンコーダが潜在空間をしっかり学習できているかどうか。エンコーダにテストデータを与え、得られたパラメータとReparameterization Trickを用いてzR2\bm z'\in\R^2を取得し、それらを座標平面にプロットする。

Loading image...

円は標準正規分布を表していて、内側からσ\sigma2σ2\sigma3σ3\sigmaのライン。潜在変数がいい感じにこの範囲に収まっていることがわかる。

最後に生成性能を見てみよう。事前分布p(z)p(\bm z)から潜在変数z\bm z'をサンプリングし、デコーダで復元された画像x^\hat{\bm x}を取得する。これをそのまま画像と見立てて表示する。

Loading image...

数字がしっかり生成できている。ただ少し薄いので、はっきりとした白黒の学習がやや不十分かも。

FreyFace顔画像

次はFreyFaceという顔画像のデータセットを学習させてみる。

Loading image...

Brendan Freyというコンピュータサイエンスの研究者の顔画像が1965枚含まれている。もともとは一つの動画で、顔の向きや表情の連続的な変化が表されている。

Loading image...

ではモデル化していく。MNISTと同じ白黒画像であるが、今回はベルヌーイ分布ではなく正規分布を仮定する。手書き数字と違い、グレーが意味を成すので二値と見なすことはできない。なおそれ以外の分布はMNISTと同じものを使う。

p(z)=N(0,I)qϕ(zx)=N(μ^ϕ,σ^ϕ2I)whereμ^ϕ,σ^ϕ=DNNϕ(x)pθ(xz)=N(μ^θ,I)whereμ^θ=DNNθ(z)\begin{align} p(\bm z) &= \mathcal N(\bm 0, I) \\ q_\phi(\bm z|\bm x) &= \mathcal N(\hat{\bm\mu}_\phi, \hat{\bm\sigma}_\phi^2I) \quad \text{where} \quad \hat{\bm\mu}_\phi, \hat{\bm\sigma}_\phi = \text{DNN}_\phi(\bm x) \\ p_\theta(\bm x|\bm z) &= \mathcal N(\hat{\bm\mu}_\theta, I) \quad \text{where} \quad \hat{\bm\mu}_\theta = \text{DNN}_\theta(\bm z') \end{align}

またこれに伴い損失関数も変化する。再構成誤差が二乗和誤差になるので

lnpθ(x(n)z)=lnN(x(n);μ^θ,I)=x(n)μ^θ2+const\begin{align} -\ln p_\theta(\bm x^{(n)}|\bm z') &= -\ln \mathcal N(\bm x^{(n)}; \hat{\bm\mu}_\theta, I) \\ &= \|\bm x^{(n)} - \bm{\hat\mu}_\theta \|^2 + \text{const} \end{align}

損失関数はこうなる。

L~(θ,ϕx(n))=lnpθ(x(n)z)+DKL[qϕ(zx(n))p(z)]=x(n)μ^θ212i=1Dz(1+lnσϕ,i2σϕ,i2μϕ,i2)\begin{align} -\tilde{\mathcal L}(\theta, \phi| \bm x^{(n)}) &= -\ln p_\theta(\bm x^{(n)}|\bm z') + D_{KL}[q_\phi(\bm z|\bm x^{(n)}) \| p(\bm z)] \\ &= \|\bm x^{(n)} - \bm{\hat\mu}_\theta \|^2 - \frac{1}{2} \sum_{i=1}^{D_z} (1 + \ln \sigma_{\phi,i}^2 - \sigma_{\phi,i}^2 - \mu_{\phi,i}^2) \end{align}

実装はこう。

def loss_fn_gaussian(x_hat, x_sample, mu, log_sigma):
    loss_recons = F.mse_loss(x_hat, x_sample, reduction="sum")
    loss_reg = -0.5 * (1 + log_sigma - log_sigma.exp() - mu ** 2).sum()
    loss = loss_recons + loss_reg
    return loss

これで学習させよう。z\bm zの次元数はMNISTと同じく2、隠れ状態の次元数は論文に倣って200。

def train_ff(model, optimizer, dataloader, n_epochs):
    model.train()
    prog.start(
        n_iter=len(dataloader),
        n_epochs=n_epochs,
        unit=10
    )
    for _ in range(n_epochs):
        for x in dataloader:
            x_hat, mu, log_sigma = model(x)
            loss = loss_fn_gaussian(x_hat, x, mu, log_sigma)
            loss.backward()
            optimizer.step()
            optimizer.zero_grad()
            prog.update(loss.item())
 
h_dim, z_dim = 200, 2
vae = VAE(w_ff, h_ff, h_dim, z_dim)
optimizer = optim.Adam(vae.parameters())
n_epochs = 100
train_ff(vae, optimizer, train_ff_dataloader, n_epochs)
      1-10/100: ########## 100% [00:00:00.62] loss: 759.44665  
     11-20/100: ########## 100% [00:00:00.66] loss: 606.75987 
     21-30/100: ########## 100% [00:00:00.66] loss: 597.24245 
     31-40/100: ########## 100% [00:00:00.60] loss: 590.55408 
     41-50/100: ########## 100% [00:00:00.60] loss: 586.12630 
     51-60/100: ########## 100% [00:00:00.63] loss: 579.69846 
     61-70/100: ########## 100% [00:00:00.62] loss: 579.20032 
     71-80/100: ########## 100% [00:00:00.61] loss: 575.86836 
     81-90/100: ########## 100% [00:00:00.95] loss: 575.94081 
    91-100/100: ########## 100% [00:00:00.73] loss: 574.18849 

データ数が少ないのでMNISTより多めに学習させた。再構成誤差はこんな感じ。

Loading image...

潜在変数の分布はこんな感じ。

Loading image...

生成性能はこんな感じ。こちらもデコーダから得られたx^\hat{\bm x}をそのまま表示している。

Loading image...

いずれもいい感じなのではなかろうか。

潜在空間の可視化

学習した潜在空間を視覚的に表してみる。

MNISTとFreyFaceの潜在変数の分布を見比べてみると、MNISTの方が少し汚く見える。

Loading image...

これは、MNISTの各画像が文字(数字)という離散的なクラスに属しており、その滑らかな変化が捉えづらいためである。分布に色をつけてみるとわかりやすい。

Loading image...

同じ数字が近い位置に固まっているのがわかる。一方でFreyFaceは元が動画であり、変化が連続的であるため、比較的滑らかな分布が得られる。

もう少し具体的に、潜在空間内の1点がどのような画像に対応しているかを見てみる。適当な範囲から等間隔に潜在変数をサンプリングし、

Loading image...

これらに対応する画像をデコーダで復元する。

Loading image...

数字ごとに先の散布図が示す位置に固まっており、それらの間はそのどちらとも言えるような中途半端な数字となっている。

FreyFaceではこんな感じ。

Loading image...

こちらは、横軸が顔の向き、縦軸が表情という非常に解釈しやすい結果になった。

このような滑らかな潜在空間が獲得できることはVAEの大きな強みであり、様々なアプリケーションが提案されている。

オワリ

この記事を書くのにかかった期間は3週間ほどですが、この説明を得るのにかかった期間は2年半です。ずっと納得のいく理解ができず、挑んでは敗北してを繰り返していました。特に時間がかかったのは「生成モデルとしてのVAE」で書いた内容ですね。下界の最大化が尤度の最大化と繋がる理由が最後まで納得できませんでした。そんな中、最近、とあるLLMとの会話を通じてようやく納得のいく説明が得られたので、記事にまとめてみました。せっかくなのでその会話ログも共有しておきます: https://mule.forbital.com/chat/8b628cd4-eba4-4169-8030-6a5ca71ed433

例によってこの記事には私の個人的な解釈・思想が多く含まれているため、心から納得した人は少ないと思いますが、少しでも理解の手助けになっていたら嬉しいですね。ここまで読んでいただきありがとうございました。

使用したコードはこちらから: https://github.com/misya11p/article-codes/blob/main/vae/code.ipynb

参考

  1. Kingma, Diederik P., and M. Welling. "Auto-Encoding Variational Bayes." International Conference on Learning Representations, 2013.
  2. 齋藤康毅. ゼロから作るDeep Learning ❺ ―生成モデル編. オライリー・ジャパン, 2024.
  3. zuka. “【徹底解説】VAEをはじめからていねいに”. Academaid. 2023-07-08. https://academ-aid.com/ml/vae, (参照: 2025-07-09).