ららにく@utool.cc

機械学習に関する怪しいメモやらあれこれその他メモやら

Restricted Boltzmann Machine(制限ボルツマンマシン)

概要

Restricted Boltzmann Machine(制限ボルツマンマシン)

制限ボルツマンマシン(Restricted Boltzmann Machine; RBM)は、確率的ニューラルネットワークの一種です。
また確率変数を完全二部グラフ構造で表すことができ、下の図のような感じになります。
f:id:utool:20170610034949p:plain

また、完全二部グラフの上層は隠れ変数から構成される隠れ層、下層は可視変数から構成される可視層と呼びます。

用途

制限ボルツマンマシンを用いるとできること

など。


制限ボルツマンマシンの定義

ボルツマンマシンの定義はエネルギー関数Eを用いて次の数式となります。
\begin{align}
P\left(\boldsymbol{v}, \boldsymbol{h} \mid \boldsymbol{\theta} \right) = \frac{1}{Z\left(\boldsymbol{\theta} \right)} \exp \left( -E \left( \boldsymbol{\theta} \right) \right)
\end{align}

また、エネルギー関数の定義はこの記事では
\begin{align}
E \left( \boldsymbol{\theta} \right) = -\sum_{i \in V}b_i v_i -\sum_{i\in V}\sum_{j \in H}W_{ij}v_i h_j -\sum_{j \in H}c_j h_j
\end{align}
のように定義することにしましょう。

また、可視変数と隠れ変数の定義は \boldsymbol{v} = \{ v_i \in \pm 1 \mid i \in V \},  \boldsymbol{h} = \{ h_j \in \pm 1 \mid j \in H \}にしましょう。
つまり、可視変数\boldsymbol{v}, 隠れ変数\boldsymbol{v}はそれぞれ\pm 1の二値変数だということにしておきましょう。

最後に、 \boldsymbol{\theta} = \{\boldsymbol{b}, \boldsymbol{c}, \boldsymbol{W} \} は制限ボルツマンマシンのパラメータです。

制限ボルツマンマシンの存在意義

f:id:utool:20170610034505p:plain
機械学習で行いたいことは、経験に基づいて未知なることを予想することです。それは制限ボルツマンマシンでも同じです。
制限ボルツマンマシンでは最も理想的な真の分布をどうにかして推定することです。この真の分布が手に入れば未知なるものをうまく推定できるだろうと願望しています。でもそんな分布を知っていたら苦労しません。
制限ボルツマンマシンを用いればそんな願いが解決するかもしれません。
いま手元にあるデータが真の分布から確率的に生成されているものであると仮定しましょう。そのデータの出現頻度を表した経験分布に近づけたらもしかしたら真の分布にも近づくかもしれない。
そんな願いを込めて制限ボルツマンマシンを学習します。

制限ボルツマンマシン学習

制限ボルツマンマシンの学習はデータの経験分布に近づけることです。
そのために最尤法と呼ばれるアイデアを用います。
他の尺度としては、制限ボルツマンマシンを経験分布に近づけることであるため、二つの分布のカルバックライブラー情報量を最小化することであるともいえます。

なお、制限ボルツマンマシンでは変数の組合せ爆発と呼ばれる問題があるために計算が困難です。
そのためモンテカルロ法や平均場近似などの近似計算が必要となります。
近似計算として最も有名ものとしてContrastive Divergence法がよく用いられています。


細かい話

可視変数と隠れ変数

可視変数は我々が実際に扱いたいデータと対応づいています。
このデータがどういうデータかによって可視層の構造は決まります。

  • 制限ボルツマンマシン(二値)
  • Gaussian-Bernoulli RBM(連続値)
  • Softmax RBM(1-of-K表現)

普通の制限ボルツマンマシンは二値変数を用いています。二値変数で表現可能ならこれで十分。
二値以外ならGaussian-Bernoulli RBMを用います。画像などはこちらを用いることになるでしょう(ただし計算のオーバーフローを避ける都合上[0,1]区間に縮めたほうが良い)。
また、クラス値、カテゴリなどを扱いたい場合は1-of-K表現を用いると便利で、そのようなモデルをSoftmax RBMといいます[要出典]。

その一方で、隠れ変数は、制限ボルツマンマシンの内部的な変数となります。
隠れ変数の役割は、可視変数の相関関係を表すものとなります。
なお、隠れ変数は二値を用いることが多いです。他を用いたらどうもしょぼいらしいです。
(隠れ変数が連続値を取るモデルとして、Gaussian-Gaussian RBMといったものがありますが、隠れ変数が連続値を用いた場合うまくいかないようです。)

エネルギー関数

