UFLDL Tutorial 课程核心内容提炼-2:反向传导算法

该课程在斯坦福深度学习课上,点此打开

--------------------------------------------------分割线------------------------------------------------------

一、概述

       

         固定样本集 \textstyle \{ (x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)}) \},它包含\textstyle m 个样例,可以用批量梯度下降法来求解神经网络(W和b),对于单个样例\textstyle (x,y),其代价函数为:  

                                                        \begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align}

        给定一个包含 \textstyle m 个样例的数据集,我们可以定义整体代价函数为:

                                \begin{align}J(W,b)&= \left[ \frac{1}{m} \sum_{i=1}^m J(W,b;x^{(i)},y^{(i)}) \right]                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2 \\&= \left[ \frac{1}{m} \sum_{i=1}^m \left( \frac{1}{2} \left\| h_{W,b}(x^{(i)}) - y^{(i)} \right\|^2 \right) \right]                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2\end{align}

        \textstyle J(W,b)定义中的第一项是一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。        

        权重衰减参数 \textstyle \lambda 用于控制公式中两项的相对重要性。在此重申一下这两个复杂函数的含义:\textstyle J(W,b;x,y) 是针对单个样例计算得到的方差代价函数;\textstyle J(W,b) 是整体样本代价函数,它包含权重衰减项。


二、核心思想-更新权值


        梯度下降法中每一次迭代都按照如下公式对参数 \textstyle W\textstyle b 进行更新:

                                                        \begin{align}W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b)\end{align}

        \textstyle \alpha 是学习速率。其中关键步骤是计算偏导数。这里需要求出J关于W和b的偏导数,如何计算,将在下面讲明。


三、核心思想-BP反向传播算法

  

        先计算 \textstyle \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y)\textstyle \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y)。然后可以计算W和b的偏导数

                                    

        反向传播算法的思路如下:给定一个样例 \textstyle (x,y),我们首先进行“前向传导”运算,计算出网络中所有的激活值,包括\textstyle h_{W,b}(x) 的输出值。之后,针对第\textstyle l 层的每一个节点\textstyle i,我们计算出其“残差”\textstyle \delta^{(l)}_i,该残差表明了该节点对最终输出值的残差产生了多少影响。对于最终的输出节点,我们可以直接算出网络产生的激活值与实际值之间的差距,我们将这个差距定义为\textstyle \delta^{(n_l)}_i (第\textstyle n_l 层表示输出层)。对于隐藏单元我们如何处理呢?我们将基于节点(译者注:第\textstyle l+1 层节点)残差的加权平均值计算\textstyle \delta^{(l)}_i,这些节点以\textstyle a^{(l)}_i 作为输入。下面将给出反向传导算法的细节:
        1.进行前馈传导计算,利用前向传导公式,得到 \textstyle L_2, L_3, \ldots 直到输出层\textstyle L_{n_l} 的激活值。

        2.对于第 \textstyle n_l 层(输出层)的每个输出单元\textstyle i,我们根据以下公式计算残差:

                    

        3.对 \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2 的各个层,第\textstyle l 层的第\textstyle i 个节点的残差计算方法如下:            

          

                                        \delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)

        4.计算我们需要的偏导数,计算方法如下:

                                        \begin{align}\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) &= a^{(l)}_j \delta_i^{(l+1)} \\\frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)}.\end{align}

        BP算法核心内容简写:

        1.进行前馈传导计算,利用前向传导公式,得到\textstyle L_2, L_3, \ldots直到输出层\textstyle L_{n_l} 的激活值。

        2.对输出层(第 \textstyle n_l 层),计算:

                                            \begin{align}\delta^{(n_l)}= - (y - a^{(n_l)}) \bullet f'(z^{(n_l)})\end{align}

        3.对于 \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2 的各层,计算:  

                                            \begin{align}\delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)})\end{align}

        4.计算最终需要的偏导数值:

                                            \begin{align}\nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\\nabla_{b^{(l)}} J(W,b;x,y) &= \delta^{(l+1)}.\end{align}

        注意:在以上的第2步和第3步中,我们需要为每一个 \textstyle i 值计算其 \textstyle f'(z^{(l)}_i)。假设 \textstyle f(z) 是sigmoid函数,并且我们已经在前向传导运算中得到了 \textstyle a^{(l)}_i。那么,使用我们早先推导出的 \textstyle f'(z)表达式,就可以计算得到 \textstyle f'(z^{(l)}_i) = a^{(l)}_i (1- a^{(l)}_i)。这也就是为什么要使用Sigmoid函数的原因,导数仍然使用原来函数中的值就可以表示,降低了求导数过程中的运算量。


四、总结


        最后,我们将对梯度下降算法做个全面总结。在下面的伪代码中,\textstyle \Delta W^{(l)} 是一个与矩阵\textstyle W^{(l)} 维度相同的矩阵,\textstyle \Delta b^{(l)} 是一个与 \textstyle b^{(l)} 维度相同的向量。注意这里“\textstyle \Delta W^{(l)}”是一个矩阵,而不是“\textstyle \Delta\textstyle W^{(l)} 相乘”。下面,我们实现批量梯度下降法中的一次迭代:

1.对于对于所有 \textstyle l,令\textstyle \Delta W^{(l)} := 0 ,\textstyle \Delta b^{(l)} := 0 (设置为全零矩阵或全零向量)

2.对于 \textstyle i = 1\textstyle m

                    a.使用反向传播算法计算 \textstyle \nabla_{W^{(l)}} J(W,b;x,y)\textstyle \nabla_{b^{(l)}} J(W,b;x,y)

                    b.计算 \textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y)

                    c.计算 \textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y)

3.更新权重参数:

                                    \begin{align}W^{(l)} &= W^{(l)} - \alpha \left[ \left(\frac{1}{m} \Delta W^{(l)} \right) + \lambda W^{(l)}\right] \\b^{(l)} &= b^{(l)} - \alpha \left[\frac{1}{m} \Delta b^{(l)}\right]\end{align}

    现在,我们可以重复梯度下降法的迭代步骤来减小代价函数 \textstyle J(W,b) 的值,进而求解我们的神经网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值