反向传播推导

    反向传播是深度学习的基础知识,但是一开始直接看各种公式很容易让人一头雾水。本篇博客从一个简单的例子开始,一步步演示直至推导出反向传播的4大基本公式。希望能够帮助大家理解反向传播的知识。

    链式法则

    链式法则是反向传播的基础知识,对于链式法则大家理解下面两种case即可。

    case1 :

    y = g(x)        z=h(y)

    \Delta x->\Delta y->\Delta z            \frac{dz}{dx} = \frac{dz}{dy} \frac{dy}{dx}

    case2:

    x=g(s)    y=h(s)    z=k(x,y)   

    \frac{dz}{ds} = \frac{\partial z}{\partial x}\frac{dx}{ds}+\frac{\partial z}{\partial y}\frac{dy}{ds}

    

    有了上面的两个链式法则的公式,我们就可以进行反向传播的推导了。

    首先我们从一个最简单的神经网络开始,然后推广到更通用的神经网络。下面这个神经网络只包含一个神经元,采用sigmod激活函数,损失函数采用最小二乘法。整个神经网络如下所示:

                                                                          

    整个网络的前向传播分为3步:

    1. z=x_{1}w_{1} + x_{2}w_{2} + b

    2. a = \sigma (z)

    3. C = \frac{1}{2}(a-y) ^{2}

    前向传播产生误差,反向传播根据误差更新权重。我们的权重w_{1} w_{2} 就可以根据误差C,执行梯度下降算法得以不断更新。

    w_{1} = w_{1} - \alpha \frac{\partial C}{\partial w_{1}}

    w_{2} = w_{2} - \alpha \frac{\partial C}{\partial w_{2}} 

    \alpha为学习率。

    我们以w_{1}为例,采用链式法则进行求解

    \frac{\partial C}{\partial w_{1}} = \frac{\partial C}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial w_{1}}

    拆成的3部分都非常容易求解

    \frac{\partial C}{\partial a} = a - y

    \frac{\partial a}{\partial z} = \sigma ^{'}(z)

    \frac{\partial z}{\partial w_{1}} = x_{1}       

    同理我们可以求出\frac{\partial C}{\partial w_{2}},然后按照我们上面列出的梯度更新的公式进行更新就可以找到局部最优解。

    我们现在将神经网络进行进一步的扩充,扩充后的神经网络如下图所示:

    

                    

    我们还是和上面求解一个神经元的情况一样,将所有向前传播的式子列举出来,这里为了方便,我们忽略了偏置b。

    z_{1}^{1}=x_{1}w_{1} + x_{2}w_{3}                                                                z_{2}^{1}=x_{1}w_{2} + x_{2}w_{4}

    a_{1}^{1}=\sigma (z_{1}^{1})                                                                              a_{2}^{1}=\sigma (z_{2}^{1})

    z_{1}^{2}=a_{1}^{1}w_{5} + a_{2}^{1}w_{7}                                                                 z_{2}^{2}=a_{1}^{1}w_{6} + a_{2}^{1}w_{8}

    a_{1}^{2}=\sigma (z_{1}^{2})                                                                               a_{2}^{2}=\sigma (z_{2}^{2})

    c_{1}=\frac{1}{2}(a_{1}^{2} - y_{1})^{2}                                                                    c_{2}=\frac{1}{2}(a_{2}^{2} - y_{2})^{2}

    总误差为C=c_{1} + c_{2}, 我们是根据这个总误差来更新我们的权重的。对于权重w_{5} w_{6} w_{7} w_{8}的求导和我们之前单一神经元的例子是一样的。为了后面推导,这里我们还是把它列出来,以w_{5}为例:

    \frac{\partial C}{\partial w_{5}} = \frac{\partial C}{\partial a_{1}^{2}} \frac{\partial a_{1}^{2}}{\partial z_{1}^{2}} \frac{\partial z_{1}^{2}}{\partial w_{5}}

    然后分别求这3部分,

    \frac{\partial C}{\partial a_{1}^{2}} = a_{1}^{2} - y

    \frac{\partial a_{1}^{2}}{\partial z_{1}^{2}} = \sigma ^{'}(z_{1}^{2})

    \frac{\partial z_{1}^{2}}{\partial w_{5}} = a_{1}^{1}

    所以最终

    \frac{\partial C}{\partial w_{5}} = (a_{1}^{2} - y)(\sigma ^{'}(z_{1}^{2}))a_{1}^{1}

    同理我们可以求出\frac{\partial C}{\partial w_{5}}  \frac{\partial C}{\partial w_{6}}  \frac{\partial C}{\partial w_{7}}  \frac{\partial C}{\partial w_{8}}

    然后我们继续推导w_{1}

                 

    w_{1}的更新有两条路径,它符合我们一开始介绍的链式法则的case2的情况,所以我们要计算两条路径对它的影响。

    \frac{\partial C}{\partial w_{1}} = \frac{\partial C}{\partial a_{1}^{1}} \frac{\partial a_{1}^{1}}{\partial z_{1}^{1}} \frac{\partial z_{1}^{1}}{\partial w_{1}}

              = (\frac{\partial C}{\partial a_{1}^{2}} \frac{\partial a_{1}^{2}}{\partial z_{1}^{2}} \frac{\partial z_{1}^{2}}{\partial a_{1}^{1}} + \frac{\partial C}{\partial a_{2}^{2}} \frac{\partial a_{2}^{2}}{\partial z_{2}^{2}} \frac{\partial z_{2}^{2}}{\partial a_{1}^{1}})\frac{\partial a_{1}^{1}}{\partial z_{1}^{1}} \frac{\partial z_{1}^{1}}{\partial w_{1}}

    我们来分别计算括号里面的这两条路径。

    \frac{\partial C}{\partial a_{1}^{2}} = a_{1}^{2} - y                                                                 \frac{\partial C}{\partial a_{2}^{2}} = a_{2}^{2} - y

     \frac{\partial a_{1}^{2}}{\partial z_{1}^{2}} = \sigma ^{'}(z_{1}^{2})                                                                 \frac{\partial a_{2}^{2}}{\partial z_{2}^{2}} = \sigma ^{'}(z_{2}^{2})

    \frac{\partial z_{1}^{2}}{\partial a_{1}^{1}} = w_{5}                                                                         \frac{\partial z_{2}^{2}}{\partial a_{1}^{1}} = w_{6}

    然后在计算\frac{\partial a_{1}^{1}}{\partial z_{1}^{1}} \frac{\partial z_{1}^{1}}{\partial w_{1}}

    \frac{\partial a_{1}^{1}}{\partial z_{1}^{1}} = \sigma ^{'}(z_{1}^{1})                             \frac{\partial z_{1}^{1}}{\partial w_{1}} = x_{1}

    从而得出最终结果

    \frac{\partial C}{\partial w_{1}} = ((a_{1}^{2} - y)\sigma ^{'}(z_{1}^{2})w_{5} + (a_{2}^{2} - y)\sigma ^{'}(z_{2}^{2})w_{6})\sigma ^{'}(z_{1}^{1})x_{1}

    同理可以更新w_{2}w_{3}w_{4}

    但其实我们还可以做的更好。

     \frac{\partial C}{\partial w_{5}} = {\color{Red} {\color{Red} }\frac{\partial C}{\partial a_{1}^{2}} \frac{\partial a_{1}^{2}}{\partial z_{1}^{2}}} \frac{\partial z_{1}^{2}}{\partial w_{5}}                      \frac{\partial C}{\partial w_{6}} = {\color{Red} {\color{Red} }\frac{\partial C}{\partial a_{2}^{2}} \frac{\partial a_{2}^{2}}{\partial z_{2}^{2}}} \frac{\partial z_{2}^{2}}{\partial w_{6}}

    \frac{\partial C}{\partial w_{1}} = ({\color{Red} \frac{\partial C}{\partial a_{1}^{2}} \frac{\partial a_{1}^{2}}{\partial z_{1}^{2}} }\frac{\partial z_{1}^{2}}{\partial a_{1}^{1}} + {\color{Red} \frac{\partial C}{\partial a_{2}^{2}} \frac{\partial a_{2}^{2}}{\partial z_{2}^{2}}} \frac{\partial z_{2}^{2}}{\partial a_{1}^{1}})\frac{\partial a_{1}^{1}}{\partial z_{1}^{1}} \frac{\partial z_{1}^{1}}{\partial w_{1}}

    我们发现在更新w_{1}的时候,红色我们标记出来的部分在更新w_{5} w_{6}的时候已经计算过了,我们就不需要再重新计算了。这个地方有点类似动态规划的思想。我们再这里引入一个新的变量用来表示我们标红的部分,这个变量就是\delta,它表示第l层第j个神经元的误差,定义如下:

    \delta _{j}^{l} = \frac{\partial C}{\partial z_{j}^{l}}

    当然它也可以写成

    \delta _{j}^{l} = \frac{\partial C}{\partial a_{j}^{l}}\sigma ^{'}(z_{j}^{l})

    我们继续往下推导,将\delta替换掉上面标红的部分。

    \frac{\partial C}{\partial w_{1}} =(\delta _{1}^{2}\frac{\partial z_{1}^{2}}{\partial a_{1}^{1}} + \delta _{2}^{2}\frac{\partial z_{2}^{2}}{\partial a_{1}^{1}})\frac{\partial a_{1}^{1}}{\partial z_{1}^{1}} \frac{\partial z_{1}^{1}}{\partial w_{1}}

    然后我们先不考虑更新到w_{1}^{1},我们先只更新到z_{1}^{1},所以上式我们改成

    \frac{\partial C}{\partial z_{1}^{1}} =(\delta _{1}^{2}\frac{\partial z_{1}^{2}}{\partial a_{1}^{1}} + \delta _{2}^{2}\frac{\partial z_{2}^{2}}{\partial a_{1}^{1}})\frac{\partial a_{1}^{1}}{\partial z_{1}^{1}}

    我们其中每一项的导数都已经求出来过了,把他们的求导结果带入。

    \frac{\partial C}{\partial z_{1}^{1}} =(\delta _{1}^{2}w_{5} + \delta _{2}^{2}w_{6})\sigma ^{'}(z_{1}^{1})

    然后我们重新定义权重w的表示方法,我们用w_{jk}^{l}来表示我们的权重,它表示第l-1层的第k个神经单元连接到第l层的第j个神经单元的权重,所以w_{5} w_{6}按照这种定义就表示为w_{11}^{2} w_{21}^{2},我们用矩阵形式来表示上面的式子。

    \frac{\partial C}{\partial z_{1}^{1}} =\delta _{1}^{1}=(|w_{11}^{2} ,w_{21}^{2}|^{T}|\delta _{1}^{2},\delta _{2}^{2}|)\sigma ^{'}(z_{1}^{1})

    所以我们就可以根据下一层的错误量\delta _{l+1}推算出上一层的错误量\delta _{l},公式如下:

    {\color{Red} \delta _{l} = ((w^{l+1})^{T}\delta ^{l+1})\odot\sigma ^{'}(z_{l})}    (公式1)

    这边没有下标代表的是一层总的错误量。

    我们已经根据\frac{\partial C}{\partial z_{1}^{1}}推导出了错误量的公式,接着继续推导\frac{\partial C}{\partial w_{1}}

    \frac{\partial C}{\partial w_{1}} = \frac{\partial C}{\partial a_{1}^{1}} \frac{\partial a_{1}^{1}}{\partial z_{1}^{1}} \frac{\partial z_{1}^{1}}{\partial w_{1}}=\delta _{1}^{1}\frac{\partial z_{1}^{1}}{\partial w_{1}}=\delta _{1}^{1}x_{1}

    我们整个例子中用a_{j}^{l}表示第l层第j个神经元的输出,我们输入x_{1}如果看做是第0层第1个神经元的输出的话,它应该表示为a_{1}^{0},

w_{1}我们也用刚才新的权重定义来表示就是w_{11}^{1},那么整个式子就可写为:

    \frac{\partial C}{\partial w_{11}^{1}} =a_{1}^{0}\delta _{1}^{1}

    所以我们就可以得出计算权重梯度的公式:

    {\color{Red} \frac{\partial C}{\partial w_{jk}^{l}} =a_{k}^{l-1}\delta _{j}^{l}}  (公式2)

    同样的方法,对于偏置梯度的计算公式也可以推导出来,这边就不进行推导,公式如下:

    {\color{Red} \frac{\partial C}{\partial b_{j}^{l}} =\delta _{j}^{l}}   (公式3)

    上面3个公式,在加上一个计算最后一层神经网络输出错误的公式:

    \delta ^{L} = \bigtriangledown _{a}C\odot\sigma ^{'}(z^{L})(公式4)
 

    这4个公式就是著名的反向传播4大公式,根据我们上面一步步的推导,大家已经清楚了这4个公式的推导过程和来龙去脉(公式3,4比较简单,有了本文的基础大家可以自行推导)。有了这4个公式,我们就可以计算出每层的误差,然后层层传递,继而更新我们的权重和偏置,实现最终的网络参数优化。

    

    

                                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值