cBlog

Tips for you.

バッチ版Affineレイヤの逆伝播におけるバイアスのsummationの理由

スポンサーリンク
※当ブログのAmazon、iTunes、サウンドハウス等のリンクはアフィリエイトを利用しています。

ゼロから作るDeep Learningで、表題の件がわかりませんでした。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

当該部分は以下のコードで実装されています。

        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}

これは、そもそも計算不可能です。\mathbf{X}\cdot\mathbf{W}\mathbf{Y}N \times J行列としたとき、\mathbf{B}1 \times J行列だからです。つまり、NumPyのブロードキャストにあたる演算が表現されていません。

それを加味して以下のように修正します。

\begin{align}
\mathbf{X}\cdot\mathbf{W} + \mathbf{1}\cdot\mathbf{B} = \mathbf{Y}
\end{align}

ここで、\mathbf{1}は要素がすべて1のN \times 1行列です

つまり、\partial L/\partial\mathbf{W}と同様に、

\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}

となるというのが私の考えです。