机器学习入门之机器学习之反向传播算法
小标 2018-10-15 来源 : 阅读 1042 评论 0

摘要:本文主要向大家介绍了机器学习入门之机器学习之反向传播算法,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

本文主要向大家介绍了机器学习入门之机器学习之反向传播算法,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。


 这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项δδ,如何计算ΔΔ的矩阵,以及如何用Matlab去实现后向传播,然而最关键的问题——为什么要这么计算?前面计算的这些量到底代表着什么,Ng基本没有讲解,也没有给出数学的推导的例子。所以这次内容我不打算照着公开课的内容去写,在查阅了许多资料后,我想先从一个简单的神经网络的梯度推导入手,理解后向传播算法的基本工作原理以及每个符号代表的实际意义,然后再按照课程的给出BP计算的具体步骤,这样更有助于理解。

简单神经网络的后向传播(Backpropagration, BP)算法
1. 回顾之前的前向传播(ForwardPropagration, FP)算法
FP算法还是很简单的,说白了就是根据前一层神经元的值,先加权然后取sigmoid函数得到后一层神经元的值,写成数学的形式就是:
 
a(1)=Xa(1)=X
 
 
z(2)=Θ(1)a(1)z(2)=Θ(1)a(1)
 
 
a(2)=g(z(2))a(2)=g(z(2))
 
 
z(3)=Θ(2)a(2)z(3)=Θ(2)a(2)
 
 
a(3)=g(z(3))a(3)=g(z(3))
 
 
z(4)=Θ(3)a(3)z(4)=Θ(3)a(3)
 
 
a(4)=g(z(4))a(4)=g(z(4))
 
2. 回顾神经网络的代价函数(不含regularization项)
J(Θ)=?1m[∑i=1m∑k=1Ky(i)klog(hθ(x(i)))k+(1?y(i)k)log(1?(hθ(x(i)))k)]J(Θ)=?1m[∑i=1m∑k=1Kyk(i)log(hθ(x(i)))k+(1?yk(i))log(1?(hθ(x(i)))k)]
3. 一个简单神经网络的BP推导过程
BP算法解决了什么问题?我们已经有了代价函数J(Θ)J(Θ),接下来我们需要利用梯度下降算法(或者其他高级优化算法)对J(Θ)J(Θ)进行优化从而得到训练参数ΘΘ,然而关键问题是,优化算法需要传递两个重要的参数,一个代价函数J(Θ)J(Θ),另一个是代价函数的梯度?J(Θ)?Θ?J(Θ)?Θ,BP算法其实就是解决如何计算梯度的问题。
下面我们从一个简单的例子入手考虑如何从数学上计算代价函数的梯度,考虑如下简单的神经网络(为方便起见,途中已经给出了前向传播(FP)的计算过程),该神经网络有三层神经元,对应的有两个权重矩阵Θ(1)Θ(1)和Θ(2)Θ(2),为计算梯度我们只需要计算两个偏导数即可:?J(Θ)?Θ(1)?J(Θ)?Θ(1)和?J(Θ)?Θ(2)?J(Θ)?Θ(2)。

首先我们先计算第2个权重矩阵的偏导数,即??Θ(2)J(Θ)??Θ(2)J(Θ)。首先我们需要在J(Θ)J(Θ)和Θ(2)Θ(2)之间建立联系,很容易可以看到J(Θ)J(Θ)的值取决于hθ(x)hθ(x),而hθ(x)=a(3)hθ(x)=a(3), a3a3又是由z(3)z(3)取sigmoid得到,最后z(3)=Θ(2)×a(2)z(3)=Θ(2)×a(2),所以他们之间的联系可以如下表示:

按照求导的链式法则,我们可以先求J(Θ)J(Θ)对z(3)z(3)的导数,然后乘以z(3)z(3)对Θ(2)Θ(2)的导数,即
 
??Θ(2)J(Θ)=??z(3)J(Θ)×?z(3)?Θ(2)??Θ(2)J(Θ)=??z(3)J(Θ)×?z(3)?Θ(2)
 
