chainerでRBMを実装してみる。contentchainerでRBMを実装してみる。Learningで多層化する場合に、事前学習として用いられる手法です。ソースコードはtheanoで公開されています。http://deeplearning.net/tutorial/rbm.html今回はこのコードをchainerに移植してみました。Divergence(CD)処理の値から計算できます。単純にcupy(numpy+GPU)で実装したほうが単純となりますが、あえて誤差関数を使って実装してみました。cupy(numpy+GPU)だけのソースコードはまた機会がある場合に公開します。いっても以下のソースコードもCDの処理はcupyを使って高速化してますが。可視層が0,1か実数なのかで場合分け。初期層は実数を想定しているが、中間層は0,1しか考えていない。l(v)とかけるように一般的なRBMに出てくる重み行列を転置している。1.5のmanualにこの使い方は非推奨とあったのでadd_param使用。energy)の差となる。隠れ層は[0,1]なので1となる確率を返す。可視層が[0,1]の時は1となる確率を返す。可視層が実数の時は正規分布の平均を返す。reconstructed_vchainerの場合、chainer.links.Linearを使って各層の写像の重み行列(W),バイアス(b)を定義できますがRBMの場合追加でバイアスが必要となるためl.add_param("a",(n_visible),dtype=xp.float32)でパラメータを追加しました。l.W:重み行列l.b:hbiasl.a:vbaiasとなります。可視層から隠れ層への写像をchainer.links.Linearで管理させるため一般的なRBMの本に記載されている重み行列を転置しています。以下のソースコードをMNISTのデータで実験してみました。GPUのサーバがなかったのでCPUで学習させたため、学習回数は50回です。今回は隠れ層を500次元とて、学習係数0.01,モメンタム0.5,PCD-10での結果を使用しています。以下がoriginalのデータ。以下が上記の画像をreconstructした画像。