10

私はニューラルネットワークの複製に取り組んでいます。標準のレイヤータイプの仕組みを理解しようとしています。特に、私はクロスチャネル正規化レイヤーがバックワードパスでどのように振る舞うかの記述のどこかを見つけるのが難しいです。次の(すなわち、それ以降)層からクロスチャネルローカルレスポンス正規化(LRN)レイヤによるバックプロパゲーションアルゴリズム

  1. エラー勾配彼らに何もせずに逆方向に渡されます。正規層はパラメータはありませんので

    、私は2つの可能なオプションを推測することができます。

  2. 勾配は、順方向パスのチャンネル間で正規化されたのと同じ方法で正規化されます。

私は、あなたが直観に基づいて一方を行う理由を考えることができないので、なぜこれについて助けたいのですか?

EDIT1:ここhttp://caffe.berkeleyvision.org/tutorial/layers.html説明したよう

層は、カフェでの標準的な層である( 'ローカルレスポンスの正規化(LRN)' を参照)。

往路でのレイヤーの実装はalexNet紙のセクション3.3で説明されて

http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

EDIT2:私は前方および後方パスアルゴリズムは、ここでトーチライブラリの両方に記述されていると信じて

https://github.com/soumith/cudnn.torch/blob/master/SpatialCrossMapLRN.lua

、ここでカフェライブラリーで:https://github.com/BVLC/caffe/blob/master/src/caffe/layers/lrn_layer.cpp

これらの/両方に精通している誰もが翻訳可能性があります後ろ向きの段階のための方法は普通の英語に?

+0

「クロスチャネル正規化レイヤー」についてのリファレンスにリンクできますか? Googleは他の多くのことについても話すように見えるarxiv論文のみを公開しています。それは標準的なレイヤータイプのようには思えません。 – IVlad

+0

@IVladリンクが追加されました。 – user1488804

答えて

3

これは、チェインルールを使用して、ローカルレスポンス正規化レイヤーを介してグラジェントを後方に伝播します。これは、この意味での非線形性レイヤー(それ自身で訓練可能なパラメータを持たないが、後方に行くグラジエントに影響する)にいくらか類似している。私は、彼らがパラメータとして各ニューロンに誤りを取ることを確認し、次のようにして、前の層のための誤差を計算するためにあなたがリンクカフェ内のコードから

まず往路に、彼らいわゆるスケールをキャッシュし、それはのように(AlexNet紙の観点から、セクション3.3からの式を参照)が計算される:ここ

scale_i = k + alpha/n * sum(a_j^2) 

sumの下jによってインデックス付け和であり、max(0, i - n/2)からmin(N, i + n/2)

に進み

(論文ではnで正規化していないので、これはCaffeがAlexNetとは違う方法であると仮定しています)。順方向パスは、b_i = a_i + scale_i^-betaとして計算されます。後退誤差を伝播する

、のは、次の層からの誤差がbe_iであり、我々は計算する必要があるエラーがae_iあるとしましょう。あなたが計算した場合

  1. :あなたは手動でそれを実装することを計画しているので、私もカフェは実装が簡単になり、そのコードで使用する2つのトリックを共有する

    ae_i = scale_i^-b * be_i - (2 * alpha * beta/n) * a_i * sum(be_j * b_j/scale_j) 
    

    :その後ae_iは次のように計算されます加算の加数は、サイズがN + n - 1の配列を割り当て、両端にはそれぞれn/2のゼロを埋め込みます。この方法で、i - n/2からi + n/2までの合計を計算することができます。ゼロ以下になり、Nを超えることは気にする必要はありません。

  2. あなたは、その後、それぞれのその後sumi = 0のために計算し、(復路のために、フロントのパスのためbe_j * b_j/scale_ja_j^2)を事前に加数を計算する代わりに、各反復でsumを再計算する必要はありません。連続してiを追加すると、addend[i + n/2]が減算され、addend[i - n/2 - 1]が減算されます。一定の時間内に新しい値の合計がiになります。

+1

これは 'b_i = a_i * scale_i ^-β'であってはなりませんか? –

-1

原因を表示するために変数を印刷するか、デバッグモデルを使用してネットを渡す際にエラーがどのように変化するかを確認することができます。

-1

私は後方の代替製剤を持っており、それがカフェ年代と同等であれば、私は知らない。

だから、カフェさんは次のとおりです。

ae_i = scale_i^-b * be_i - (2 * alpha * beta/n) * a_i * sum(be_j * b_j/scale_j) 

元の式

を微分して
b_i = a_i/(scale_i^-b) 

ae_i = scale_i^-b * be_i - (2 * alpha * beta/n) * a_i * be_i*sum(ae_j)/scale_i^(-b-1)