反向传播公式推导

在计算机科学家(也很可能是数学家)在提出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

机器学习系统 UW CSE 599W: Systems for ML 笔记 (上篇)