由z(3)=Θ(2)a(2)z(3)=Θ(2)a(2)不难计算?z(3)?Θ(2)=(a(2))T?z(3)?Θ(2)=(a(2))T,令??z(3)J(Θ)=δ(3)??z(3)J(Θ)=δ(3),上式可以重写为
 
??Θ(2)J(Θ)=δ(3)(a(2))T??Θ(2)J(Θ)=δ(3)(a(2))T
 
接下来仅需要计算δ(3)δ(3)即可,由上一章的内容我们已经知道g′(z)=g(z)(1?g(z))g′(z)=g(z)(1?g(z)), hθ(x)=a(3)=g(z(3))hθ(x)=a(3)=g(z(3)),忽略前面的1/m∑i=1m1/m∑i=1m(这里我们只对一个example推导,最后累加即可)
 
δ(3)=?J(Θ)z(3)=(?y)1g(z(3))g′(z(3))?(1?y)11?g(z(3))[1?g(z(3))]′=?y(1?g(z(3)))+(1?y)g(z(3))=?y+g(z(3))=?y+a(3)δ(3)=?J(Θ)z(3)=(?y)1g(z(3))g′(z(3))?(1?y)11?g(z(3))[1?g(z(3))]′=?y(1?g(z(3)))+(1?y)g(z(3))=?y+g(z(3))=?y+a(3)
 
至此我们已经得到J(Θ)J(Θ)对Θ(2)Θ(2)的偏导数,即
 
?J(Θ)?Θ(2)=(a(2))Tδ(3)?J(Θ)?Θ(2)=(a(2))Tδ(3)
 
 
δ(3)=a(3)?yδ(3)=a(3)?y
 
接下来我们需要求J(Θ)J(Θ)对Θ(1)Θ(1)的偏导数,J(Θ)J(Θ)对Θ(1)Θ(1)的依赖关系如下:

根据链式求导法则有
 
?J(Θ)?Θ(1)=?J(Θ)?z(3)?z(3)?a(2)?a(2)?Θ(1)?J(Θ)?Θ(1)=?J(Θ)?z(3)?z(3)?a(2)?a(2)?Θ(1)
 
我们分别计算等式右边的三项可得:
 
?J(Θ)?z(3)=δ(3)?J(Θ)?z(3)=δ(3)
 
 
?z(3)?a(2)=(Θ(2))T?z(3)?a(2)=(Θ(2))T
 
 
?a(2)?Θ(1)=?a(2)?z(2)?z(2)?Θ(1)=g′(z(2))a(1)?a(2)?Θ(1)=?a(2)?z(2)?z(2)?Θ(1)=g′(z(2))a(1)
 
带入后得
 
?J(Θ)?Θ(1)=(a(1))Tδ(3)(Θ(2))Tg′(z(2))?J(Θ)?Θ(1)=(a(1))Tδ(3)(Θ(2))Tg′(z(2))
 
令δ(2)=δ(3)(Θ(2))Tg′(z(2))δ(2)=δ(3)(Θ(2))Tg′(z(2)), 上式可以重写为
 
?J(Θ)?Θ(1)=(a(1))Tδ(2)?J(Θ)?Θ(1)=(a(1))Tδ(2)
 
 
δ(2)=δ(3)(Θ(2))Tg′(z(2))δ(2)=δ(3)(Θ(2))Tg′(z(2))
 
把上面的结果放在一起,我们得到J(Θ)J(Θ)对两个权重矩阵的偏导数为:
 
δ(3)=a(3)?yδ(3)=a(3)?y
 
 
?J(Θ)?Θ(2)=(a(2))Tδ(3)?J(Θ)?Θ(2)=(a(2))Tδ(3)
 
 
δ(2)=δ(3)(Θ(2))Tg′(z(2))δ(2)=δ(3)(Θ(2))Tg′(z(2))
 
 
?J(Θ)?Θ(1)=(a(1))Tδ(2)?J(Θ)?Θ(1)=(a(1))Tδ(2)
 
观察上面的四个等式,我们发现

偏导数可以由当前层神经元向量a(l)a(l)与下一层的误差向量δ(l+1)δ(l+1)相乘得到
当前层的误差向量δ(l)δ(l)可以由下一层的误差向量δ(l+1)δ(l+1)与权重矩阵ΔlΔl的乘积得到

