神经网络,反向传播推导(超简单版)



* 神经网络,反向传播推导(超简单版)
<https://blog.csdn.net/weixin_40920228/article/details/80709216#神经网络反向传播推导超简单版>
*
* 标注与说明 <https://blog.csdn.net/weixin_40920228/article/details/80709216#标注与说明>
* 明确我们的题目
<https://blog.csdn.net/weixin_40920228/article/details/80709216#明确我们的题目>
* 解题思路 <https://blog.csdn.net/weixin_40920228/article/details/80709216#解题思路>
* 寻找本层’误差’与下一层’误差’之间的关系
<https://blog.csdn.net/weixin_40920228/article/details/80709216#寻找本层误差与下一层误差之间的关系>
* 反向传递的’误差’(形象版-可忽略本小节)
<https://blog.csdn.net/weixin_40920228/article/details/80709216#反向传递的误差形象版-可忽略本小节>
* 确定 输出层’误差’的值
<https://blog.csdn.net/weixin_40920228/article/details/80709216#确定-输出层误差的值>
* 最后一步 <https://blog.csdn.net/weixin_40920228/article/details/80709216#最后一步>
* 描述一个针对m个样本的训练循环
<https://blog.csdn.net/weixin_40920228/article/details/80709216#描述一个针对m个样本的训练循环>


标注与说明

* θ(l)i,jθi,j(l)表明从(l)(l)层的第i个元素到(l+)(l+)层的第j个元素的θθ。这样的次序是指明了θ(l)θ(l)矩阵的排列次序。θ
(l)i,jθi,j(l)表明参数矩阵θ(l)θ(l)里的每一行为一个a(l)jaj(l)所对应的参数。
* l 表示网络的层数=1,2,3….L(L=网络总层数-1)
* a(l)j=g′(z(l)j)=sigmoid′(z(l)j)aj(l)=g′(zj(l))=sigmoid′(zj(l))
* J(Θ)==C(Θ)=−1m∑mi=1∑kk=1[y(i)klog((hΘ(x(i)))k)+(1−y(i)k)log(1−(hΘ(x(i)))k)]+
λ2m∑L−1l=1∑sli=1∑s(l+1)j=1(Θ(l)j,i)2J(Θ)==C(Θ)=−1m∑i=1m∑k=1k[yk(i)log((hΘ(x(i)))
k)+(1−yk(i))log(1−(hΘ(x(i)))k)]+λ2m∑l=1L−1∑i=1sl∑j=1s(l+1)(Θj,i(l))2
* slsl表面a(l)a(l)的神经元个数是ss个。
明确我们的题目

在完成一次前向传播后,已知J(Θ)J(Θ)也就是已知(y^,y)(y^,y),为了实现梯度下降:θ(l):=θ(l)−∂C∂θ(l)θ(l):=θ(l)−∂C
∂θ(l)。我们需要求∂C∂θ(l)∂C∂θ(l)

解题思路


δδ在很多书中翻译为‘误差’,但这与模型预测值与样本y之间的误差不是一个概念。实际上δδ是一个微分值。我们定义δ(l)=∂C∂z(l)δ(l)=∂C∂z(l)
。有了这个中间值设定,可以简化我们的计算,不用对每一层θθ的偏导计算都从网络的输出层开始重新计算一遍。至于为什么将这个中间值设定在∂C∂z(l)∂C∂z(l)
,据我的理解是两个原因:1、这是离我们要求导的θ(l)θ(l)最靠近的一个元素。2、你也可以把这个中间值设定在∂C∂a(l)∂C∂a(l)
,但这样在推导后的公式表达上比较繁琐,不易直观理解。事实上没有这个中间值你也能完整表达整个网络的梯度求导,只不过那个公式肯定充满了∑∑会让你看着头晕。
如果你知道了δ(l)=∂C∂z(l)δ(l)=∂C∂z(l)的数值,那么据此求解∂C∂θ(l)=∂C∂z(l)⋅∂z(l)∂θ(l)=δ(l)⋅∂z(l)∂θ
(l)∂C∂θ(l)=∂C∂z(l)⋅∂z(l)∂θ(l)=δ(l)⋅∂z(l)∂θ(l)就变得简单多了。
再进一步,如果我们找到δ(l)δ(l)与δ(l+1)δ(l+1)之间的关系,在反向传播中,我们刚好可以从输出层往输入层方向一层层的计算下去。

