はじめに
機械学習で用いられるボルツマンマシン、特に制限ボルツマンマシン(Restricted Boltzmann Machine, RBM)は非常に面白い概念ですが、その中身の理解は他のニューラルネットワークに比べて難しく、「数式はわかったが、結局何をやっているのか」が分かりにくい印象です。以下では、なるべく平易な言葉で制限ボルツマンマシンが何をしているのか説明してみようと思います。
問題設定

とある大学に通うDaveは、お昼はいつも学食の前のテラスでお弁当を食べます。そして、何の気なしに学食を眺めていると、同じクラスのAliceとBobが学食をよく利用していることに気が付きました。しかし、どうもAliceとBobが同時に現れる確率はかなり低いようです。AliceやBobがお互いに避けているのかと思ってちょっと聞いてみましたが、お互い名前しか知らないようで、特に気にしてないそうです。いったい何が起きているのでしょうか?
Daveは長いこと(239日間!)二人を観察し、AliceとBobが学食に来た日、来ていない日の統計を取りました。
A |
B |
日数 |
x |
x |
35 |
x |
o |
56 |
o |
x |
113 |
o |
o |
35 |
例えばAliceもBobも来ていない日は35日、Aliceだけ来てBobが来なかった日は113日ありました。
実は学食を利用していないDaveは知りませんでしたが、この学食は頻繁にカレーフェアを実施しています。Aliceは学食をよく利用していますが、カレーの匂いが苦手なので、カレーフェアの日は学食を利用しません。Bobは普段はあまり学食に来ませんが、カレーが大好きなので、カレーフェアの日は学食を利用する確率が高くなります。

カレーフェア(Curry Fair)をCとして、その開催日をo、開催していない日をxとすると、先ほどの内訳はこうなっていました。
A |
B |
C |
日数 |
x |
x |
x |
28 |
x |
x |
o |
7 |
x |
o |
x |
7 |
x |
o |
o |
49 |
o |
x |
x |
112 |
o |
x |
o |
1 |
o |
o |
x |
28 |
o |
o |
o |
7 |
こうして、カレーフェアが無い日はAliceは学食に来てBobは学食に来ない可能性が高く、カレーフェアの日はAliceは学食に来ないでBobが来る可能性が高いため、結果として「AliceとBobが同時に学食に来る可能性が低い」という状態になっていました。
この、AliceとBobの学食への出現確率をモデル化したい、というのが本稿の目的です。本来であれば、Daveは重要な情報であるカレーフェアのことを知りません。この隠れた情報であるカレーフェアについて、AliceとBobの観測だけから推定しましょう、というのが制限ボルツマンマシンの目的の一つですが、まずは全てを知っている神の立場から、この学食問題をモデル化してみましょう。
モデルの変数とパラメータ
変数
Aliceをa、Bobをb、カレーフェアをcと略記します。Daveは蚊帳の外です。AliceやBobが学食に来ているかどうか、カレーフェアをやっているかどうかを変数で表すことにしましょう。
例えばある日、Aliceが学食に来ているかどうかを変数vaで表すことにします。これは0か1を取る変数で、va=0 なら今日はAliceは学食に来ておらず、va=1 なら学食に来ています。Bobが学食に来ているかどうかも変数vbで表しましょう。同様に、カレーフェアが開催しているかどうかをhcという変数で表すことにします。やはりhc=0ならカレーフェアを開催しておらず、hc=1なら開催日です。
Daveから見て、AliceやBobが来ているかどうかはわかりますが、カレーフェアをやっているかどうかはわかりません。そこで、AliceやBobは「見える(visible)」変数で、カレーフェアについては「隠れた(hidden)」変数と呼ぶことにします。va,vbのvは「visible」の頭文字、hcのhは「hidden」の頭文字です。
パラメータ
Aliceはカレーフェアが嫌いで、Bobはカレーフェアが好きなので、そこに何か関係がありそうです。AとC、BとCをそれぞれ線で結びましょう。しかし、AliceとBobはお互いに意識していませんので、そこは線で結びません。こうして、以下のような図ができました。

