機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

ボルツマンマシンについて勉強した その1

はじめに

ボルツマンマシンについて勉強したからメモ.きっかけは離散変数をつかったVAEの論文を掘っていったら出会ったから.教科書としては以下の2冊を使った(ボルツマンマシンに関して内容はモロ被りなので好み).

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

ここでは隠れ変数無し,あり2種類のボルツマンマシンの学習方程式の導出まで.

ボルツマンマシン(隠れ変数無し)

ボルツマンマシンは生成モデルの一つであり,無向グラフに対応した確率モデル.各ノードが確率変数x_iを持っており,エッジは重みw_{ij}を持つ.ただし,無向グラフなためw_{ij}=w_{ji}が成り立ち,自分自身とのコネクションは無し( w_{ii}=0).

ボルツマンマシンの表現には様々なものがあるが,まずは隠れ変数が無く確率変数x=[x_1,...,x_M]が2値(x\in\{0,1\})のボルツマンマシンを考える.ボルツマンマシンのモデルパラメータを\thetaとすると以下のように記述される.

 \displaystyle
p(x|\theta)=\frac{\exp(-\Phi(x,\theta))}{Z(\theta)} \\ \displaystyle
Z(\theta) = \sum_x\exp(-\Phi(x,\theta))

\Phi(x,\theta)はエネルギー関数と呼ばれるもので以下の形を取る.

 \displaystyle
\Phi(x,\theta)=-\sum_ib_ix_i-\sum_{(i,j)\in\varepsilon}w_{ij}x_ix_j \\ \displaystyle
=-\mathbf{b}'\mathbf{x}-\frac{1}{2}\mathbf{x}'\mathbf{W}\mathbf{x}

\varepsilonはエッジの集合.2行目の式は内積を用いて書き直したもので,第2項は重み行列\mathbf{W}が対称行列であり変数の順序は考えない(w_{ij}x_ix_j=w_{ji}x_jx_i)ことと,対角成分が0であることを利用した.ただし,転置記号にx'を用いて,ベクトルを小文字のボールド体,行列を大文字のボールド体で記述してる. また,ベクトルは基本的に列ベクトルを考え,行ベクトルは列ベクトルの転置としている.

Z(\theta)は規格化定数でP(x|\theta)xに対する和を1にしている.そのため,Z(\theta)の右辺にある和は全てのxに関する話になるので陽に書き下すと以下のようになる.

 \displaystyle
Z(\theta)=\sum_{x_1=0,1}...\sum_{x_M=0,1}\exp(-\Phi(x,\theta))

上記式から分かるように,Z(\theta)2^M要素の和から成り立つ.

ボルツマンマシン(隠れ変数あり)

次に隠れ変数がある場合について.観測された変数を持つノードだけでなく,隠れ変数を持つノードが存在するグラフを考える.隠れ変数は内部状態を表すものなので観測データには関係がない.ここで観測データに対応した変数を可視変数v=(v_1,v_2,...)とし,隠れ変数をh=(h_1,h_2,...)とする. ここでこの二つの変数を一つにまとめたx=(v_1,v_2,...,h_1,h_2,...)を導入すると,隠れ変数があるボルツマンマシンのエネルギー関数は隠れ変数が無い場合と同様に記述可能.

\displaystyle
\Phi(v,h,\theta)=\Phi(x,\theta)=-\mathbf{b}'\mathbf{x}-\frac{1}{2}\mathbf{x}'\mathbf{W}\mathbf{x}

xを使わず陽に書き表すと,

\displaystyle
\Phi(v,h,\theta)=-\mathbf{b}'\mathbf{v}-\mathbf{c}'\mathbf{h}-\frac{1}{2}\mathbf{v}'\mathbf{U}\mathbf{v}-\frac{1}{2}\mathbf{h}'\mathbf{V}\mathbf{h}-\mathbf{v}'\mathbf{W}\mathbf{h}

となる.ただし,可視変数と隠れ変数に対し別々にモデルパラメータを定義した.また最後の項に\frac{1}{2}がかかっていないのはw_{ij}v_ih_j\neq w_{ji}h_iv_jであるため. エネルギー関数が定義できたのでモデル分布は

\displaystyle
P(v,h|\theta)=\frac{\exp(-\Phi(v,h,\theta))}{Z(\theta)}

となる.

ここで,隠れ変数を積分消去した周辺分布について考える.周辺分布は

\displaystyle
P(v|\theta)=\sum_hP(v,h|\theta)=\frac{1}{Z(\theta)}\sum_h\exp(-\Phi(v,h,\theta))

となる.ここで式の見通しをよくするため,この周辺分布に対するエネルギー関数を以下の形で表現する.

