不同loss函数在不同网络结构下的误差后传
不同loss函数在不同网络结构下的误差后传
前言
推导下最小均方差(MSE)和交叉熵(CE)两种loss函数的导数,看看还是否满足误差后传的原则?有什么区别?
在一般地网络结构下是怎么样的?在CNN下又是怎么推导的?在RNN结构下(LSTM)又是怎么推导的?直接讨论多元判别的情况,二元读者自行推导。
MSE & CE
上个小图,说明下最后输出结构及两种loss的形式。
MSE的思路:是不管哪个输出维度,都想尽量靠近。
CE的思路:只将样本集出现的概率最大化。交叉熵与最大似然是一致的,在前面讲过,这里不多说了。
Loss(data|z)=12m∑ms=1∑kj=1[yj−f(zj)]2Loss(data|z)=12m∑s=1m∑j=1k[yj−f(zj)]2
Loss(data|z)=1m∑ms=1∑kj=1True[yj=1]lnf(zj)Loss(data|z)=1m∑s=1m∑j=1kTrue[yj=1]lnf(zj)
样本标签表示为one-hot类型。jj表示第jj个输出单元序号。zz表示前层传递到最后输出层的节点的输入。zjzj表示前层传递到最后输出层的jj节点的输入。
True[∗]True[∗]表示判断条件是否为真,其中True[yj=1]True[yj=1]表示对应输出节点为1的判断。若为真,则表示样本是该类别jj,这里不要晕了。
输出层的判别函数
二元判别时,更习惯用sigmoidsigmoid函数:f(z)=11+e−zf(z)=11+e−z
其导数:∂f(z)∂z=1(1+e−z)2e−z(−1)=f(z)[1−f(z)]∂f(z)∂z=1(1+e−z)2e−z(−1)=f(z)[1−f(z)]
多元判别时,更习惯用softmaxsoftmax函数:f(zi)=ezi∑kj=1ezjf(zi)=ezi∑j=1kezj
其中zizi表示第ii个输出节点的输入。
其导数:∂f(zi)∂zi=ezi∑kj=1ezj−eziezi(∑kj=1ezj)2∂f(zi)∂zi=ezi∑j=1kezj−eziezi(∑j=1kezj)2
=ezi∑kj=1ezj[∑kj=1ezj]−ezi∑kj=1ezj=f(zi)[1−f(zi)]=ezi∑j=1kezj[∑j=1kezj]−ezi∑j=1kezj=f(zi)[1−f(zi)]
上述两个函数,softmax退化为二元时,就是sigmoid函数关系详见。两个函数的导数形式也很相近,就是一样的,不过一个兼顾了多维判断。notice:退化也是有条件的退化,去掉了一组判断0的参数;二元的sigmoid判断输出是单节点的。
有人在博客里乱写,将二元判断的情况胡乱推广到多元判断,要注意二元的单节点输出是化简的结构。
比如,二元下,MSE和CE做loss对ww的求导分别如下:
∂Emse∂w=∂∂w[(y−σ(wx))2]=(y−σ(z))σ′x∂Emse∂w=∂∂w[(y−σ(wx))2]=(y−σ(z))σ′x
∂Ece∂w=−∂∂w[ylnσ(wx)+(1−y)ln(1−σ(wx))]=(y−σ(z))x∂Ece∂w=−∂∂w[ylnσ(wx)+(1−y)ln(1−σ(wx))]=(y−σ(z))x
在二元且单节点输出时,两个导数间的差距是σ′σ′。
但是在多元判断时,用softmax做判断函数的情况下:
∂Emse∂wk=∂∂w[∑k(yk−S(wkx))2]=(yk−S(zk))S′x∂Emse∂wk=∂∂w[∑k(yk−S(wkx))2]=(yk−S(zk))S′x
∂Ece∂wk=−∂∂wk[∑kTrue(yk=1)lnS(zk)]=−True(yk=1)[1−S(zk)]∂Ece∂wk=−∂∂wk[∑kTrue(yk=1)lnS(zk)]=−True(yk=1)[1−S(zk)]
在多元节点输出时,两个导数间的差距就不是简单的S′S′的差距了。
单样本下求导
1)对MSE下的单样本时输入zizi求导:
Emse(zi|θ)=∑kj=1[yj−f(zj)]2Emse(zi|θ)=∑j=1k[yj−f(zj)]2
其中θ=[θ0,θ1,...,θj]θ=[θ0,θ1,...,θj],zi∈{z1,z2,...,zj}zi∈{z1,z2,...,zj}
∂E∂zi=∂∂zi[yi−f(zi)]2=[yi−f(zi)]f′(zi)∂E∂zi=∂∂zi[yi−f(zi)]2=[yi−f(zi)]f′(zi)
2)对CE下的单样本时输入zizi求导:
Ece(zi|θ)=∑kj=1True[yj=1]lnf(zj)Ece(zi|θ)=∑j=1kTrue[yj=1]lnf(zj)
∂E∂zi=∂∂zi{True[yi=1]lnf(zi)}=True[yi=1]1f(zi)f′(zi)∂E∂zi=∂∂zi{True[yi=1]lnf(zi)}=True[yi=1]1f(zi)f′(zi)
注意两处导数的不同:
1) Emse(zi|[θ0,θ1,θi,...,θk])Emse(zi|[θ0,θ1,θi,...,θk])对每组θiθi都有偏导。
2) Ece(zi|[θ0,θ1,θi,...,θk])Ece(zi|[θ0,θ1,θi,...,θk])则只在该样本所表示类别节点的那组参数时有偏导(True[yi=1]=1True[yi=1]=1时),其余的是0(True[yi=1]=0True[yi=1]=0)。注意一个样本只有一个类别属性,y=[0,0,0,1,0]。
代入输出节点的判别函数softmax的导数后:
∂Emse∂zi=[yi−f(zi)]f′(zi)∂Emse∂zi=[yi−f(zi)]f′(zi)
∂Ece∂zi=True[yi=1]1f(zi)f′(zi)={1−f(zi)0样本类别指示节点other∂Ece∂zi=True[yi=1]1f(zi)f′(zi)={1−f(zi)样本类别指示节点0other
发现用softmax做CE的最后一层判断函数是非常好的,可以只将误差部分后传;而MSE则多引入一个判别导数部分。另外,CE比MSE要好的地方,仅对目标标记位置用力气(True),对其他非标记位置不管,反而更容易集中,不像MSE会有多个位置分散判断的集中力。
在一般网络结构下,不同Loss对误差后传有什么影响么?
上个小图表示倒数的后几层。
对误差后传是没有影响的,只是最后一层往前传递的内容有点变化而已。
1) CE损失函数下的倒数
对CE表示损失函数的网络倒数第一层参数wLj,iwj,iL求导:
∂Ece∂wLj,i=True[yj=1]1f(zj)f′(zj)=True[yj=1][1−f(zj)]hL−1∂Ece∂wj,iL=True[yj=1]1f(zj)f′(zj)=True[yj=1][1−f(zj)]hL−1
对倒数第二层的wL−1i,mwi,mL−1求导:
∂Ece∂wL−1i,m=∑kj=1True[yj=1][1−f(zj)]∂zj∂hL−1∂hL−1∂zi∂zi∂wL−1i,m∂Ece∂wi,mL−1=∑j=1kTrue[yj=1][1−f(zj)]∂zj∂hL−1∂hL−1∂zi∂zi∂wi,mL−1
=∑kj=1True[yj=1][1−f(zj)]wLjσ′(zi)hL−2=∑j=1kTrue[yj=1][1−f(zj)]wjLσ′(zi)hL−2
2) MSE下的求导:
∂Emse∂wLj,i=[yj−f(zj)]f′(zj)hL−1∂Emse∂wj,iL=[yj−f(zj)]f′(zj)hL−1
∂Emse∂wL−1i,m=∑j[yi−f(zj)]f′(zj)wLjσ′(zi)hL−2∂Emse∂wi,mL−1=∑j[yi−f(zj)]f′(zj)wjLσ′(zi)hL−2
比较发现:
网络结构不变,对h的偏导不变,链式结构仍存在,不影响误差后传的整体结构;且由于最后层的各个节点累加仍然存在,也不影响多点集中向后的原则。δδ都是传递到节点的输出侧,再乘以激活函数对该层某变量的导数。
最后一层往前传递的内容在变化:
CE是True[yj=1][1−f(zj)]True[yj=1][1−f(zj)];MSE是[yj−f(zj)]f′(zj)[yj−f(zj)]f′(zj)。
在网络层间的传递,仍然遵循多路集中一点的原则。
思考:误差后传的基本结构是由网络的串联形式决定的,如果改变网络的组织结构,化积为和,就会改变整个参数更新体系,同时也能彻底解决掉梯度消失问题,甚至直接开辟一个新的ML分支。
卷积层和池化层导数
1)卷积层、卷积导数、误差后传
卷积的操作:zi,j=∑m−1a=0∑n−1b=0∑3c=0xi+a,j+b,cwa,b,c+bzi,j=∑a=0m−1∑b=0n−1∑c=03xi+a,j+b,cwa,b,c+b
注意每个filter共享一个bias。{i,j}{i,j}表示输出节点位置。对某个filter的{m′,n′}{m′,n′}位置参数wm′,n′wm′,n′求导得到:
如何误差后传呢?由于卷积层的参数ww属于共享参数,所以其在误差后传时稍有不同。先来看个共享参数的误差后传例子。
{θx+[θ0,θ1,...,θn]x=zf(z)=softmax(z)判别函数⟶⎧⎩⎨⎪⎪⎪⎪⎪⎪θx+θ0x=z0θx+θ1x=z1θx+θ2x=z2...{θx+[θ0,θ1,...,θn]x=zf(z)=softmax(z)判别函数⟶{θx+θ0x=z0θx+θ1x=z1θx+θ2x=z2...
其中θθ是共享参数,看其在误差后传中的样子。
单样本MSEloss为:E=12∑k[yk−fk]2E=12∑k[yk−fk]2
对θθ求导:∂E∂θ=∑k(yk−fk)f′kx∂E∂θ=∑k(yk−fk)fk′x 因为每个输出节点都有θθ在贡献力量,所以求导反向传播时,也是所有的节点都累积起来。
误差后传计算小窍门:
反向传播的误差在某层LL输出侧,累加得:ML=∑i∈nodeδLiML=∑i∈nodeδiL,其中ii表示本层节点的编号,δLiδiL表示已经反向传递到第ii节点的误差值。如何求解这层导数呢?
本层每个节点的激活hL(w,x)hL(w,x),都带入进去求导。
∂∑i∈nodeδLihLi(w,x)∂w=∑i∈nodeδLi∂hLi(w,x)∂w∂∑i∈nodeδiLhiL(w,x)∂w=∑i∈nodeδiL∂hiL(w,x)∂w
这样自然就会将各种情况的参数作用形式合并到一个式子里。
卷积层的误差也是同样如上所述规律。
计算下卷积图中的卷积参数wm′,n′wm′,n′的导数。
∂E∂wm′,n′=∂∂wm′,n′[∑Pp=1∑H−mi=0∑W−nj=0δL,pi,j∗hL(zi,j)]∂E∂wm′,n′=∂∂wm′,n′[∑p=1P∑i=0H−m∑j=0W−nδi,jL,p∗hL(zi,j)]
=∑H−mi=0∑W−nj=0δLi,j∗∂hLi,j∂zLi,j∗∂zi,j∂wm′,n′=∑i=0H−m∑j=0W−nδi,jL∗∂hi,jL∂zi,jL∗∂zi,j∂wm′,n′,因为wm′,n′wm′,n′只对输出的某一feature-map起作用,所以pp被化简掉了。
=∑H−mi=0∑W−nj=0δLi,j∗h′Li,j∗∑3c=0xi+m′,j+n′,c=∑i=0H−m∑j=0W−nδi,jL∗hi,j′L∗∑c=03xi+m′,j+n′,c,因为只从一个图像通道里抽取特征,所以通道的变量也被简化。
=∑H−mi=0∑W−nj=0δLi,j∗h′Li,j∗xi+m′,j+n′=∑i=0H−m∑j=0W−nδi,jL∗hi,j′L∗xi+m′,j+n′
=rot180{δLi,j}∗xm′,n′=rot180{δi,jL}∗xm′,n′
将δδ翻转180度,然后再乘以xm′,n′xm′,n′得到∂E∂wm′,n′∂E∂wm′,n′
2)池化层导数及误差后传
池化只是做采样,只需要将依照选择的动作,将误差传递就好。
在反向传播时,我们首先会把δLδL的所有子矩阵矩阵大小还原成池化之前的大小,然后如果是MAX,则把δLδL的所有子矩阵的各个池化局域的值放在之前做前向传播算法得到最大值的位置(这个时候在前向传播时需要记录最大值的位置)。如果是Average,则把δLδL的所有子矩阵的各个池化局域的值取平均后放在还原后的子矩阵位置。这个过程一般叫做upsample。
δL=(2486)⟶maxδL−1=⎛⎝⎜⎜⎜2000004000060800⎞⎠⎟⎟⎟δL=(2846)⟶maxδL−1=(2000000804000060)
δL=(2486)⟶meanδL−1=⎛⎝⎜⎜⎜0.50.5110.50.511221.51.5221.51.5⎞⎠⎟⎟⎟δL=(2846)⟶meanδL−1=(0.50.5220.50.522111.51.5111.51.5)
在CNN网络结构下,不同Loss对误差后传有什么不同?
上面的推导也已经看到了,卷积和池化层,仍然遵循误差后传的规律。不同loss对误差后传无影响,唯一的影响是最后层后传的内容不同(由于softmax判别函数的特殊性刚好与loss互相抵消掉部分内容);更新最后层参数的稍微不同(由于loss函数本身的不同导致)。
MSE后传的是∂E∂f∂f∂zi=(yi−fi)f′i∂E∂f∂f∂zi=(yi−fi)fi′;
CE后传的是∂E∂f∂f∂zi=True[fi=1][1fif′i]=True[fi=1](1−fi)∂E∂f∂f∂zi=True[fi=1][1fifi′]=True[fi=1](1−fi)
RNN 结构下的BP
未完待续….
RNN的结构不同于传统的网络,也不同于CNN的网络,而是以迭代的形式出现。传统网络,层内不共享参数,层间不共享参数;CNN是层内共享参数,层间不共享参数;RNN是层内不共享参数,层间共享参数。
并且输入数据样本和输出表示上也不同于一般的情况,是连续的时间序列数据。表示也不是one-hot形式,而是以对应位置概率预测形式出现。比如,输入[我 很 开心]==> 输出[(0.8, 0.1, 0.1), (0.1, 0.9, 0.0), (0.2, 0.2, 0.6)]。
梯度优化方法应用位置
疑问:各种对参数更新的方法做的改进,比如,Adam怎么应用过来呢?
错误的回答:目测应该是最后一层的导数求解后的改进,如果对每个激活的导数都改动,那是不是有点过分了,不能表示真实输出和预测输出的区别。梯度的改进是为了能够更真实地描述与最优解的距离,且能够在更新参数时更快更直接朝着最优解方向。
正确的回答:梯度优化的方法,是对f(θ)f(θ)在θ:=θ−αΔθθ:=θ−αΔθ时的ΔθΔθ做改进(依据θθ的导数和历史导数信息进行相应调整)。每层参数wlwl都有自己的导数,那就意味着每层的导数求解完毕后,都可以依照梯度优化方式做改进,然后再更新。
batch normalize 怎么加进去
1)batch normalize在一般网络中,如何加入?
这个前面博客“Batch Norm的几点说明”都推导过,是对激活函数的修改,对整个误差后传结构无影响。
2)batch normalize在CNN网络中,如何加入?
这个也提到过,在前面博客里,至于怎么推导。只需将上面的激活函数对应的替换下就OK。
卷积计算与cross-relation计算等价
学过通信的童鞋,肯定都会对CNN里面的卷积操作持怀疑态度,这分明不是卷积嘛,骗我没学过信号与处理理论么。里面的计算转换下,就会发现相通的地方。
总结
1. 虽然是不同的loss函数下,只要网络结构仍然是层间直连,对误差传递的多点往前集中的形式是无影响的。
2. 对某层参数求导时,敏感值的计算,每层的输出侧都是需要累加到一起的,再对该层的参数求导。
3. 交叉熵和均方差的loss函数,在最后层参数更新上是不一样的,前者只对样本类别标记下对应的参数更新,后者则是所有参数本次迭代都有更新。
4. 池化层由于无学习的动作,只是选择,所以处理更为简单。

浙公网安备 33010602011771号