所以可以从后往前逐层计算误差向量(这就是后向传播的来源),然后通过简单的乘法运算得到代价函数对每一层权重矩阵的偏导数。到这里算是终于明白为什么要计算误差向量,以及为什么误差向量之间有递归关系了。尽管这里的神经网络十分简单,推导过程也不是十分严谨,但是通过这个简单的例子,基本能够理解后向传播算法的工作原理了。
严谨的后向传播算法(计算梯度)
假设我们有mm个训练example,LL层神经网络,并且此处考虑正则项,即
J(Θ)=?1m[∑i=1m∑k=1Ky(i)klog(hθ(x(i)))k+(1?y(i)k)log(1?(hθ(x(i)))k)]+λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θ(l)ji)2J(Θ)=?1m[∑i=1m∑k=1Kyk(i)log(hθ(x(i)))k+(1?yk(i))log(1?(hθ(x(i)))k)]+λ2m∑l=1L?1∑i=1sl∑j=1sl+1(Θji(l))2
初始化:设置Δ(l)ij=0Δij(l)=0 (理解为对第ll层的权重矩阵的偏导累加值)
For i = 1 : m

设置 a(1)=Xa(1)=X
通过前向传播算法(FP)计算对各层的预测值a(l)a(l),其中l=2,3,4,…,Ll=2,3,4,…,L
计算最后一层的误差向量 δ(L)=a(L)?yδ(L)=a(L)?y,利用后向传播算法(BP)从后至前逐层计算误差向量 δ(L?1),δ(L?1),…,δ(2)δ(L?1),δ(L?1),…,δ(2), 计算公式为δ(l)=(Θ(l))Tδ(l+1).?g′(z(l))δ(l)=(Θ(l))Tδ(l+1).?g′(z(l))
更新Δ(l)=Δ(l)+δ(l+1)(a(l))TΔ(l)=Δ(l)+δ(l+1)(a(l))T

end // for
计算梯度:
 
D(l)ij=1mΔ(l)ij,j=0Dij(l)=1mΔij(l),j=0
 
 
D(l)ij=1mΔ(l)ij+λmΘ(l)ij,j≠0Dij(l)=1mΔij(l)+λmΘij(l),j≠0
 
 
?J(Θ)?Θ(l)=D(l)?J(Θ)?Θ(l)=D(l)
 
BP实际运用中的技巧
1. 将参数展开成向量
对于四层三个权重矩阵参数Θ(1),Θ(2),Θ(3)Θ(1),Θ(2),Θ(3)将其展开成一个参数向量,Matlab code如下: 

thetaVec = [Theta1(:); Theta2(:); Theta3(:)];

2. 梯度检查
为了保证梯度计算的正确性,可以用数值解进行检查,根据导数的定义
 
dJ(θ)dθ≈J(θ+?)?J(θ??)2?dJ(θ)dθ≈J(θ+?)?J(θ??)2?
 
Matlab Code 如下

for i = 1 : n
    thetaPlus = theta;
    thetaPlus(i) = thetaPlus(i) + EPS;
    thetaMinus = theta;
    thetaMinus(i) = thetaMinus(i) - EPS;
    gradApprox(i) = (J(thetaPlus) - J(thetaMinus)) / (2 * EPS);
end

最后检查 gradApprox 是否约等于之前计算的梯度值即可。需要注意的是:因为近似的梯度计算代价很大,在梯度检查后记得关闭梯度检查的代码。
3. 随机初始化
初始权重矩阵的初始化应该打破对称性 (symmetry breaking),避免使用全零矩阵进行初始化。可以采用随机数进行初始化,即 Θ(l)ij∈[??,+?]Θij(l)∈[??,+?]
如何训练一个神经网络

随机初始化权重矩阵
利用前向传播算法(FP)计算模型预测值hθ(x)hθ(x)
计算代价函数J(Θ)J(Θ)
利用后向传播算法(BP)计算代价函数的梯度 ?J(Θ)?Θ(l)?J(Θ)?Θ(l)
利用数值算法进行梯度检查(gradient checking),确保正确后关闭梯度检查
利用梯度下降(或者其他优化算法)求得最优参数ΘΘ

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程