ここで、AliceとBobはDaveから見えるので「可視層(visible layer)」、カレーフェアはDaveから見えないので「隠れ層(hidden layer)」と呼びます。
我々の目的は、AliceやBobが学食にくる確率を与えるモデルを作ることです。そのためにAliceやBobが学食にくる確率の高さや、カレーフェアとの関係をパラメータで表し、そのパラメータから確率を定義しましょう。
Aliceの出現確率にBobは無関係なので、まずはAliceとカレーフェアの関係だけを考えます。Aliceとカレーフェアを結ぶ線にパラメータを定義します。これを 重み(weight) と呼び、 Wacで表すことにしましょう。この重みが正なら「Aliceが学食に来て、かつカレーフェアもやっている確率が高い」、つまりAliceがカレーを好きだということを表すことにします。逆にこの重みが負なら、「Aliceが学食にきて、かつカレーフェアもやっている確率は低い」、すなわちAliceがカレーを嫌いだということを表します。
今回のケースでは、Aliceはカレーが嫌いですから、Wac<0です。同様にBobとカレーの関係を表す重みをWbcで表します。ボブはカレーが好きなのでWbc>0です。
次に、カレーフェアがやっていない時に、Aliceが学食にくる確率を考えましょう。先程の表から、カレーフェアの開催の有無とAliceが学食に来たかどうかの表はこうなります。
A |
C |
日数 |
x |
x |
35 |
x |
o |
56 |
o |
x |
140 |
o |
o |
8 |
まず、カレーフェアがやっていない日について考えましょう。カレーフェアの無い日は35+140=175日ありました。そのうち、Aliceが学食に来たのは140日ですから、4/5の確率で学食に来ています。
カレーフェアとAliceの関係を表す重みWacは、「カレーフェアが開催されており、かつAliceが学食にくる可能性の高さ」を表すパラメータなので、カレーフェアが開催していない時には関係ありません。そこで、新たに「他に何も条件がない場合にAliceが学食に来る可能性の高さ」を表すパラメータを導入しましょう。これを バイアス(bias) と呼び、baで表します。ba>0なら、何もない時にAliceが学食に出現する確率が高いことを、ba<0なら、出現する確率が低いことを表します。全く同様にして、Bobの学食の出現しやすさを表すバイアスbb、カレーフェアの開催確率の高さを表すバイアスbcを定義します。

