バッチを実行するとき、バックプロパゲーションはMax Poolingレイヤーを通じてどのように機能しますか?


10

学習に100サンプルのバッチサイズを使用していると仮定します。

したがって、すべてのバッチで、すべてのニューロン(およびバイアスなど)の重みは、学習率のマイナス* 100サンプルを使用して見つけた平均エラー値*に関するエラー関数の導関数を追加することによって更新されます。更新されている現在のニューロンの重み。

ここで、最大プールレイヤーを使用する場合、このレイヤーの微分をどのように計算できますか?フィードフォワードするすべてのサンプルで、異なるピクセル(たとえば、)が最大値として選択されているため、異なるパスが選択されるたびに100個を超えるサンプルをバックプロパゲートする場合、どうすればよいですか?私が心に留めている解決策は、最大値として選択されたすべてのピクセルを覚えてから、おそらくすべての最大ピクセルで微分を分割することです。これは何が行われているのですか?


同じ質問があります。サンプルが1つだけのBPの場合、最大要素の導関数のみがゼロではないことは明らかですが、サンプルがバッチであるBPの場合、サンプルが異なると最大要素の位置が異なる可能性があるため、通常どおり各パラメーターの平均導関数を計算できます(ちょうどすべてのサンプルの∂L/∂wiを追加し、バッチサイズで割った)?
Shaotao Li 2018

回答:


8

ニューラルネットワークがバッチを処理するとき、各レイヤーのすべてのアクティベーション値が各例に対して計算されます(ライブラリとハードウェアがサポートしている場合は、例ごとに並列で行われる場合があります)。これらの値は、後で使用できるように保存されます。つまり、バッチ内の例ごとにアクティブ化ごとに1つの値であり、決して集約されません。

バックプロパゲーション中、これらのアクティベーション値は、これまでに逆方向に作用して計算されたグラディエントおよび接続の重みとともに、グラディエントを計算する数値ソースの1つとして使用されます。フォワード伝播と同様に、バック伝播は例ごとに適用され、平均値または合計値では機能しません。すべての例が処理されたときのみ、バッチの合計または平均化された勾配を使用します。

これは、最大プールレイヤーにも同様に適用されます。バッチの各例のプーリングレイヤーからの出力が何であるかがわかるだけでなく、前のレイヤーを見て、プールへのどの入力が最大であるか判断できます。

数学的には、NNレイヤーとニューロンのインデックスを定義する必要がないため、ルールは次のように表現できます。

  • m=max(a,b)

  • Jm

  • JaJb

  • 場合a>b

    • m=aJa=Jm

    • mbJb=0

  • Ja=Jma>bJa=0

  • Jb=Jmb>aJb=0

バックプロパゲーションが最大プーリングレイヤーを通過するとき、グラデーションは例ごとに処理され、最大であった前のレイヤーからの入力にのみ割り当てられます。他の入力はゼロ勾配を取得します。これをバッチ処理しても、違いはありません。例ごとに並列に処理されるだけです。バッチ全体で、これは、最大プールへの入力アクティベーションの1つ以上、おそらくすべてが、勾配の一部のシェアを取得することを意味する可能性があります-それぞれバッチ内の例の異なるサブセットから。


m

a=b


3
よくわかりません。あなたが言っていることは、単一のフォワードプロップの後にバックプロップしたときに機能します。しかし、バッチがある場合、平均誤差関数を計算するために100サンプルを支柱します。バッチの全体のポイントは、より正確な勾配を生成できるようにすることです。その後、Wに関する誤差関数の導関数に基づいてバックプロップを1回だけ実行します。平均誤差値に学習率を掛けて求めます。したがって、異なるノードが最大値として選択されるたびに、max関数の微分をどのように計算するかはまだ明確ではありません。何が欠けていますか?
Nadav B

4
@NadavB:一連のイベントがありません。1)バッチは、アイテムごとに前向きに計算されます。2)バッチはアイテムごとに逆伝播されます。3)勾配の平均を取ります。4)勾配降下のステップを適用します(おそらくAdagradやRMSPropのようなものによって変更されます)。したがって、ステップ3をシーケンスから外して、最大プールレイヤーの平均勾配を選択解除する方法を考えています。ただし、各サンプルを個別にバックプロップするため、これを実行する必要はありません。その後、バッチの結果のみを集計します
Neil Slater

1
完璧です。あなたは今それを明らかにしました。
Nadav B

@NeilSlater最大プールレイヤーに必要なため、逆伝播はアイテムごとにのみ行われますか?MLPでは、最初にバッチ全体のエラーを平均し、次にその平均エラーの勾配を計算することは、アイテムごとの勾配を計算し、平均勾配*学習率でパラメーターを調整することと同じですよね?ただし、平均エラーの逆伝播は、個々のエラーをすべて逆伝播して更新を適用するよりもはるかに高速です。したがって、可能であれば、このようにして、必要に応じて項目ごとにのみ実行することをお勧めします...最大プールのように。そうですか?
lo tolmencre

@lotolmencreバッチの平均誤差を計算するのは間違っています。個別に逆伝播し、最後に勾配を合計する必要があります。勾配の計算は、それ以外の場合は非線形性を介して正しく機能しません。詳細については、新しい質問をしてください
ニールスレーター

2

同じ質問がありますが、Caffeのソースコードを確認するとわかります。

Caffeのソースコードを参照してください。

このコードの620&631行目。

各入力の(このパラメーターの)導関数を追加して各パラメーターの導関数を計算し、バッチサイズで除算します。

このコードの137行目も参照してください。平均と同じように、導関数を単に1 / iter_sizeにスケーリングします。

BPの場合、最大プーリングレイヤーには特別な処理がないことがわかります。

Max Poolingの派生物について、Caffeのソースコードをもう一度見てみましょう。

このコードの272行目。明らかに、最大の要素の微分のみがであり1*top_diff、他の微分は0*top_diffです。

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