エネルギー関数Eは制限ボルツマンマシンが規格化条件を満たすことが可能であるなら自由に設計することが出来ます。
一番シンプルな定義はこのようになります
\begin{align}
E \left( \boldsymbol{\theta} \right) = -\sum_{i \in V}b_i v_i -\sum_{i\in V}\sum_{j \in H}W_{ij}v_i h_j -\sum_{j \in H}c_j h_j
\end{align}
式中のパラメータ\boldsymbol{b}, \boldsymbol{c}をバイアスパラメータと呼びます。バイアスパラメータの役割は、各ノードの変数そのものがどのような値を取りやすいか調整する働きを持ちます。
残りのパラメータ\boldsymbol{W}をウェイトパラメータと呼びます。ウェイトパラメータは可視変数と隠れ変数との相関関係を調整するためのパラメータとなります。

なお、\exp \left( - E\left( \boldsymbol{\theta} \right) \right)のことをポテンシャル関数と呼びます。
正であることを保証するために指数の形にしているらしいです。

---memo---
エネルギー最小化->安定
---memo---

規格化定数

制限ボルツマンマシンのZのことを規格化定数と呼びます。あるいは分配関数とも呼ばれています。
規格化定数の定義は
 \begin{align}
\sum_{\boldsymbol{v}}\sum_{\boldsymbol{h}}\exp \left( - E\left( \boldsymbol{\theta} \right) \right)
\end{align}
であり、ポテンシャル関数\exp \left( - E\left( \boldsymbol{\theta} \right) \right)について、すべての確率変数の実現値で和を取ったものです。

この規格化定数Zのおかげで制限ボルツマンマシンの規格化がなされます。
\begin{align}
\sum_{\boldsymbol{v}}\sum_{\boldsymbol{h}} P\left(\boldsymbol{v}, \boldsymbol{h} \mid \boldsymbol{\theta} \right) = 1
\end{align}



数式いろいろ

規格化定数(もう少し展開)

可視層のノードが少なければカルバックライブラー情報量計算したいときに使える?
\begin{align}
Z\left(\boldsymbol{\theta}\right) &= \sum_{\boldsymbol{v}}\sum_{\boldsymbol{h}}\exp \left( - E\left( \boldsymbol{\theta} \right) \right) \\
 &= \sum_{\boldsymbol{v}}\exp\left(\sum_{i \in V} b_i v_i\right) \prod_{j \in H} 2\cosh\left( c_j + \sum_{i \in V}W_{ij} v_i \right)
\end{align}

条件付き独立性

可視変数と隠れ変数はどんな値を取りやすいかというのは隣接ノード(=もう一方の層の変数)に依存している。

\begin{align}
P\left(\boldsymbol{v} \mid \boldsymbol{h} \right) &= \prod_{i \in V} P\left(v_i \mid \boldsymbol{h} \right) \\
P\left(v_i \mid \boldsymbol{h} \right) &= \frac{\displaystyle{ \exp\left(b_i v_i + \sum_{j \in H}W_{ij} v_i h_j \right) }}{ \displaystyle{ 2\cosh\left(b_i + \sum_{j \in H} W_{ij} h_j \right) }} \\
P\left(\boldsymbol{h} \mid \boldsymbol{v} \right) &= \prod_{j \in H} P\left(h_j \mid \boldsymbol{v} \right) \\
P\left(h_j \mid \boldsymbol{v} \right) &= \frac{ \displaystyle{\exp\left(c_j h_j + \sum_{i \in V}W_{ij} v_i h_j \right) }}{ \displaystyle{2\cosh\left(c_j + \sum_{i \in V} W_{ij} v_i\right) }} \\
\end{align}

つまり、可視層と隠れ層を交互にサンプリング(Ex: ブロックギブスサンプリング, Contrastive Divergence法)に便利。
(さらに細かい話: ボルツマンマシンの性質として, 各ノードがどんな値を取るかは隣接ノードに依存している->マルコフ性)

尤度関数と対数尤度関数

尤度関数は訓練データがどれだけマッチしているかを表す関数です。
訓練データ集合を\boldsymbol{D}= \{\boldsymbol{d}^{(1)}, \boldsymbol{d}^{(2)}, \cdots, \boldsymbol{d}^{(n)}, \}とすると、尤度関数L\left(\boldsymbol{\theta}\right)
\begin{align}
L\left(\boldsymbol{\theta}\right) = \frac{1}{N} \prod_{n=1}^N P\left(\boldsymbol{v} \mid \boldsymbol{\theta} \right)
\end{align}
と定義することが出来ます。
ただし、計算の都合上こういう時は対数尤度関数に変形して使います。でもって対数尤度関数l\left(\boldsymbol{\theta}\right)の定義は
\begin{align}
l\left(\boldsymbol{\theta}\right) &= \ln L\left(\boldsymbol{\theta}\right) \\
 &= \frac{1}{N} \sum_{n=1}^N \ln P\left(\boldsymbol{v} \mid \boldsymbol{\theta} \right)