以上で、このモデルを表現するための全ての変数とパラメータが準備できました。
- 変数
-
va Aliceが学食に来ているか。
-
vb Bobが学食に来ているか。
-
hc カレーフェアは開催しているか。
- パラメータ
-
ba Aliceが学食に来る可能性の高さを表すバイアス。
-
bb Bobが学食に来る可能性の高さを表すバイアス。
-
bc カレーフェアが開催される可能性の高さを表すバイアス。
-
Wac カレーフェアが開催されている時に、Aliceが学食に来る可能性の高さを表す重み。
-
Wbc カレーフェアが開催されている時に、Bobが学食に来る可能性の高さを表す重み。
変数はこのグラフの頂点(Node)で定義され、0か1の二値を取ります。バイアスも頂点で定義され、正なら変数が1になりやすく、負なら0になりやすい傾向を表現します。重みは辺(Edge)で定義され、辺がつなぐ2つの頂点の関係を表し、正なら両者が同時に1になりやすく、負ならそうではないことを表しています。
パラメータから確率への変換
X, Y, Zという事象があるとします。これらのどれかは必ず起きますが、2つ以上同時には起きない(排反事象)としましょう。この3つの事象の「起きやすさ」を表すパラメータを、それぞれx,y,zとします。これらのパラメータから、例えばXが起きる確率をどのように作ればよいでしょうか?
確率が満たすべき条件は、任意の事象の起きる確率が非負の実数で、確率の総和が1になるというものです。先程のパラメータx,y,zは、実数である、という以外の条件はついていません。このパラメータから、例えばXが起きる確率を作るのにSoftmaxと呼ばれる関数を使うのが便利です。
P(X)=exp(x)+exp(y)+exp(z)exp(x)
要するに、全てのパラメータを指数関数の肩に乗せ、その総和を分母に、自分のパラメータを分子にしたものを「自分が起きる確率」とするものです。指数関数の定義から、どんな実数xに対してもexp(x)>0であり、分母にその総和を持ってきているので、X、Y、Zのどれかが起きる確率は1になります。
さて、事象がXとYの2つしかない場合を考えましょう。それぞれのパラメータをx、yとすると、Xが起きる確率P(X)と、Yが起きる確率P(Y)はそれぞれこう書けます。
P(X)=exp(x)+exp(y)exp(x)
P(Y)=exp(x)+exp(y)exp(y)
上記の式は、
- 事象X : パラメータ x
- 事象Y : パラメータ y
について、Softmax型の関数につっこんで確率を作ったものです。これらの分子と分母をそれぞれexp(y)で割ってみましょう。
P(X)=exp(x−y)+1exp(x−y)=1+exp(y−x)1
P(Y)=exp(x−y)+11
これは、
- 事象X : パラメータ x−y
- 事象Y : パラメータ 0
である場合と等価です。つまり、パラメータをSoftmax型の関数に入れて確率を作る場合、お互いのパラメータの差しか関係しません。XとYは排反事象、すなわちどちらかが必ず起きて、同時には起きないのですから、事象Xが起きるか起きないかだけに注目することにします。事象Xが起きるパラメータを改めてx′=x−yとすると、事象Xが起きないパラメータは0です。この時、Softmax関数で確率を作ると、Xが起きる確率は
P(X)=exp(x′)+1exp(x′)=1+exp(−x′)1
となります。これをロジスティック関数(logistic function)と呼びます。このように、ロジスティック関数は、多変数のSoftmax関数の特別な場合とみなすことができます。
以上により、それぞれパラメータが定義された事象の起きる確率をSoftmax関数で定義できること、特に「ある事象がおきるか起きないか」の確率はロジスティック関数で定義できることがわかりました。
モデルパラメータの決定
Aliceに関係するパラメータ
さて、Aliceはカレーフェアが無い日には4/5の確率で学食に来ます。カレーフェアが無い場合は、カレーフェアとの重みWacは無関係なので、Aliceが学食にくるかどうかはバイアスbaだけで決まります。ある事象が起きるか起きないかは、ロジスティック関数を使えば確率になるのでした。
P(va=1,hc=0)=1+exp(ba)exp(ba)
P(va=1,hc=0)=4/5ですから、
exp(ba)=4
と決まります。また、カレーフェアが無い日にAliceが学食に来ない確率はP(va=0)=1−P(va=1)ですから、
P(va=0,hc=0)=1+exp(ba)1
です。上記2つの確率を見ると、va=1の時はパラメータbaの事象が起きる確率を、va=0の時にはパラメータ0の事象が起きる確率を表現しているので、変数vaを使ってまとめて、
P(va,hc=0)=1+exp(ba)exp(vaba)
と書くことができます。vaに0や1を代入すれば、P(va=0)やP(va=1)の値が得られることがわかるでしょう。分母を和の形に書くと
P(va,hc=0)=∑va0,1exp(vaba)exp(vaba)
となります。
次に、カレーフェアがある日について考えましょう。カレーフェアがある日は、カレーフェアの有無を表す変数hcの値が1になります。したがって、カレーフェアのバイアスbcも有効になります。また、「カレーフェアがあり、かつAliceが学食に来る確率の高さ」を表す重みWacもパラメータに加わります。以上から、
- 事象X: カレーフェアがあり、かつAliceが来る時のパラメータ: ba+bc+Wac
- 事象Y: カレーフェアがあり、かつAliceがこない時のパラメータ: bc
です。それぞれのパラメータを指数関数の肩に乗せれば確率を得ることができます。
P(va=1,hc=1)P(va=0,hc=1)=exp(ba+Wac)+exp(bc)exp(ba+bc+Wac)=exp(ba+Wac)+exp(bc)exp(ba+bc+Wac)
分子分母に共通するexp(bc)で割ると以下の形になります。
P(va=1,hc=1)P(va=0,hc=1)=exp(ba+Wac)+1exp(ba+Wac)=exp(ba+Wac)+1exp(ba+Wac)
上記の確率は、先程の事象の重みを以下のように与えたのと等価です。
- 事象X: カレーフェアがあり、かつAliceが来る時のパラメータ: ba+Wac
- 事象Y: カレーフェアがあり、かつAliceがこない時のパラメータ: 0
これは、パラメータをSoftmax関数を使って確率を作る場合、パラメータは差しか関係がないことに対応しています。
先ほどの表をもう一度見てみましょう。
A |
C |
日数 |
x |
x |
35 |
x |
o |
56 |
o |
x |
140 |
o |
o |
8 |
カレーフェアがあった日は56+8=64日です。そのうち、Aliceが学食に来たのは8日、つまり1/8の確率でしか学食に来ていません。
従って、
P(va=1,hc=1)=exp(ba+Wac)+1exp(ba+Wac)=81
です。先程求めた
exp(ba)=4
とを使って解けば、
exp(Wac)=281
と求めることができます。以上からカレーフェアのある日のAliceの出現確率を、以下のように表すことができました。
P(va=0,hc=1)P(va=1,hc=1)=exp(ba+Wac)+1exp(ba+Wac)=81=exp(ba+Wac)+11=87
後でhc=0の場合とまとめるため、先程無視したカレーフェアのバイアスbcも入れておきましょう。
P(va=0,hc=1)P(va=1,hc=1)=exp(ba+bc+Wac)+1exp(ba+bc+Wac)=81=exp(ba+bc+Wac)+1exp(bc)=87
分子分母にexp(bc)をかけただけです。hc=0の場合と同様に、これを変数va,haを使って和の形にまとめましょう。
P(va,hc)=∑va,hcexp(bava+bchc+Wacvahc)exp(bava+bchc+Wacvahc)
ただし和はva=0,1、hc=0,1の4通りについて取ります。右辺は、カレーフェアの有無とAliceが学食にくる確率との関係を表すモデルであるとみなすことができます。P(va,hc)の変数va、hcに0と1の好きな値を代入すれば、知りたい事象の確率を得ることができます。モデルパラメータは、バイアスbaと重みWacです。パラメータとして、カレーフェアのバイアスbcも入っていますが、これは現時点では分子分母でキャンセルしてしまうので、値が決まりません。
Bobに関係するパラメータ
Aliceと同様に、Bobに関係するパラメータも決めていきましょう。Bobが学食に来たかどうかと、カレーフェアの開催の有無の表はこうなります。
B |
C |
日数 |
x |
x |
140 |
x |
o |
8 |
o |
x |
35 |
o |
o |
56 |
カレーフェアが無い日にBobが学食に来る確率から、Bobのバイアスbbが求まります。
P(vb=1,hc=0)=1+exp(bb)exp(bb)=51
から、
exp(bb)=41
と求められます。また、Aliceと同様な手続きにより、カレーフェアのある日のBobの出現確率が7/8であることから、
exp(Wbc)=28
と求められます。
カレーフェアに関するパラメータ
ここまでで、AliceとBobのバイアスba,bbと、カレーフェアとの重みWac,Wbcが求まりました。残るパラメータはカレーフェアのバイアスbcだけです。こちらを求めるのは簡単で、AliceとBobが両方学食に来ていない時のカレーフェアの開催確率を見ればOKです。最初の表から関連するところを抜粋してみましょう。
A |
B |
C |
日数 |
x |
x |
x |
28 |
x |
x |
o |
7 |
AliceもBobも学食に来ていない日は35日間あり、そのうちカレーフェアをやっていたのは7日間でした。つまり、AliceもBobも学食に来ていない日にカレーフェアが開催される確率は1/5です。
これをバイアスbcを使って表すと、
P(va=0,vb=0,vc=1)=1+exp(bc)exp(bc)=51
です。ここから、
exp(bc)=41
と求められます。
以上から、全てのバイアスと重みを求めることができました。
ボルツマンマシンの統計力学的解釈
我々が欲しいのは、
- A: Aliceが学食に来る/来ない
- B: Bobが学食に来る/こない
- C: カレーフェアが開催している/していない
というA, B, Cの3つの事象について、同時確率を与えるモデルでした。そのために、それぞれの事象に対応する変数va,vb,hcを用意し、それぞれに0か1を代入すると、欲しい確率を返す確率モデルP(va,vb,hc)を作りました。その具体的な形は以下の通りです。
P(va,vb,hc)=∑va,vb,hcexp(bava+bbvb+bchc+Wacvahc+Wbcvbhc)exp(bava+bbvb+bchc+Wacvahc+Wbcvbhc)
分子と分母に長ったらしい同じ式が出てきているのでまとめたくなりますね。これをHという関数で表現しましょう。後のために負符号をつけておきます。
H(va,vb,hc)=−(bava+bbvb+bchc+Wacvahc+Wbcvbhc)
a,b,cを、それぞれ1,2,3と通し番号を振ります。そして、vaをσ1、vbをσ2、hcをσ3と名前をつけ直しましょう。すると、先程のHの形がすこしすっきり書けます。
H({σi})=−i∑biσi−i<j∑Jijσiσj
ここで、b1=ba,b2=bb,b3=bc,J12=0,J13=Wac,W23=Jbcです。
この式を見ると、まるで各サイトiに局所的な磁場biがかかり、サイトiとサイトjの間に相互作用Jijがあるようなイジングスピン系のエネルギーであるかのように見えます。
このHを使うと、確率は以下のように書けます。
P({σi})=∑{σi}exp(−H)exp(−H)
ただし∑{σi}は、全てのスピンの状態に関する和をとる、という意味で、この場合はσ1=0,σ2=0,σ3=0からσ1=1,σ2=1,σ3=1まで、8通りの状態の和を意味しています。
この式は、Hをエネルギーだとみなした時、その状態がボルツマン重みexp(−H)に比例して実現する、という統計力学の原理と全く同じ形をしています。
分母はよく使うので、Zという名前をつけておきましょう。
Z={σi}∑exp(−H)
です。これは統計力学における分配関数にほかなりません。
このように、状態を表す変数の値が0か1の二値であり、ある変数の状態の実現確率がボルツマン重みで記述されるようなモデルをボルツマンマシン(Boltzmann machine)と呼びます。ボルツマンマシンは、パラメータが決まってしまえば、任意の変数の状態の同時確率や条件付き確率を計算することができるマシンです。

