

Pythonによるバッチ版Affineレイヤを実装に関して不明な点がございましたので、質問させていただきました（参考書籍：「ゼロから作るDeepLearning」,
pp.150-152）。

以下のバッチ版Affineレイアにおけるバイアスに関する  
参考書籍での説明とソースコードについてご教示いただきたく存じます。

>
> バイアスの加算に際しては、注意が必要です。順伝播でのバイアスの加算は、それぞれのデータ（１個目、２個目のデータ、・・・）に対して加算が行われます。そのため、逆電波の際には、それぞれのデータの逆電波の値がバイアスの要素に集約される必要があります。
[code]

    db = np.sum(dY, axis=0)
    
[/code]

なぜ渡ってきた値（dY）の和を計算しているか納得できませんでした。  
誤差逆伝播法の計算グラフにおいて、「+」ノードでは前から来た値をそのまま下位ノードへ渡すと認識しております。そのため、dYをそのまま下位ノードで渡すのことが自然な処理と考えておりました。

なぜバッチ版ではN行のデータであるdYの和を下位ノードへ渡しているのか  
ご教示頂きたく存じます。  
どうぞよろしくお願いいたします。


CC BY-SA 4.0
2018-06-18T12:45:54.833
44858
2020-01-28T07:03:25.450
2018-06-19T00:22:27.860
3060
28758
question
python 深層学習
Pythonによるバッチ版Affineレイヤ（誤差逆伝播法）の実装方法について


バッチの場合、順伝播の計算時にbはもう一方の項`np.dot(x,W)`に合わせて、つまりはバッチサイズに合わせて自動的に拡大して足し合わされます。  
これにより「+ノードの下位ノード」はbそのものではなく、bに対して演算を施したものになっています。

バイアス項は入力1、重みbのことですから、順伝播ではそれをかけ合わせていると考えれば逆伝播の`db`の求め方は`dW`と同じ形になるはずです。ですから

[code]

    self.db = np.sum(dY, axis=0)
    
[/code]

は`dW`の計算 `dW=np.dot(x.T, dY)` と同じ形の

[code]

    self.db = np.dot(1が並んだ長さがバッチサイズのベクトル, dY)
    
[/code]

のことだと考ればいいのではないですか。

なお諸兄諸姉のご参考に、該当のソースコードは <https://github.com/oreilly-japan/deep-learning-from-
scratch/blob/master/common/layers.py> で見れます。


CC BY-SA 4.0
2018-06-18T20:21:33.980
44864
2018-06-18T22:09:48.220
2018-06-18T22:09:48.220
9464
9464
44858
answer