\displaystyle
\tilde{\Phi}(v,\theta)=-\log\sum_h\exp(-\Phi(v,h,\theta))

すると周辺分布は

\displaystyle
P(v|\theta)=\frac{1}{Z(\theta)}\exp(\log(\sum_h\exp(-\Phi(v,h,\theta))))=\frac{\exp(-\tilde{\Phi}(v,\theta))}{Z(\theta)}

と表現でき見通しがよくなる.

学習について(隠れ変数無し)

最尤推定による学習について考える.対数尤度関数をL(\theta)=\sum_n\log P(v^{(n)}|\theta)とする.ただし,nはサンプル数.最尤推定は尤度の最大化なので\mathrm{arg}\max_\theta L(\theta)を解くことになる. よってパラメータ\thetaに関する微分に関する方程式\partial L(\theta)/\partial\theta =0の解を求めれば良い.バイアスb_iに関する微分を計算すると,

\displaystyle
\frac{\partial}{\partial b_i}\sum_n\log P(v^{(n)}|\theta) \\ \displaystyle
= \frac{\partial}{\partial b_i}\sum_n(\log(\exp(-\Phi(v,\theta)))-\log Z(\theta)) \\ \displaystyle
= \sum_nv^{(n)}_i-\sum_n\frac{1}{Z(\theta)}\sum_vv_i\exp(-\Phi(v,\theta)) \\ \displaystyle
= \sum_nv^{(n)}_i-N\sum_vP(v|\theta)v_i

正規化定数はサンプルに依存しないため\sum_nがサンプル数N倍としてかける. ここで両辺をサンプル数Nで割ると,

\displaystyle
\frac{1}{N}\frac{\partial L(\theta)}{\partial b_i} =  \frac{1}{N}\sum_nv^{(n)}_i-\sum_vP(v|\theta)v_i

と書き直すことができ,それにより第1項はサンプル平均,第2項はモデル分布に対する期待値として表現できる. そこで第1項を\langle v_i\rangle_{\mathrm{data}}=1/N\sum_nv^{(n)}_i,第2項を\langle v_i\rangle_{\mathrm{model}}=\sum_vP(v|\theta)v_iとして,\frac{1}{N}\frac{\partial L(\theta)}{\partial b_i} =  \langle v_i\rangle_{\mathrm{data}}-\langle v_i\rangle_{\mathrm{model}}と表す.

同様に重みw_{ij}に関する微分も計算すると\Phi(v,\theta)に関する微分についてしか違いがないため,バイアルに関する微分の係数のみが変わって,

\displaystyle
\frac{1}{N}\frac{\partial}{\partial w_{ij}}L(\theta)= \frac{1}{N}\sum_nv^{(n)}_iv^{(n)}_j-\sum_vP(v|\theta)v_iv_j=\langle v_iv_j\rangle_{\mathrm{data}}-\langle v_iv_j\rangle_{\mathrm{model}}

となる.以上から隠れ変数のないボルツマンマシンの学習方程式は

\displaystyle
\langle v_i\rangle_{\mathrm{data}}=\langle v_i\rangle_{\mathrm{model}} \\ \displaystyle
\langle v_iv_j\rangle_{\mathrm{data}}=\langle v_iv_j\rangle_{\mathrm{model}}

となり,サンプルとボルツマンマシンの各統計量が一致すればいいことが分かる.ちなみに隠れ変数のないボルツマンマシンの対数尤度は凸なため,大域的最適解に収束する.

学習について(隠れ変数あり)

次に隠れ変数を持つボルツマンマシンの学習方程式を導出する.基本的には隠れ変数なしと同様で\partial L(\theta)/\partial\theta =0を解くだけだが,隠れ変数は観測できない値なため周辺化した対数尤度\log P(v|\theta)=\log \sum_hP(v,h|\theta)について最尤推定を行う. ここでは隠れ変数と可視変数をまとめたxを導入して,バイアスに関する微分を求める.

\displaystyle
\frac{\partial}{\partial b_i}\sum_n\log P(v^{(n)}|\theta)=\sum_n\frac{1}{P(v^{(n)}|\theta)}\frac{\partial}{\partial b_i}P(v^{(n)}|\theta)

ここでP(v^{(n)}|\theta)b_iに関する微分は,隠れ変数と可視変数をまとめた変数x_iを導入すれば

