CNN-重み共有を伴う逆伝播はどのように正確に機能しますか?


8

画像分類のために畳み込みニューラルネットワーク(CNN)を検討してください。ローカルフィーチャを検出するために、同じ畳み込み層内のユニット間で重み共有が使用されます。このようなネットワークでは、カーネルの重みは逆伝播アルゴリズムによって更新されます。

レイヤーカーネルの重みの更新は次のようになります。hjl

hjl=hjlηδRδhjl=hjlηδRδxjLδxjLδxjL1...δxjlδhjl

カーネルの重みをどのように更新しても、同じ(=共有)にすることができますか?

私は2つの考えられる説明があります:

  1. 同じ値に初期化された同じレイヤーの重みは、(入力に関係なく)同じままです。これは、式がこれらの重みからすべてで同じであることをます。はjごとに異なるため、これは意味がありません。または、ここで何か不足していますか?δRδhjlh1lhJlxjl

  2. トリックがあります。たとえば、バックプロパゲーションの更新後、共有の重みは平均に設定されます。

編集 私が混乱したのは、重みが共有されている場合、そのパラメーターが損失関数に数回現れることを考慮していなかったことでした。微分するとき、いくつかの項(対応する入力を考慮する)は「存続」します。したがって、更新は同じになります。hjlhjl

回答:


7

ここで「ウェイトシェアリング」の意味を誤解していると思います。たたみ込み層は通常、通常2x2または3x3である多くの「フィルター」で構成されます。これらのフィルターは、レイヤーの入力全体の「スライディングウィンドウ」に適用されます。「ウェイトシェアリング」は、入力全体でこのフィルターに固定ウェイトを使用しています。すべてのフィルターが同等であるという意味ではありません。

具体的には、3x3入力をパディングでまたぐ2x2フィルターを想像してみてください。フィルターが4回適用されます。アンロールされたフィルター示しましょう。FXβ

X=[x11x12x13x21x22x23x31x32x33]

F=[w11w12w21w22]

β=[w11,w12,w21,w22]

FX=[β[x11,x12,x21,x22]β[x12,x13,x22,x23]β[x21,x22,x31,x32]β[x22,x23,x32,x33]]

「重みの共有」とは、この2x2フィルターを3x3入力に適用すると、入力全体にわたってフィルターによって与えられた同じ4つの重みを再利用することを意味します。代替案は、独自の入力セットを持つ各フィルターアプリケーション(実際には画像の領域ごとに個別のフィルターになります)で、合計16の重みを与えるか、4つのノードで36の重みを与える密なレイヤーになります。

この方法で重みを共有すると、学習する必要のある重みの数が大幅に削減され、非常に深いアーキテクチャを学習しやすくなり、さらに、考慮されている入力の領域にとらわれない機能を学習できます。

編集:これをさらに動機付けるために、これは5x5入力に適用された3x3フィルターのアニメーションです

ここに画像の説明を入力してください


1
ありがとう、簡単な質問に要約できます。表される重みは逆伝播によって学習されますか?β
アンディR

うん!彼らは確かです。
デビッドマルクス

1
入力全体でどのように学習て同じ(つまり共有)にすることができますか?逆伝播アルゴリズムも入力を考慮するため、2つの異なる入力に対して、は異なる方法で更新する必要があります。ββ
アンディR

1
重みの更新における偏導関数は、入力ではなく、重み()に関連して計算されます。MLPのbackpropと本当に違いはありません。β
デビッドマルクス

ここでデビッドと同意します。重みの畳み込みと入力を混同しているのは、上に示したようにカーネルが入力画像に適用される単純な操作であり、backpropを使用して、カーネルの重みが損失関数を最小化するように更新されます。最初の損失は、アクティベーション*入力の加重和に対するアクティブ化の変化率*入力の加重和の重み付けの変化率重みの変化率(ここではカーネルの重み)。
khwaja wisal

6

受け入れられた回答を変更できるかどうかはわかりませんが、バックプロパゲーションに関する質問に対する唯一の回答はフォワードプロパゲーションに関する回答であるため、試してみることにしました。

基本的に、重みデルタ()は線形ニューロンの重みデルタと同じように扱いますが、フィルター(カーネル)をオーバーレイするたびに1回トレーニングします入力では、すべて単一のbackpropパスで。結果は、フィルターのすべてのオーバーレイのデルタの合計です。あなたの表記では、これはここで、は、順方向伝搬中にオーバーレイの1つに対してが乗算された入力であり、はそのオーバーレイから得られた出力です。δRδhjlδRδhjl=i=1nxil1δRδxjl+1xl1hjlxl+1

畳み込み層(パラメーターデルタと入力デルタ)を介したbackpropの2つの結果の間では、パラメーターデルタ、またはより具体的には、重み行列デルタ()。完全を期すために、次の例のレイヤーとして、両方について説明します。δRδhjl

入力の1Dセットと、ストライド1、パディングなし、バイアスなし、アクティブ化関数なしで適用されるフィルターがある場合、フィルターのアクティブ化はように見えました。backpropパスでこのレイヤーに戻ったとき、計算に使用するアクティベーションデルタがとしましょう。[1,2,3][0.3,0.5][10.3+20.5,20.3+30.5]=[1.3,2.1][0.1,0.2]

ウェイトデルタ:

フォワードパスを通過したとき、入力をキャッシュしました。これをA_prevと呼びます。これは、前のレイヤーのアクティブ化である可能性が高いためです。フィルターの潜在的なオーバーレイごとに(この場合、2つの場所[ 1,2、3 ]と[ 1、2,3 ]でのみ入力にオーバーレイできます)、入力A_sliceのそのスライスを取り、それぞれを乗算します関連する出力デルタdZによって要素を抽出し、それをこのパスの重みデルタdWに追加します。この例では、最初のオーバーレイのをdWに追加し、次に2番目のオーバーレイのを追加します。つまり、このバックプロップパスでのこの畳み込み層のdWは 0.3、0.4です。[1,2,3][10.1,20.1][20.2,30.2][0.3,0.4]

バイアスデルタ:

重みデルタの場合と同じですが、入力行列を掛けずに出力デルタを追加するだけです。

入力デルタ:

この層の入力の形状を再構築し、それをdA_prevと呼び、それをゼロに初期化し、入力にフィルターを重ねた構成をウォークスルーします。各オーバーレイについて、ウェイトマトリックスにこのオーバーレイに関連付けられた出力デルタを掛け、それをこのオーバーレイに関連付けられたdA_prevのスライスに追加します。つまり、オーバーレイ1は -0.1、0.5をdA_prevに追加し、結果として -0.05、0となり、オーバーレイ2は 0.2、0.5 0.06、0.1、つまりdA_prev は -0.03、0.01、0.1になります。[0.30.1,0.50.1]=[0.03,0.05][0.03,0.05,0][0.30.2,0.50.2]=[0.06,0.1][0.03,0.01,0.1]

同じ答えを別の用語で読みたい場合、これはかなり良い情報源です:リンク


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