RBMによるバイアスの更新(制限付きボルツマンマシン)


8

RBMは非常に新しく、今すぐRBMプログラムを作成しようとしています。これがばかげた質問であるか、ここですでに回答されている場合は、申し訳ありません。

オンラインでいくつかの記事を読んだり、ここで質問をしたりしましたが、バイアス(またはバイアスの重み)を更新する方法について何も見つかりません。最初にそれらを設定することについて読みました。それらが更新されることへの参照のつかの間。ジェフヒントンはもちろんバイアスについて言及しており、それは彼の方程式で特徴付けられています(私は彼の論文をいくつか読んだり、ビデオプレゼンテーションをいくつか見たりしました)が、一度設定したバイアスの論文については言及がありません。 、またはその方法/時期/理由。何か欠けているに違いない!

Edwin Chenの論文はこちらで推奨されています。http//blog.echen.me/2011/07/18/introduction-to-restricted-boltzmann-machines/ バイアスを更新/「学習」する方法については触れていません。それらは彼のプログラムで変更されていますが、私は彼のコードを理解していません。(彼は、正しくないように見える更新された重みを与えるテーブルを持っています-不思議なことに、それは何を意味するにせよ、バイアスバイアスの重みを与えます。)

えっと、なぜこれが素材を見つけるのがとても難しいのかわかりません!! 助けてくれてありがとう。


ここを見てください:セクション4.1(バイアス項に対する尤度の導関数について)および5(近似近似アルゴリズムについて)のimage.diku.dk/igel/paper/AItRBM-proof.pdf
シャドウトーカー2015

どうもありがとうございます!ええと、ほとんどの数学は頭を悩ませますが、p28のバイアスを更新する方法についての行は理解できます:-)。理論をさらに掘り下げたいときは、すばらしいでしょう。psバイアスユニットやウェイトがまったくなくても、今日は問題なく動作しています。(それらを発明したスモレンシーは、それらをより良い名前であるハーモニウムと呼びました、私はそれらをそれと呼ぶと思います。)
アダムP

聞いてよかった!ここであなたが見つけたものを書き、あなた自身の質問に答えることをお勧めします。そうすれば、他のユーザーがここで検索して簡単に見つけることができます(コメントは検索されず、質問と回答だけが表示されます)
シャドウトーカー

また、数学をじっくり読んでみれば、それほど複雑ではないことがわかるでしょう。ほんの一部のデリバティブです。多くの時間、彼らは一度だけで、ページ上の多くを投げるとステップをスキップしますが、これらの論文は存在し、収束定理のようなものを証明する場合を除き、通常はそれほど難解ではありません
shadowtalker

回答:


5

TLDR

以下のために -工程対照ダイバージェンス、可視バイアス更新データベクトルに基づいて、使用:nbjd

bj(t)bj(t1)+η(djv^j(n))

隠しバイアスを更新する:hi

ci(t)ci(t1)+η(h^i(0)h^i(n))

ここで、およびは更新番号t後のバイアス、は学習率、はデータベクトルの番目の成分、およびとは、RBMがデータに公開されてステップ実行されると、非表示ユニットと表示ユニットがアクティブになる確率です。これは、ミニバッチサイズを1と想定しています。実用的なミニバッチサイズ場合、データベクトルで取得された更新を平均化します。bj(t)ci(t)ηdjjh^j(n)v^j(n)ijnkk


完全な説明

私も同じ問題を抱えていました。それを考える良い方法は、バイアス自体が単なる重みであるということです。多くの場合、ニューラルネットワークモデルでは、ユニットのバイアスは、問題のユニットを「常時オン」のユニット、つまりアクティブ化が常に1である想像上のユニットに接続するリンクの重みとしてモデル化されます。

RBMの場合、それは、出力が常に1である1つの追加の可視ユニットがあると考えることを意味します。この可視ユニットは、(他の可視ユニットと同様に)非表示ユニットのそれぞれに接続され、これらの接続の重みそれぞれの隠れたユニットのバイアスです。同様に、可視単位のバイアスは、値が常に1であり、各可視単位に接続する追加の非表示単位を想像することによってモデル化できます。これらの接続の重みは可視バイアスです。

この方法でRBMを実装することもできますが、通常はそうすることはないと思います。重要なのは、バイアスをこのように考えると、バイアスは「常にオン」のユニットに接続するウェイトに過ぎないため、ウェイトに対して行うのと同じように、バイアスに対して同じ(本質的に)更新ルールを使用できるということです。

具体的にしましょう。単純化のために正則化を無視して、通常の Contrastive Divergence更新ルールを書き留めます。また、簡単にするために、この更新ルールは1つのデータベクトルの「ミニバッチ」用です。ベクトルのミニバッチの更新は、すべてのベクトルの平均更新です。更新ルールは次のとおりです。nkk

Wi,j(t)Wi,j(t1)+η(h^i(0)djh^i(n)vj(n))
ここで:
  • Wi,j(t)、可視部の連結重みである隠されたユニットに更新回数後にvjhit
  • ηは学習率です
  • h^i(n)は、マシンがデータベクトル公開され、ステップに進化したときに、非表示のユニットがアクティブになる確率です。 idn
    • つまり、は、データベクトルに即時に応答する非表示のユニットアクティブ化にすぎません。h^i(0)i
  • djは、データベクトルの番目のコンポーネントですjd
  • vj(n)は、マシンがデータベクトルに公開され、ステップ進化した後の可視ユニット状態です。jn

(一部の人々は、を使用して表示単位をインデックス付けし、を使用して非表示単位をインデックス付けしますが、記述します---正しい値を掛け合わせる限り、問題ではありません。)ijWi,j

またはで示されるユニットの「状態」とで示されるユニットの「アクティブ化」を区別するように注意してくださいまたは。ユニットの状態は0または1ですが、アクティベーションは0〜1の任意の実数です。アクティベーションが0.8の場合、状態は1である可能性が高くなりますが、20%の時間で0になります。hi(n)vj(n)h^i(n)v^i(n)

バイアスを「常にオン」の単位の重みとして扱うことにより、上記の方程式が「TLDR」でのバイアスの更新に与えられたものに簡略化されることがわかります。ただし、表示バイアスの更新にはわずかに1つの違いがあります。ここでは、状態の代わりに表示アクティベーションが使用されます。アクティベーションの期待値は同じですが、状態よりも分散が小さいため、学習信号のノイズが減少します。状態の代わりにアクティベーションを使用することが望ましい場合の簡単な説明については、このガイドを参照してください。 §3


エドワードニューウェル明確な説明をどうもありがとう!偶然にも(Edwin Chanのブログで説明されているように)この例のMATLABコードがあり、共有できますか?
ビルアンカラゴン、黒

それが助けてうれしい。残念ながら私はpythonの実装しか持っていません。そして、現時点では、私の実装は上記とは異なります(私はさまざまな更新ルールを試していました...)。幸運を!
エドワードニューウェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.