12

ディープラーニングのチュートリアルによると:

Pythonの自由エネルギーは

def free_energy(self, v_sample):
    ''' Function to compute the free energy '''
    wx_b = T.dot(v_sample, self.W) + self.hbias
    vbias_term = T.dot(v_sample, self.vbias)
    hidden_term = T.sum(T.log(1 + T.exp(wx_b)), axis=1)
    return -hidden_term - vbias_term

私はPythonがあまり得意ではありません。基本的に、各可視ユニットの製品エキスパートをベクトル wx_b として取得し、 exp と plus 1 を計算し、 log を計算して、非表示の用語を合計します。

これは、Learning Deep Architectures の自由エネルギー方程式とは少し異なると思います。

FreeEnergy(x) = −b′x − ∑log∑e^hi(ci+Wix)。

どこ:

  • hiはユニットのi隠れ層であり、
  • ciiベクトル cの隠れバイアスです。

exp と sum を計算し、合計値に対して log を計算します。結局、目に見えるユニットの数に基づいてすべての製品エキスパートを合計します。

上記の式は、Learning Deep Architectures for AI (Yoshua Bengio) の eq.5.21 です。

以下は私の Java 実装のドラフトです。vis_v は可視層のサンプル、hid_v は非表示層ユニットのサンプルです。

private double freeEnergy(RealVector vis_v, RealVector hid_v){
 RealVector wx_hb= W.preMultiply(vis_v).add(hBias);
 double vbias_term= vis_v.dotProduct(vBias);
 double sum_hidden_term = 0;
 for(int i=0;i< wx_hb.getDimension();i++){
     RealVector vis_expert = hid_v.mapMultiply(wx_hb.getEntry(i));
     double hidden_term= StatUtils.sum(vis_expert.map(new Exp()).toArray());
     sum_hidden_term+=Math.log(hidden_term);
 }
 return -sum_hidden_term-vbias_term;
}

これはある種の近似ですか?Javaで同じことを実装しようとしていますが、混乱しています。助けてくれてありがとう!

4

1 に答える 1

3

参照 Python コードの自由エネルギー関数の定義について、あなたの混乱が生じていると思います。これがあなたの求めているものでない場合は、お詫び申し上げます。

まず、これは概算ではありません。隠しユニットがバイナリ値であると想定しているようです。自由エネルギーは、隠れた変数を除外したエネルギー (の対数) に過ぎないことを忘れないでください。したがって、上にリストした自由エネルギー方程式の内部合計は、i^ 番目の隠れユニットが取ることができる値 (この場合は {0,1}) の単なる合計です。exp(0) = 1 なので、内部和は 1+exp(...) になります。提供したリンクの「RBMs With Binary Units」セクションを参照してください。

私は Java の apache commons 数学ライブラリに精通していないので、そこに大きな助けになることはできませんが、実装はその python 関数からの簡単な翻訳でなければなりません。

于 2012-03-30T15:25:35.623 に答える