以前のたたみ込み層のデルタ項と重みを考慮して、たたみ込み層のデルタ項を計算するにはどうすればよいですか?


10

2つの畳み込み層(c1、c2)と2つの非表示層(c1、c2)を持つ人工ニューラルネットワークをトレーニングしようとしています。標準のバックプロパゲーションアプローチを使用しています。バックワードパスでは、前のレイヤーの誤差、前のレイヤーの重み、現在のレイヤーのアクティベーション関数に関するアクティベーションの勾配に基づいて、レイヤーの誤差項(デルタ)を計算します。より具体的には、レイヤーlのデルタは次のようになります。

delta(l) = (w(l+1)' * delta(l+1)) * grad_f_a(l)

通常のレイヤーに接続するc2の勾配を計算できます。私はh1の重みにデルタを掛けます。次に、その行列をc2の出力の形式に再形成し、活性化関数の勾配を掛けて、完了です。

今私はc2のデルタ項を持っています-これはサイズの4D行列です(featureMapSize、featureMapSize、filterNum、patternNum)。さらに、c2の重みがあります。これは、サイズの3Dマトリックス(filterSize、filterSize、filterNum)です。

これら2つの項とc1のアクティブ化の勾配を使用して、c1のデルタを計算します。

短い話:

以前の畳み込み層のデルタ項とその層の重みが与えられた場合、畳み込み層のデルタ項をどのように計算しますか?

回答:


6

多次元に簡単に転送できる1次元配列(入力)の単純化のために、最初に以下の畳み込み層のエラーを導出しています。

ここでは、長さのが番目の入力であると仮定します。層、は、各重みを表す重みカーネルサイズで、出力はです。 したがって、次のように書くことができます(ゼロからの合計に注意): ここでおよび活性化関数(例:シグモイド)。これで、与えられる畳み込み層(前の層の1つ)でのエラー関数とエラー関数を検討できます。yl1Nl1mwwixl

xil=a=0m1waya+il1
yil=f(xil)fEE/yil。ここで、前のレイヤーの重みでエラーの依存性を見つけたいと思います: ここで、が発生するすべての式(があります。また、最後の項は、最初の方程式からわかるあることがわかっていることにも注意してください。 勾配を計算するには、次の式で計算できる最初の項を知る必要があります。
Ewa=a=0NmExilxilwa=a=0NmEwayi+al1

waNmxilwa=yi+al1
Exil=Eyilyilxil=Eyilxilf(xil)
ここでも、最初の項は前の層のエラーで、は非線形活性化関数です。f

必要なエンティティがすべて揃ったため、エラーを計算し、それを効率的に貴重なレイヤーにせることができます。 最後のステップでは、 -sを -sと書き留めると簡単に理解できます。転置重量maxtrix(を指す)。

δal1=Eyil1=a=0m1Exialxialyil1=a=0m1Exialwaflipped
xilyil1flippedT

したがって、次のレイヤーでエラーを計算できます(現在はベクトル表記)。

δl=(wl)Tδl+1f(xl)

その畳み込みおよびサブサンプリング層になる: ここで操作は、最大プーリング層を介してエラーを伝播します。U P S A M P LのE

δl=upsample((wl)Tδl+1)f(xl)
upsample

私を追加または修正してください!

参照については、以下を参照してください。

http://ufldl.stanford.edu/tutorial/supervised/ConvolutionalNeuralNetwork/ http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

C ++実装の場合(インストールの必要なし):https : //github.com/nyanp/tiny-cnn#supported-networks

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.