MLP网络BP公式推导

2021年1月18日 / 35次阅读 / Last Modified 2021年1月18日
神经网络

我喜欢用MLP来表示feed forward fully connected neural network,因为似乎找不到更简洁的词汇。本文推导MLP网络BP算法的4个公式。

首先推导最后一层网络神经元对应的梯度,L表示最后一层,*表示hadamard product (与numpy中的*符号保持一致)。

$$\begin{align}
\delta^L&=\frac{\partial C}{\partial z^L} \\
&=\frac{\partial C}{\partial a^L}\frac{\partial a^L}{\partial z^L} \\
&=\nabla_{a}C * \sigma'(z^L) \tag{1}
\end{align}$$

$$\begin{align}
\delta_j^{l} &= \frac{\partial C}{\partial z_j^{l}} \\
&= \sum_k \frac{\partial C}{\partial z_k^{l+1}} \frac{\partial z_k^{l+1}}{\partial z_j^l} \\
&= \sum_k \delta_k^{l+1} \frac{\partial z_k^{l+1}}{\partial z_j^l}
\end{align}$$

这个式子求和的由来,l层的某个神经元的激活输出,会传递到l+1层所有神经元,因此这个输出对整个网络cost的影响,就分散到了l+1层每一个神经元身上,而最后计算得到的cost,是一个值,把最后一层的那个偏差vector的每个元素加在了一起,来表示cost。

$$\begin{align}
\delta_j^{l} &= \frac{\partial C}{\partial z_j^{l}} \\
&= \sum_k \frac{\partial C}{\partial z_k^{l+1}} \frac{\partial z_k^{l+1}}{\partial z_j^l} \\
&= \sum_k \delta_k^{l+1} \frac{\partial z_k^{l+1}}{\partial z_j^l} \\
&= \sum_k \delta_k^{l+1} \frac{\partial (\sum_j w_{kj}^{l+1}a_j^l+b_k^{l+1})}{\partial z_j^l} \\
&= \sum_k \delta_k^{l+1} w_{kj}^{l+1} \sigma'(z_j^l)
\end{align}$$

\(\delta_j^l\) 只是l层的一个元素,这个式子已经体现出了BP后向传播的精髓,l+1层的数据通过w向l层汇聚。考虑全部l层,可以得到如下公式:

$$\delta^l = (w^{l+1})^T \delta^{l+1} * \sigma'(z^l) \tag{2}$$

这种推导,就是数学归纳法,知道L层,计算L-1层.....Back Propagation...

得到了MLP每一层的 \(\delta^l\),我们就可以轻松得到对应的w和b的梯度:

$$\begin{align}
\frac{\partial C}{\partial w_{jk}^l} &= \frac{\partial C}{\partial z_j^l} \frac{\partial z_j^l}{\partial w_{jk}^l} \\
&= \delta_j^l \cdot a_k^{l-1}
\end{align}$$

这是每一个w的梯度,整个l层的w的梯度,可以用下面这这个式子来表示:

$$\frac{\partial C}{\partial w^l} = \delta^l \cdot (a^{l-1})^T \tag{3}$$

最后是b的梯度:

$$\frac{\partial C}{\partial b^l} = \delta^l \tag{4}$$

以上(1)(2)(3)(4)四个式子,就是经典的BP算法!

-- EOF --

本文链接:https://www.pynote.net/archives/3241

留言区

邮箱地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top