\displaystyle
\frac{\partial}{\partial b_i}P(v^{(n)}|\theta) \\ \displaystyle
=\frac{\partial}{\partial b_i}\sum_h\frac{\exp(\mathbf{b}'\mathbf{x}+\frac{1}{2}\mathbf{x}'\mathbf{W}\mathbf{x})}{Z(\theta)} \\ \displaystyle
=\sum_h\left(x_iP(x|\theta)-\frac{\exp(\mathbf{b}'\mathbf{x}+\frac{1}{2}\mathbf{x}'\mathbf{W}\mathbf{x})}{Z(\theta)^2}\frac{\partial Z(\theta)}{\partial b_i}\right) \\ \displaystyle
=\sum_h\left(x_iP(x|\theta)-\frac{P(x|\theta)}{Z(\theta)}\sum_xx_i\exp(\mathbf{b}'\mathbf{x}+\frac{1}{2}\mathbf{x}'\mathbf{W}\mathbf{x})\right) \\ \displaystyle
=\sum_hx_iP(x|\theta)-\sum_hP(x|\theta)\sum_xx_iP(x|\theta) \\ \displaystyle
=\sum_hx_iP(x|\theta)-P(v^{(n)}|\theta)\sum_xx_iP(x|\theta)

となる.これを元の式に代入すると,

\displaystyle
\frac{\partial}{\partial b_i}\sum_n\log P(v^{(n)}|\theta) \\ \displaystyle
=\sum_n\frac{1}{P(v^{(n)}|\theta)}\left(\sum_hx_iP(x|\theta)-P(v|\theta)\sum_xx_iP(x|\theta)\right) \\ \displaystyle
=\sum_n\left(\sum_hx_i\frac{P(x|\theta)}{P(v^{(n)}|\theta)}-\frac{P(v^{(n)}|\theta)}{P(v^{(n)}|\theta)}\sum_xx_iP(x|\theta)\right)

ここで今後のために経験分布q(v)\equiv 1/N\sum_n\delta(x,x_n)を導入する.ただし,\delta(x,y)デルタ関数xyが一致するときに1を返す関数.

 \displaystyle
\sum_n\left(\sum_hx_i\frac{P(x|\theta)}{P(v^{(n)}|\theta)}-\frac{P(v^{(n)}|\theta)}{P(v^{(n)}|\theta)}\sum_xx_iP(x|\theta)\right) \\ \displaystyle
=N\sum_vq(v)\left(\sum_hx_iP(h|v,\theta)-\sum_xx_iP(x|\theta)\right)

全体をNで割ると最終的に対数尤度のバイアスに関する微分

 \displaystyle
\frac{1}{N}\frac{\partial L(\theta)}{\partial b_i}=\sum_v\sum_hx_iP(h|v,\theta)q(v)-\sum_vq(v)\sum_xx_iP(x|\theta)=\sum_v\sum_hx_iP(h|v,\theta)q(v)-\sum_xx_iP(x|\theta)

となる.ただし,第2項目がサンプルと無関係なため\sum_vを独立に計算できることと\sum_vq(v)=1となる関係を使った. 計算結果を見ると第1項目はP(h|v,\theta)q(v)という分布の期待値になっており,第2項目は\langle x_i\rangle_{\mathrm{model}}となっていることから,

 \displaystyle
\frac{1}{N}\frac{\partial L(\theta)}{\partial b_i}=\mathbb{E}_{P(h|v,\theta)q(v)}[x_i]-\langle x_i\rangle_{\mathrm{model}}

となる.

バイアスと同様に重みに関する微分を計算すると,隠れ変数のないボルツマンマシンと同様の関係が成り立つことから,

 \displaystyle
\frac{1}{N}\frac{\partial L(\theta)}{\partial w_{ij}}=\mathbb{E}_{P(h|v,\theta)q(v)}[x_ix_j]-\langle x_ix_j\rangle_{\mathrm{model}}

と求まり,隠れ変数を持つボルツマンマシンの学習方程式は

\displaystyle
\mathbb{E}_{P(h|v,\theta)q(v)}[x_i]=\langle x_i\rangle_{\mathrm{model}} \\ \displaystyle
\mathbb{E}_{P(h|v,\theta)q(v)}[x_ix_j]=\langle x_ix_j\rangle_{\mathrm{model}}

となる.

計算コストについて

隠れ変数あるなしのボルツマンマシンの学習方程式が求まり後は方程式を満たす\thetaを実際に計算するだけだが,一つ大きな問題がある.両ボルツマンマシンの学習方程式の右辺はモデル分布に対する期待値になっている. これを計算するには変数xに関する和を計算する必要があるが,それには2^M個の要素の和を計算しなければならない.これを計算することは(変数の次元にもよるが)ほぼ不可能なため,一般的にはサンプリングを用いて近似的に求める.

ということで次の記事ではサンプリングにより近似的に求める方法から.