寻找本层’误差’与下一层’误差’之间的关系

寻找δ(l)δ(l)与δ(l+1)δ(l+1)之间的关系

要寻找δ(l)δ(l)与δ(l+1)δ(l+1)之间的关系之前,就得明确一点δ(l+1)δ(l+1)是如何把‘误差’传给a(l)a(l)的。
先不说那么多,还是直接进行微分入手,已知:z(l+1)=θ(l)⋅sigmoid(z(l))z(l+1)=θ(l)⋅sigmoid(z(l));sigmoi
d′(z(l))=a(l)⋅(1−a(l))sigmoid′(z(l))=a(l)⋅(1−a(l))


δ(l)=∂C∂z(l)=∂C∂z(l+1)⋅∂z(l+1)∂z(l)=δ(l+1)⋅(θ(l))T⋅a(l)⋅(1−a(l))δ(l)=∂C∂z(l)=∂C
∂z(l+1)⋅∂z(l+1)∂z(l)=δ(l+1)⋅(θ(l))T⋅a(l)⋅(1−a(l))


很简单吧。不过这里的微分都是直接对矩阵的操作∇∇是更恰当的计算标识。从另一方面说,如果你把网络简化成1->1->1->1的结构,以上推导就直接成立了。
Nice!!!
通过上面的公式我们可以看到∂C∂a(l)=(θ(l))T⋅δl+1∂C∂a(l)=(θ(l))T⋅δl+1,怎么感觉和正向传播差不多啊,可以看出来参数矩阵θ
(l)θ(l)作用前向传播,而它的转置就能作用于梯度的反向传播。

反向传递的’误差’(形象版-可忽略本小节)

见上图中的橙色节点(a(l)1a1(l))在前向传播中,它通过[θ(l)1,1;θ(l)2,1;…;θ(l)i,1](i=s(l))[θ1,1(l);θ2,1
(l);…;θi,1(l)](i=s(l)) 将线性转换的数值传给了[z(l+1)1,1;z(l+1)2,1;…,z(l+1)i,1][z1,1(l+1);z2
,1(l+1);…,zi,1(l+1)]。那么在反向传播中,a(l)1a1(l)的误差也要汇聚[δ(l+1)1,δ(l+1)2,…,δ(l+1)i]=δ(l+1
)[δ1(l+1),δ2(l+1),…,δi(l+1)]=δ(l+1)的’误差’。但是汇聚这些‘误差’的时候需要考虑当初前向传播时的[θ(l)1,1,θ(l)2
,1,…,θ(l)i,1][θ1,1(l),θ2,1(l),…,θi,1(l)]里不同θθ所占的比重。例如:前向传播时若θ(l)2,1=0θ2,1(l)=0
,那么产生的误差跟它就没关系,那么反向传播的’误差’通过θ(l)2,1θ2,1(l)
传递后也是0。当然这只是举例,一旦网络中的参数变为了0,那么它对应的神经元其实已经‘死亡’没有任何的意义。一般在初始化参数时不会让它们设成0,并需要打破平衡性。


θ=⎡⎣⎢⎢⎢⎢⎢⎢θ(l)1,1θ(l)2,1…θ(l)s(l),1θ(l)1,2…θ(l)1,slθ(l)2,2…θ(l)2,slθ(l)s(l),2…θ
(l)s(l),sl⎤⎦⎥⎥⎥⎥⎥⎥(说明:a(l)1前向传播的参数在第一列)θ=[θ1,1(l)θ1,2(l)…θ1,sl(l)θ2,1(l)θ2,2(l)…
θ2,sl(l)…θs(l),1(l)θs(l),2(l)…θs(l),sl(l)](说明:a1(l)前向传播的参数在第一列)



