ゼロから作るDeep Learningで、表題の件がわかりませんでした。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る
当該部分は以下のコードで実装されています。
self.db = np.sum(dout, axis=0)
これについて書中pp. 151-152では、以下のように説明されています。
順伝播でのバイアスの加算は、それぞれのデータ(1個目のデータ、2個目のデータ、…)に対して加算が行われます。そのため、逆伝播の際には、それぞれのデータの逆伝播の値がバイアスの要素に集約される必要があります。(中略)データが2個(N=2)あるものと仮定します。バイアスの逆伝播は、その2個のデータに対しての微分を、データごとに合算して求めます。そのため、
np.sum()
で、0番目の軸(データを単位とした軸)に対して(axis=0
)の総和を求めるのです。
よくわかりません。天下り的な、まるで次元の数を帳尻合わせするために総和をとるという説明に感じました。
これについては、次のように考えることで理解できました。
バッチ版Affineレイヤは、まとめて以下のように表せます。
\begin{align}
\mathbf{X}\cdot\mathbf{W} + \mathbf{B} = \mathbf{Y}
\end{align}
これは、そもそも計算不可能です。とが行列としたとき、は行列だからです。つまり、NumPyのブロードキャストにあたる演算が表現されていません。
それを加味して以下のように修正します。
\begin{align}
\mathbf{X}\cdot\mathbf{W} + \mathbf{1}\cdot\mathbf{B} = \mathbf{Y}
\end{align}
ここで、は要素がすべて1の行列です
つまり、と同様に、
\begin{align}
\frac{\partial L}{\partial\mathbf{B}} &= \mathbf{1}^\mathrm{T} \cdot \frac{\partial L}{\partial\mathbf{Y}} \\
&=
\begin{pmatrix}
\displaystyle \sum_{n = 0}^{N - 1} \frac{\partial L}{\partial y_{n, 0}} & \displaystyle \sum_{n = 0}^{N - 1} \frac{\partial L}{\partial y_{n, 1}} & \cdots & \displaystyle \sum_{n = 0}^{N - 1} \frac{\partial L}{\partial y_{n, J - 1}}
\end{pmatrix}
\end{align}
となるというのが私の考えです。