ボルツマンマシンを教科書を読みながら実装しています。
最終的にボルツマンマシンを使い2値分類をしました。
SVM(libsvm)では、80〜90%の確率で正しく識別できる簡単なサンプルデータを用いたところ、
自前のボルツマンマシンでは、50%台と結果がとても悪いです。
SVMと比較してこんなに成績が悪いはずがないと考えており、
教科書どおりに実装しているつもりですが、自前の実装のどこかに誤りがあると思っています。
お聞きしたいことは、どこに間違いがあるのかということです。
- 使用したサンプルデータ
サンプルデータは自分で生成しました。
平面上の半径2の円の内側にランダムに点を生成させ、中心からの距離が1より大きいものは「0」、そうでないものは「1」とラベルをつけて2種類のデータを作りました。
各データは、x, y座標を保持しています。
今回使用するボルツマンマシンはベルヌーイRBMなので、各ユニットが2値しか表現できないので、
数値を32ビットでで表現することにしました。各データにはx, y座標2つの数値があるので、合計で64ビットで表現できます。なのでRBMの可視ユニット数を64個にしました。実際には入力データは、0もしくは1が64個ならんだもので表現しています。同じデータをSVMとRBMに使用しました。
- RBMの条件
可視ユニット数: 64
隠れユニット数: 10
ギブスサンプリングで勾配を計算
コンストラクティブ・ダイバージェンスの回数: 1
学習係数: 0.1
学習用サンプル数: ラベル「0」、「1」ともに1000個づつ
1つのサンプル毎に重みを更新
- 予測方法
学習に使用したのとは、別のデータを使用する。
ラベル「0」と「1」のデータをそれぞれ別に学習させて、それぞれの重みを算出する。
未知(ラベル不明)の入力データに対して、ラベル「0」の重みを使って、ボルツマン分布のエネルギーを計算する。
同じデータに対して、ラベル「1」の重みを使って、同様にエネルギーを計算する。
エネルギーが大きい方のラベルを予測結果とし、実際のラベルと比較し答え合わせをする。
この正解率が50%台でした。
ただ、私は予測する際、ボルツマン分布から確率を計算していません。理由は、
分配関数の計算方法が総当り的に求めなくてはならないので計算が大変(簡単な方法があるのでしょうか?)。
指数関数は単調増加なので、確率の大小を比較するだけなら、エネルギーの比較でよいのではないか。
という理由からです。
エネルギーの計算に使用した可視変数のみの周辺分布は、
sum_{i}b_{i}v_{i} + sum_{j}ln(1 + exp(\lambda_{j})) \lambda_{j} = c_{j} + sum_{i}w_{ij}v_{i}
です。
- 参考書
講談社 機械学習プロフェッショナルシリーズ 深層学習 岡田に貴之
近代科学社 深層学習 人工知能学会監修
以下に、Haskellで実装したコードを記載します。
他人のコードを読むのは大変だと思いますが、奇特な方のご指摘お待ちしています。
あなたの回答
tips
プレビュー