深度学习基础2(反向传播算法)

转载 2015年11月19日 09:32:04

反向传播算法


我们先是用链式法则解释。比如如下的神经网络
  • 前向传播
对于节点h_1来说,h_1的净输入net_{h_1}如下:
net_{h_1}=w_1\times i_1+w_2\times i_2+b_1\times 1
接着对net_{h_1}做一个sigmoid函数得到节点h_1的输出:
out_{h_1}=\frac{1}{1+e^{-net_{h_1}}}
类似的,我们能得到节点h_2o_1o_2的输出out_{h_2}out_{o_1}out_{o_2}

  • 误差
得到结果后,整个神经网络的输出误差可以表示为:
E_{total}=\sum\frac{1}{2}(target-output)^2
其中output就是刚刚通过前向传播算出来的out_{o_1}out_{o_2}target是节点o_1o_2的目标值。E_{total}用来衡量二者的误差。
这个E_{total}也可以认为是cost function,不过这里省略了防止overfit的regularization term(\sum{w_i^2}
展开得到
E_{total}=E{o_1}+E{o_2}=\frac{1}{2}(target_{o_1}-out_{o_1})^2+\frac{1}{2}(target_{o_2}-out_{o_2})^2

  • 后向传播
对输出层的w_5
通过梯度下降调整w_5,需要求\frac{\partial {E_{total}}}{\partial {w_5}},由链式法则:
\frac{\partial {E_{total}}}{\partial {w_5}}=\frac{\partial {E_{total}}}{\partial {out_{o_1}}}\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}\frac{\partial {net_{o_1}}}{\partial {w_5}}
如下图所示:
<img src="https://pic4.zhimg.com/50/f2d8768af0d9264687905a0134dae927_hd.png" data-rawwidth="525" data-rawheight="257" class="origin_image zh-lightbox-thumb" width="525" data-original="https://pic4.zhimg.com/f2d8768af0d9264687905a0134dae927_r.png">\frac{\partial {E_{total}}}{\partial {out_{o_1}}}=\frac{\partial}{\partial {out_{o_1}}}(\frac{1}{2}(target_{o_1}-out_{o_1})^2+\frac{1}{2}(target_{o_2}-out_{o_2})^2)=-(target_{o_1}-out_{o_1})
\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}=\frac{\partial }{\partial {net_{o_1}}}\frac{1}{1+e^{-net_{o_1}}}=out_{o_1}(1-out_{o_1})
\frac{\partial {net_{o_1}}}{\partial {w_5}}=\frac{\partial}{\partial {w_5}}(w_5\times out_{h_1}+w_6\times out_{h_2}+b_2\times 1)=out_{h_1}
以上3个相乘得到梯度\frac{\partial {E_{total}}}{\partial {w_5}},之后就可以用这个梯度训练了:
w_5^+=w_5-\eta \frac{\partial {E_{total}}}{\partial {w_5}}
很多教材比如Stanford的课程,会把中间结果\frac{\partial {E_{total}}}{\partial {net_{o_1}}}=\frac{\partial {E_{total}}}{\partial {out_{o_1}}}\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}记做\delta_{o_1},表示这个节点对最终的误差需要负多少责任。。所以有\frac{\partial {E_{total}}}{\partial {w_5}}=\delta_{o_1}out_{h_1}



对隐藏层的  w_1
通过梯度下降调整w_1,需要求\frac{\partial {E_{total}}}{\partial {w_1}},由链式法则:
\frac{\partial {E_{total}}}{\partial {w_1}}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}\frac{\partial {net_{h_1}}}{\partial {w_1}}
如下图所示:
<img src="https://pic3.zhimg.com/50/d50d1d812f0f036b8c5cb389e463b01a_hd.png" data-rawwidth="612" data-rawheight="494" class="origin_image zh-lightbox-thumb" width="612" data-original="https://pic3.zhimg.com/d50d1d812f0f036b8c5cb389e463b01a_r.png">参数参数w_1影响了net_{h_1},进而影响了out_{h_1},之后又影响到E_{o_1}E_{o_2}
求解每个部分:
\frac{\partial {E_{total}}}{\partial {out_{h_1}}}=\frac{\partial {E_{o_1}}}{\partial {out_{h_1}}}+\frac{\partial {E_{o_2}}}{\partial {out_{h_1}}}
其中\frac{\partial {E_{o_1}}}{\partial {out_{h_1}}}=\frac{\partial {E_{o_1}}}{\partial {net_{o_1}}}\times \frac{\partial {net_{o_1}}}{\partial {out_{h_1}}}=\delta_{o_1}\times \frac{\partial {net_{o_1}}}{\partial {out_{h_1}}}=\delta_{o_1}\times \frac{\partial}{\partial {out_{h_1}}}(w_5\times out_{h_1}+w_6\times out_{h_2}+b_2\times 1)=\delta_{o_1}w_5,这里\delta_{o_1}之前计算过。
\frac{\partial {E_{o_2}}}{\partial {out_{h_1}}}的计算也类似,所以得到
\frac{\partial {E_{total}}}{\partial {out_{h_1}}}=\delta_{o_1}w_5+\delta_{o_2}w_7
\frac{\partial {E_{total}}}{\partial {w_1}}的链式中其他两项如下:
\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}=out_{h_1}(1-out_{h_1})
\frac{\partial {net_{h_1}}}{\partial {w_1}}=\frac{\partial }{\partial {w_1}}(w_1\times i_1+w_2\times i_2+b_1\times 1)=i_1
相乘得到
\frac{\partial {E_{total}}}{\partial {w_1}}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}\frac{\partial {net_{h_1}}}{\partial {w_1}}=(\delta_{o_1}w_5+\delta_{o_2}w_7)\times out_{h_1}(1-out_{h_1}) \times i_1
得到梯度后,就可以对w_1迭代了:
w_1^+=w_1-\eta \frac{\partial{E_{total}}}{\partial{w_1}}
在前一个式子里同样可以对\delta_{h_1}进行定义,\delta_{h_1}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}=(\delta_{o_1}w_5+\delta_{o_2}w_7)\times out_{h_1}(1-out_{h_1}) =(\sum_o \delta_ow_{ho})\times out_{h_1}(1-out_{h_1}) ,所以整个梯度可以写成\frac{\partial {E_{total}}}{\partial {w_1}}=\delta_{h_1}\times i_1

