反向传播公式推导

在计算机科学家(也很可能是数学家)在提出DL在计算机上可行的时候,(我相信) 算力友好的计算Cost functon 对每个参数的导数($\frac{\partial C}{\partial w_{j k}^{l}}$ 和 $\frac{\partial C} { \partial b_{j}^{l}}$)是非常重要的一点。

符号表示

为此,这里引入了中间变量$\delta_{j}^{l}$ 定义为在$l^{th}$层的第$j^{th}$个神经元上的误差:
$\delta_{j}^{l} \equiv \frac{\partial C}{\partial z_{j}^{l}}$
这里$z_j^l$指的是第$l^{th}$层的第$j^{th}$个神经元的激活函数的带权输入:
$z_{j}^{l}=\sum_{k} w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l}$
看起来更直观的做法可能会把激活函数输出作为引入变量来推导,但是事实是用$z_j^l$来表示会更方便。

从$\delta_j^L$ 出发: 大写的$L$表示最后一层,即输出层的误差,计作BP1
$\delta_{j}^{L}=\frac{\partial C}{\partial a_{j}^{L}} \sigma^{\prime}\left(z_{j}^{L}\right)$
BP1 是按分量构成的表达式,如果重写为用矩阵表示,计作BP1a,即:
$\delta^{L}=\nabla_{a} C \odot \sigma^{\prime}\left(z^{L}\right)$
其中$\nabla_{a}C$ 是一个向量,元素为$ \partial C / \partial a_{j}^{L} $  

既然最后一层的误差已经可以表示,那对于中间层呢?
先给出结论,下式记作BP2 :
$\delta^{l}=\left(\left(w^{l+1}\right)^{T} \delta^{l+1}\right) \odot \sigma^{\prime}\left(z^{l}\right)$
证明:
BP2的核心就是把$\delta_j^l$ 和 $\delta_j^{l+1}$ 关联起来,证明的时候我们尝试用$\delta_{k}^{l+1}=\partial C / \partial z_{k}^{l+1}$的形式重写$\delta_{j}^{l}=\partial C / \partial z_{j}^{l}$ ,我们从后者出发来推:
$\begin{aligned} \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} \frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}} \delta_{k}^{l+1} \end{aligned}$
这里第二步引入$z_k^{l+1}$
第二步到第三步是把等号右边的两项交换了位置,根据设定,可以把$\frac{\partial C}{\partial z_{k}^{l+1}}$ 写作$\delta_{k}^{l+1}$ 
然后为了计算$\frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}}$,我们先回顾一下:
$z_{k}^{l+1}=\sum_{j} w_{k j}^{l+1} a_{j}^{l}+b_{k}^{l+1}=\sum_{j} w_{k j}^{l+1} \sigma\left(z_{j}^{l}\right)+b_{k}^{l+1}$
做微分以后就得到了:
$\frac{\partial z_{k}^{l+1}}{\partial z_{j}^{l}}=w_{k j}^{l+1} \sigma^{\prime}\left(z_{j}^{l}\right)$
把上面式子带入回前式可得:
$\delta_{j}^{l}=\sum_{k} w_{k j}^{l+1} \delta_{k}^{l+1} \sigma^{\prime}\left(z_{j}^{l}\right)$
这正是分量形式的BP2,于是就证明了可以通过后一层的误差$\delta$来计算前一层误差

Comments

Popular posts from this blog

Malware Report: iauzzy.exe

Malware Report: withme.exe

根因分析之iDice 文章复现