特に、スピンを2つのグループにわけることができて、同じグループ内に相互作用が無い場合を 制限ボルツマンマシン(restricted Boltzmann machine, RBM) と呼びます。今回のケースはRBMになっています。RBMは表現能力が高いまま、学習が容易になるという特徴を持っており、広く使われています。
例えば、Aliceが学食に来て(va=1)、Bobが学食に来ていないvb=0、という条件において、カレーフェアが開催している(hc=1)という確率を計算してみましょう。
条件付き確率の定義から
P(hc=1∣va=1,vb=0)=P(va=1,vb=0)P(hc=1,va=1,vb=0)
となります。
右辺の分子、分母をそれぞれ書き下すと、
P(hc=1,va=1,vb=0)=Zexp(ba+bc+Wac)
P(va=1,vb=0)=P(va=1,vb=0,hc=0)+P(va=1,vb=0,hc=1)=Zexp(ba)+Zexp(ba+bc+Wac)
これを代入すると、分子分母でZとexp(ba)がキャンセルするので、
P(hc=1∣va=1,vb=0)=1+exp(bc+Wac)exp(bc+Wac)
ここで、
exp(bc)exp(Wac)=41=281
でしたから、代入すると、
P(hc=1∣va=1,vb=0)=1131
となります。
確かめてみましょう。最初の表の、「Aliceが来て」「Bobが来ていない」ところだけを抜き出しました。
A |
B |
C |
日数 |
o |
x |
x |
112 |
o |
x |
o |
1 |
そんな日は113日間ありましたが、そのうちカレーフェアがやっていたのは1日だけなので、「Aliceがきて、Bobが来ていない日にカレーフェアがやっている確率」は1/113でした。正しく求められていますね。
まとめ
ボルツマンマシン、特に制限ボルツマンマシンについて、簡単な例でモデルを構築し、モデルパラメータを求めてみました。今回は全ての原因を知っている全知全能の立場に立ちましたが、一般には隠れ層の情報(今回のケースでのカレーフェアの情報)は知らないままモデルを作らなければいけません。そのために、隠れ層がどんな形か仮定し、可視層の情報だけから重みとバイアスを決定する必要があります。これがボルツマンマシンにおける学習です。
ボルツマンマシンの学習とは、与えられた可視層の情報を「一番もっともらしく」表現できるモデルを探すこと、すなわちパラメータの最尤推定です。これにより、例えば文字を学習したボルツマンマシンに、右半分を隠された文字を入力し、隠された部分を推定させる、といったことができます。一般のボルツマンマシンの学習は極めて大変ですが、制限ボルツマンマシンの場合は効率の良い学習方法が知られています。そのあたりは「制限ボルツマンマシンの基礎 ~学習編~」で(もし書けたら)触れます。
制限ボルツマンマシンの基礎 ~推定編~へ続く。
参考
Discussion