=======================
上述\delta就是教程Unsupervised Feature Learning and Deep Learning Tutorial 中第三步计算的由来。。
<img src="https://pic3.zhimg.com/50/2d29c11b1c9da7652c63f01d5e31284e_hd.jpg" data-rawwidth="822" data-rawheight="428" class="origin_image zh-lightbox-thumb" width="822" data-original="https://pic3.zhimg.com/2d29c11b1c9da7652c63f01d5e31284e_r.jpg">

所谓的后向传播,其实就是『将来在宣传传播上出了偏差,你们要负责的!』,每一个节点负责的量用\delta表示,那么,隐藏节点需要负责的量,就由输出节点负责的量一层层往前传导。

参考:
【1】A Step by Step Backpropagation Example
【2】Unsupervised Feature Learning and Deep Learning Tutorial


假设我们有一个固定样本集 \textstyle \{ (x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)}) \},它包含 \textstyle m 个样例。我们可以用批量梯度下降法来求解神经网络。具体来讲,对于单个样例 \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 b^{(l)}_i,比如我们在 \textstyle J(W, b) 的定义中就没有使用。一般来说,将偏置项包含在权重衰减项中只会对最终的神经网络产生很小的影响。如果你在斯坦福选修过CS229(机器学习)课程,或者在YouTube上看过课程视频,你会发现这个权重衰减实际上是课上提到的贝叶斯规则化方法的变种。在贝叶斯规则化方法中,我们将高斯先验概率引入到参数中计算MAP(极大后验)估计(而不是极大似然估计)。]


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


以上的代价函数经常被用于分类和回归问题。在分类问题中,我们用 \textstyle y = 0 或 \textstyle 1,来代表两种类型的标签(回想一下,这是因为 sigmoid激活函数的值域为 \textstyle [0,1];如果我们使用双曲正切型激活函数,那么应该选用 \textstyle -1 和 \textstyle +1 作为标签)。对于回归问题,我们首先要变换输出值域(译者注:也就是 \textstyle y),以保证其范围为 \textstyle [0,1] (同样地,如果我们使用双曲正切型激活函数,要使输出值域为 \textstyle [-1,1])。


我们的目标是针对参数 \textstyle W 和 \textstyle b 来求其函数 \textstyle J(W,b) 的最小值。为了求解神经网络,我们需要将每一个参数 \textstyle W^{(l)}_{ij} 和 \textstyle b^{(l)}_i 初始化为一个很小的、接近零的随机值(比如说,使用正态分布 \textstyle {Normal}(0,\epsilon^2) 生成的随机值,其中 \textstyle \epsilon 设置为 \textstyle 0.01,之后对目标函数使用诸如批量梯度下降法的最优化算法。因为 \textstyle J(W, b) 是一个非凸函数,梯度下降法很可能会收敛到局部最优解;但是在实际应用中,梯度下降法通常能得到令人满意的结果。最后,需要再次强调的是,要将参数进行随机初始化,而不是全部置为 \textstyle 0。如果所有参数都用相同的值作为初始值,那么所有隐藏层单元最终会得到与输入值有关的、相同的函数(也就是说,对于所有 \textstyle i\textstyle W^{(1)}_{ij}都会取相同的值,那么对于任何输入 \textstyle x 都会有:\textstyle a^{(2)}_1 = a^{(2)}_2 = a^{(2)}_3 = \ldots )。随机初始化的目的是使对称失效


梯度下降法中每一次迭代都按照如下公式对参数 \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 是学习速率。其中关键步骤是计算偏导数。我们现在来讲一下反向传播算法,它是计算偏导数的一种有效方法


我们首先来讲一下如何使用反向传播算法来计算 \textstyle \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) 和 \textstyle \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y),这两项是单个样例 \textstyle (x,y) 的代价函数 \textstyle J(W,b;x,y) 的偏导数。一旦我们求出该偏导数,就可以推导出整体代价函数 \textstyle J(W,b) 的偏导数:


\begin{align}\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) &=\left[ \frac{1}{m} \sum_{i=1}^m \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \right] + \lambda W_{ij}^{(l)} \\\frac{\partial}{\partial b_{i}^{(l)}} J(W,b) &=\frac{1}{m}\sum_{i=1}^m \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x^{(i)}, y^{(i)})\end{align}

以上两行公式稍有不同,第一行比第二行多出一项,是因为权重衰减是作用于 \textstyle W 而不是 \textstyle 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 作为输入。

具体BP算法的数学推导请参照机器学习《BP算法详谈》。


中英文对照

反向传播算法 Backpropagation Algorithm
(批量)梯度下降法 (batch) gradient descent
(整体)代价函数 (overall) cost function
方差 squared-error
均方差 average sum-of-squares error
规则化项 regularization term
权重衰减 weight decay
偏置项 bias terms
贝叶斯规则化方法 Bayesian regularization method
高斯先验概率 Gaussian prior
极大后验估计 MAP
极大似然估计 maximum likelihood estimation
激活函数 activation function
双曲正切函数 tanh function
非凸函数 non-convex function
隐藏层单元 hidden (layer) units
对称失效 symmetry breaking
学习速率 learning rate
前向传导 forward pass
假设值 hypothesis
残差 error term
加权平均值 weighted average
前馈传导 feedforward pass
阿达马乘积 Hadamard product
前向传播 forward propagation

神经网络通俗指南:一文看懂神经网络工作原理

现在谈人工智能已经绕不开“神经网络”这个词了。人造神经网络粗线条地模拟人脑,使得计算机能够从数据中学习。 机器学习这一强大的分支结束了 AI 的寒冬,迎来了人工智能的新时代。简而言之...
  • u011001084
  • u011001084
  • 2017年04月18日 13:44
  • 263

【直观理解】一文搞懂RNN(循环神经网络)基础篇

推荐阅读时间8min~15min 主要内容简介:神经网络基础、为什么需要RNN、RNN的具体结构、以及RNN应用和一些结论 1神经网络基础 神...
  • UFv59to8
  • UFv59to8
  • 2017年12月07日 00:00
  • 155

一文读懂BP神经网络

转自一位懂生活的女神的博客园的文章。http://www.cnblogs.com/charlotte77/p/5629865.html  最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程...
  • accumulate_zhang
  • accumulate_zhang
  • 2016年11月24日 18:49
  • 1144

英文论文写作——令人头疼的时态问题!

英文论文写作时态 笔者注: 艾思特科学编修是台湾一家专门从事为科研人员编修发表论文的机构。 研究生2.0是一位在美国读博士的台湾人创建的博客,地址已被天朝的防火墙挡在门外,我会不时的挑选一些有用...
  • lcj_cjfykx
  • lcj_cjfykx
  • 2014年05月27日 09:38
  • 9558

一文搞懂LSTM 网络

人们的每次思考并不都是从零开始的。比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始。你的记忆是有持久性的。...
  • zchang81
  • zchang81
  • 2017年07月20日 13:19
  • 346

一文搞懂LSTM 网络

循环神经网络(RNN) 人们的每次思考并不都是从零开始的。比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始。你的记...
  • jzrita
  • jzrita
  • 2018年01月09日 00:38
  • 28

初步了解DeepLearning----《一天搞懂深度学习》

https://www.bilibili.com/video/av16543434/?from=search&seid=12028936768099284481 在B站看了一个讲解李宏毅教授...
  • xueying_2017
  • xueying_2017
  • 2017年12月17日 16:17
  • 256

一文读懂卷积神经网络

转自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 自今年七月份以来,一直在实验室负责卷积神经网络(Convolution...
  • u012943043
  • u012943043
  • 2016年02月23日 17:12
  • 2782

一天搞懂机器学习PPT笔记-2

Tips for Training DNNminimize total lossmore layers do not imply better - so it is hard to get the ...
  • toyijiu
  • toyijiu
  • 2017年06月22日 21:32
  • 415

【286页干货】一天搞懂深度学习(台湾资料科学年会课程)

1新智元编译1来源:Linkedin译者:胡祥杰【新智元导读】本文是2016 台湾资料科学年会前导课程“一天搞懂深度学习”的全部讲义PPT(共268页),由台湾大学电机工程学助理教授李宏毅主讲。作者在...
  • Scythe666
  • Scythe666
  • 2017年07月19日 19:42
  • 2095
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习基础2(反向传播算法)
举报原因:
原因补充:

(最多只允许输入30个字)