bθ=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢θ(l)1,1∑s(l)i=1θ(l)i,1θ(l)2,1∑s(l)i=1θ(l)i,1…θ(l)s(l),1∑s(l)i=1
θ(l)i,1θ(l)1,2∑s(l)i=1θ(l)i,2…θ(l)1,sl∑s(l)i=1θ(l)i,slθ(l)2,2∑s(l)i=1θ(l)i,2…θ(l
)2,sl∑s(l)i=1θ(l)i,slθ(l)s(l),2∑s(l)i=1θ(l)i,2…θ(l)s(l),sl∑s(l)i=1θ(l)i,sl⎤⎦⎥⎥⎥⎥
⎥⎥⎥⎥⎥⎥⎥(转变为参数权重的矩阵)bθ=[θ1,1(l)∑i=1s(l)θi,1(l)θ1,2(l)∑i=1s(l)θi,2(l)…θ1,sl(l)∑i=1
s(l)θi,sl(l)θ2,1(l)∑i=1s(l)θi,1(l)θ2,2(l)∑i=1s(l)θi,2(l)…θ2,sl(l)∑i=1s(l)θi,sl(l
)…θs(l),1(l)∑i=1s(l)θi,1(l)θs(l),2(l)∑i=1s(l)θi,2(l)…θs(l),sl(l)∑i=1s(l)θi,sl(l)
](转变为参数权重的矩阵)
如果只保留每一列θθ之间的比例大小关系,其实可以将分母都去掉来进行简化(每一列的分母都是一样的)。
bθ=θ=⎡⎣⎢⎢⎢⎢⎢⎢⎢||θ(l)n,1||||θ(l)n,2||…|…|…θ(l)n,sl…|…|⎤⎦⎥⎥⎥⎥⎥⎥⎥(n=1,2,.....s(l+1
))bθ=θ=[||…|||…|θn,1(l)θn,2(l)…θn,sl(l)||…|||…|](n=1,2,.....s(l+1))
我们的δl+1δl+1是这样的形式:
δ=⎡⎣⎢⎢⎢⎢⎢⎢δ(l+1)1δ(l+1)2…δ(l+1)s(l+1)⎤⎦⎥⎥⎥⎥⎥⎥(是一个s(l+1)∗1的矩阵)δ=[δ1(l+1)δ2(l+1)…
δs(l+1)(l+1)](是一个s(l+1)∗1的矩阵)
根据矩阵乘法的性质,我们只要让这两矩阵相乘就能反向求出∂a(l)∂a(l)的’误差’值:
∂C∂a(l)=(θ(l))T⋅δl+1∂C∂a(l)=(θ(l))T⋅δl+1
可以看出来参数矩阵θ(l)θ(l)作用前向传播,而它的转置就能作用于梯度的反向传播。
这下好办了,我们知道a(l)=g(z(l))=sigmoid(z(l))a(l)=g(z(l))=sigmoid(z(l)),那么继续往前推:
∂C∂z(l)=∂C∂a(l)⋅∂a(l)∂z(l)=(θ(l))T⋅δl+1⋅g′(z(l))=(θ(l))T⋅δl+1⋅a(l)⋅(1−a(l))∂C∂z
(l)=∂C∂a(l)⋅∂a(l)∂z(l)=(θ(l))T⋅δl+1⋅g′(z(l))=(θ(l))T⋅δl+1⋅a(l)⋅(1−a(l))
现在我们也找到他们之间的关系了:
∂C∂z(l)=δ(l)=(θ(l))T⋅δl+1⋅a(l)⋅(1−a(l))∂C∂z(l)=δ(l)=(θ(l))T⋅δl+1⋅a(l)⋅(1−a(l))


确定 输出层’误差’的值

确定δ(L)δ(L)的值
完成了上面的计算流程,我们已经完成了反向求导计算工作的70%了。我们知道了δ(l)δ(l)与δ(l+1)δ(l+1)
之间的关系,就能从输出层一层层的往输入层推。但是在输出层因为没有下一层节点,所以δ(L)δ(L)的值需要用另一种方式确定。回顾一下神经网络的损失函数:

J(θ)=−1m∑i=1m∑k=1k[y(i)klog((hΘ(x(i)))k)+(1−y(i)k)log(1−(hΘ(x(i)))k)]+λ2m∑l=1L−
1∑i=1sl∑j=1s(l+1)(Θ(l)j,i)2J(θ)=−1m∑i=1m∑k=1k[yk(i)log((hΘ(x(i)))k)+(1−yk(i))log
(1−(hΘ(x(i)))k)]+λ2m∑l=1L−1∑i=1sl∑j=1s(l+1)(Θj,i(l))2
在本文中J(Θ)==C(Θ)J(Θ)==C(Θ)都表达损失函数,J(Θ)J(Θ)考虑单条训练样本省略m,将输出值作为整体计算,即将ykyk表达为yy
,同时省略正则项可以表示为:J(θ)=C(θ)=−[y⋅log(a(L))+(1−y)log(1−a(L))]J(θ)=C(θ)=−[y⋅log(a(L))+(
1−y)log(1−a(L))]
∂C∂z(L)=∂J(Θ)∂a(L)⋅∂a(L)∂z(L)⋅∂C∂z(L)=∂J(Θ)∂a(L)⋅∂a(L)∂z(L)⋅
∂C∂a(L)=a(L)−y(1−a(L))⋅a(L)∂C∂a(L)=a(L)−y(1−a(L))⋅a(L)
∂a(L)∂z(L)=a(L)⋅(1−a(L))∂a(L)∂z(L)=a(L)⋅(1−a(L))
∂C∂z(L)=δ(L)=a(L)−y∂C∂z(L)=δ(L)=a(L)−y


最后一步

已知∂C∂z(l)=δ(l)∂C∂z(l)=δ(l)的具体数值的情况下,求∂C∂θ(l)∂C∂θ(l)。已知:z(l+1)=a(l)⋅θ(l)z(l+1)=a
(l)⋅θ(l)

∂C∂θ(l)=∂C∂z(l+1)⋅∂z(l+1)∂θ(l)∂C∂θ(l)=∂C∂z(l+1)⋅∂z(l+1)∂θ(l)
∂C∂θ(l)=δ(l+1)⋅a(l)∂C∂θ(l)=δ(l+1)⋅a(l)


描述一个针对m个样本的训练循环

Training set {(x(1),y(1)),(x(2),y(2)),…,(x(m),y(m))(x(1),y(1)),(x(2),y(2)),…,(x
(m),y(m))} .m 个训练样本.
Set Δ(l)ij=0Δij(l)=0 (for all l,i,j) ,used to comput ∂∂Θ(l)i,jJ(Θ),∂∂Θi,j(l)J(
Θ), Cycle accumulation
For training example t=1 to m:
1. Set a(1):=x(t)a(1):=x(t)
2.执行前向传播,分别计算 a(l)a(l) for l=2,3,…,Ll=2,3,…,L
3.用y(i)y(i),通过δ(L)=a(L)−y(t)δ(L)=a(L)−y(t)计算输出层的损失。
4.Compute δ(L−1),δ(L−2),…,δ(2).δ(l)=((Θ(l))Tδ(l+1)).∗a(l).∗(1−a(i))δ(L−1),δ(L−
2),…,δ(2).δ(l)=((Θ(l))Tδ(l+1)).∗a(l).∗(1−a(i)) //g′(z(l))=a(l).∗(1−a(i))g′(z(l))
=a(l).∗(1−a(i))
5.Δ(l)i,j:=Δ(l)i,j+a(l)jδ(l+1)iΔi,j(l):=Δi,j(l)+aj(l)δi(l+1) or with
vectorization,Δ(l):=Δ(l)+δ(l+1)(a(l))TΔ(l):=Δ(l)+δ(l+1)(a(l))T.
ENDFOR

hense we update our new ΔΔmatrix.

* D(l)i,j:=1m(Δ(l)i,j+λΘ(l)i,j),ifj≠0Di,j(l):=1m(Δi,j(l)+λΘi,j(l)),ifj≠0
* D(l)i,j:=1mΔ(l)i,j,ifj=0Di,j(l):=1mΔi,j(l),ifj=0
Thus we get ∂∂Θ(l)i,jJ(Θ)=D(l)i,j∂∂Θi,j(l)J(Θ)=Di,j(l)

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信