\end{align}
尤度関数であっても対数尤度関数であっても訓練データに適合していればその値は高くなります。
制限ボルツマンマシンの学習ではデータの経験分布に近づける->データに適合させることであるであるので、対数尤度関数が最も高くなるようにパラメータ\boldsymbol{\theta}をちょうせいすることです。

パラメータの更新式

ヒルクライム法の定義
 \begin{align}
\boldsymbol{\theta} ^ {(\mathrm{new})} \leftarrow \boldsymbol{\theta} ^ {(\mathrm{old})} + \mu \frac{\partial } {\partial \boldsymbol{\theta}} l \left( \boldsymbol{ \theta} ^ {(\mathrm{old})} \right)
\end{align}
\mu: 学習率

各パラメータの勾配
 \begin{align}
\frac{\partial l(\boldsymbol{\theta} )} {\partial b_i} &= \frac{1}{N}\sum_{n=1}^N d_i^{(n)} &-& \frac{1}{N}\sum_{n=1}^N\sum_{\boldsymbol{v}}\sum_{\boldsymbol{h}} v_i P\left(\boldsymbol{v}, \boldsymbol{h} \mid \boldsymbol{\theta}\right) \\
\frac{\partial l(\boldsymbol{\theta} )} {\partial c_i} &= \frac{1}{N}\sum_{n=1}^N \tanh\left( \sum_{i \in V}W_{ij}d_i^{(n)} + c_j \right) 
 &-& \frac{1}{N}\sum_{n=1}^N\sum_{\boldsymbol{v}}\sum_{\boldsymbol{h}} h_j P\left(\boldsymbol{v}, \boldsymbol{h} \mid \boldsymbol{\theta}\right)  \\
\frac{\partial l(\boldsymbol{\theta} )} {\partial w_{ij}} &= \frac{1}{N}\sum_{n=1}^N d_i^{(n)} \tanh\left( \sum_{i \in V}W_{ij}d_i^{(n)} + c_j \right)  &-& \frac{1}{N}\sum_{n=1}^N\sum_{\boldsymbol{v}}\sum_{\boldsymbol{h}} v_i h_j P\left(\boldsymbol{v}, \boldsymbol{h} \mid \boldsymbol{\theta}\right)
\end{align}

※注釈
第二項の期待値計算が困難な場合が多いので何か方法で近似を行います(MCMC, 変分法等)

過学習について

f:id:utool:20170610041915p:plain

過学習

  • データが多い: GOOD
  • データが少ない: やばい

データの経験分布に近づけすぎると過学習と呼ばれる現象を起こします。
これは、制限ボルツマンマシンを経験分布に似せすぎたことが原因で制限ボルツマンマシンの推論性能が嘘くさくなる原因となります。
直感的なイメージだと上図のように、何でもできる真の分布と経験分布とに何らかの差異があって、制限ボルツマンマシンを経験分布に近づけすぎたことでかえって理想の真の分布から遠ざかってしまうような感じです。


ではなぜ真の分布と経験分布との差異が生じるのでしょうか。
原因

  • データが少なすぎて、真の分布と比べ、経験分布が統計的に偏ってる
  • データ中に含まれるノイズの割合が大きすぎる→経験分布が統計的に歪んでる

つまりデータが多いと過学習を起こしてもさして問題ではありません。データが不十分な時ほどやばいんです。

そんなとき、過学習を抑制するともしかしたら性能は上がるかもしれません。
過学習を抑制する方法

制限ボルツマンマシン派生形

  • RBM選択モデル
  • 条件付き制限ボルツマンマシン
  • RNN-RBM
  • ディープビリーフネットワーク
  • ディープボルツマンマシン

キーワード補足

  • カルバックライブラー情報量

二つの分布の類似関係を調べるのに使う。訓練誤差や汎化誤差の評価にも。
\begin{align}
D_{\mathrm{KL}}\left(P \parallel Q \right) = \sum_{\boldsymbol{x}} P\left(\boldsymbol{x}\right) \ln \frac{P\left(\boldsymbol{x}\right)}{Q\left(\boldsymbol{x}\right)}
\end{align}
二つの確率分布PとQの類似性を評価します。数値が0であるほど似た分布であると言えます。

データに過剰に適合すること。
データがいっぱいあるなら有利かもしれないけどデータが少なかったりノイズだらけなときはまずい。

無駄に複雑すぎるモデルをシンプルにする。過学習の抑制に用いたりする。
必要のないパラメータや変数を殺したり全体的に均一になるように弱めてみたり、多層化して隠れ変数の次元を圧縮したり。
スパースコーディングとかディープラーニングとかドロップアウトとか。

  • クロスバリデーション

モデルを学習した時に使ってないデータで答え合わせをする。
学習中にクロスバリデーションしてみて性能が悪くなったらそこで打ち切る。

  • 早期終了

学習を途中で打ち切る



つかれた。
とりあえずここまで。