前言
本文总结神经网络中基于反向传播的随机梯度下降法的数学推导过程,文章内容源于个人的学习心得。
前向传播、反向传播以及梯度下降法
首先我们需要整理一下相关名词的含义。
- 前向传播: 指的是在神经网络中将前一层的输出结果作为变量进行计算后输入至下一层的数据传播方式。
- 反向传播: 其实是误差反向传播的简称,它指的是将根据输出层的输出计算得来的损失函数的信息沿着神经网络从后一层向前一层不断传播的方式。
- 梯度下降法: 指根据反向传播的计算结果将神经元节点间的权重按照损失函数梯度减小的方向更新的学习方式。
所以一个简单的神经网络的学习过程可以总结如下:
数据输入→前向传播→结果输出→反向传播(应用梯度下降法更新权重)
接下来我们先从两层的神经网络(输出层 + 输入层)开始总结神经网络中基于反向传播的梯度下降法的数学推导过程。
双层神经网络
输出层为单个神经元
我们先用最简单的一个例子来探讨误差的反向传播是如何实现的。如上图所示,这是一个输入层有n个节点,输出层只有1个节点的双层神经网络。前向传播的过程如下:
u=i=1∑nxiωi(1)
此处的u为根据前一层的输出结果计算出的输入进下一层的值。当该层神经元的激活函数为f(x)时,向下一层输出的值为:
y^=f(u)(2)
由于这个神经网络只有两层,所以这时就获得了该神经网络对于此次输入的一个输出值y^,前向传播也就完成了。接下来我们计算这个输出值与正确值的损失函数E。为了之后反向传播的推导式简洁,这里使用如下方式去计算:
E=21(y^−y)2(3)
这里y指的是输出层对应节点的正确值。反向传播时,我们应当考察该损失函数关于每一个权重ωi的偏导:
∂ωi∂E=∂u∂E∂ωi∂u=∂u∂[21(y^−y)2]∂ωi∂u⋯(3)=∂u∂[21(f(u)−y)2]∂ωi∂(i=0∑nxiωi)⋯(2),(1)=(f(u)−y)f′(u)xi=(y^−y)f′(u)xi(4)(5)(6)(7)(8)
这样对每一个权重都求得相对于损失函数的偏导之后,便可以得到损失函数E的梯度了。梯度下降法便是让权值矩阵向误差梯度下降的方式进行更新。为了便于理解这个过程,我们还是先用权值矩阵中某一单个权重ωi进行举例,它的更新方式如下:
ωinew=ωiold−η∂ωi∂E=ωiold−η(y^−y)f′(u)xi(9)(10)
这里η为学习率,表示的是权重更新时的步长(速率)。将(10)式推广到整个权值矩阵,可得:
ω1ω2⋮ωnnew=ω1ω2⋮ωnold−η(y^−y)f′(u)x1x2⋮xn(11)
这便是此种情况下权值矩阵的更新方式了。
输出层为多个神经元
如上图所示,此时输出层的神经元节点个数从1个增加到了n个,那么对于权值矩阵中的权重下标我们这样定义: 前一层的节点i与后一层的节点j所对应的权重为ωji,也即ω后一层下标→前一层下标。那么对于这个权重,我们可以依照上一节的内容推导出它的更新方式,具体步骤如下:
首先还是计算输出层中对应节点uj的输入值:
uj=i=1∑mxiωji(1≤j≤n)(12)
激活函数为f(x)时,输出为:
yj^=f(uj)(13)
损失函数计算方式与上一节相同:
E=j=1∑n21(yj^−yj)2=j=1∑n21(f(uj)−yj)2(14)
于是ωji的更新方式为:
∂ωji∂E=∂uj∂E⋅∂ωji∂uj=(f(uj)−yj)f′(uj)⋅xi=(yj^−yj)f′(uj)xi(15)(16)(17)
对于这一步推导,我们可以把(15)式等号右侧的第一项命名为δj,这一项代表了该层梯度传播的某种特性。于是有:
δj=∂uj∂E=(yj^−yj)f′(uj)(18)
这样表示的好处是∂ωji∂E将只和δj与前一层的输出xi相关,理解起来比较直观,同时也有助于后续多层神经网络反向传播的递推公式的推导。
∂ωji∂E=δjxi(19)
于是此时权重的更新方式为:
ωjinew=ωjiold−ηδjxi(20)
将该式推广到整个权值矩阵后,计算方式如下:
ω11ω21⋮ωn1ω12ω22⋮ωn2⋯⋯⋱⋯ω1mω2m⋮ωnmn×mnew=ω11ω21⋮ωn1ω12ω22⋮ωn2⋯⋯⋱⋯ω1mω2m⋮ωnmn×mold−η(y1^y2^⋮yn^n×1−y1y2⋮ynn×1)⊙f′(u1u2⋮unn×1)x1x2⋮xmT1×m(21)
这里观察一下权值矩阵的结构可以发现,对于输出层的某一个节点j,前一层所有节点与其的权重ωji(i∈[1,m])所构成的向量是权值矩阵中第j行的部分。此外,式子中的每一个矩阵上方都标注了其大小,通过计算过程可以确认等式两端计算出的矩阵大小一致。(这里⊙表示矩阵的元素积,T表示矩阵的转置)最后我们可以把该表达式简化为:
Wnew=Wold−ηδjxT(22)
此时,
δj=(y^−y)⊙f′(u)(23)
三层神经网络
在上述内容的基础上,我们可以尝试把神经网络从双层增加到三层了,也即输入层、隐藏层和输出层。其示意图如下。
相关计算量定义
这个神经网络的输入层、隐藏层和输出层分别具有m,n,l个节点,对于每一层的一个任意的节点,我们指定它的编号分别为i,j,k。前向传播时,从输入层到隐藏层的线性结合为ujh,从隐藏层到输出层的线性结合为uko。与此对应的隐藏层和输出层的激活函数分别为f(x),g(x)。权重以及其构成的权值矩阵根据层与层之间的关系决定,三层的情况下层与层之间的关系分别为输入层↔隐藏层与隐藏层↔输出层。依照上一章第二节的权重下标定义,可以得到输入层与隐藏层之间的权值矩阵中一个任意的权重为ωji,隐藏层与输出层之间的为ωkj。以上定义完成后,我们便可以进行下一步的数学推导了。
三层神经网络的权值矩阵更新方式
输入层到隐藏层的前向传播:
ujh=i=1∑mxiωji,yj=f(ujh)(24)
隐藏层到输出层的前向传播:
uko=j=1∑nyjωkj,y^k=g(uko)(25)
计算损失函数,这里zk表示输出层的第k个节点所对应的正确值:
E=21k=1∑l(y^k−zk)2=21k=1∑l(g(uko)−zk)2(26)
接下来进行关于反向传播的以及梯度下降法的数学推导,分为两个部分:
- 对于隐藏层与输出层之间的权值矩阵中一个任意的权重ωkj的更新
- 对于输入层与隐藏层之间的权值矩阵中一个任意的权重ωji的更新
隐藏层与输出层之间
ωkj关于损失函数E的偏导:
∂ωkj∂E=∂uko∂E∂ωkj∂uko=(g(uko)−zk)g′(uko)⋅yj=(y^k−zk)g′(uko)yj(27)(28)(29)
这里根据之前章节中提到的推导式简化方法,可以类似地得到:
δko=(y^k−zk)g′(uko)(30)
于是,该权重的基于梯度下降法的更新方式即可表示为:
ωkjnew=ωkjold−ηδkoyj(31)
与(21)式类似,我们将其推广到整个权值矩阵:
ω11ω21⋮ωl1ω12ω22⋮ωl2⋯⋯⋱⋯ω1nω2n⋮ωlnl×nnew=ω11ω21⋮ωl1ω12ω22⋮ωl2⋯⋯⋱⋯ω1nω2n⋮ωlnl×nold−η(y1^y2^⋮yl^l×1−z1z2⋮zll×1)⊙g′(u1ou2o⋮ulol×1)y1y2⋮ynT1×n(32)
简化后可以写为:
H→OWnewδko=H→OWold−ηδkoyT=(y^−z)⊙g′(uo)(33)(34)
这里H→OW表示的是隐藏层(Hidden layer)与输出层(Output layer)之间的权值矩阵。
输入层与隐藏层之间
ωji关于损失函数E的偏导:
∂ωji∂E=∂yj∂E∂ujh∂yj∂ωji∂ujh=∂yj∂[21k=1∑l(g(uko)−zk)2]⋅f′(ujh)⋅∂ωji∂(i=1∑mxiωji)⋯(26),(24)=21k=1∑l[∂yj∂(g(uko)−zk)2]f′(ujh)xi=21k=1∑l[∂uko∂(g(uko)−zk)2⋅∂yj∂uko]f′(ujh)xi=k=1∑l[(g(uko)−zk)g′(uko)⋅∂yj∂(j=1∑nyjωkj)]f′(ujh)xi⋯(25)=k=1∑l[(y^k−zk)g′(uko)ωkj]f′(ujh)xi⋯(25)=k=1∑l(δkoωkj)f′(ujh)xi(35)(36)(37)(38)(39)(40)(41)
还是根据之前提到的求梯度时用到的推导式简化方法,我们希望将链式法则的推导式精简为只和前一层的输出以及当前层关于损失函数梯度传播的特性这两项相关。对于(41)式,我们应该这样化简:
δjh=k=1∑l∂ωji∂E(δkoωkj)f′(ujh)=δjhxi(42)(43)
那么可以得到权重ωji基于梯度下降法的更新方式:
ωjinew=ωjiold−ηδjhxi(44)
接下来尝试将其推广到整个权值矩阵。在此之前,我们可以先考察一下将δjh推广到矩阵的情况,将(42)式的求和改写成矩阵乘法的话可以得到:
δjh=ω1jω2j⋮ωljTδ1oδ2o⋮δlof′(ujh)(45)
如果继续对隐藏层节点下标j进行扩充(隐藏层共有n个节点)的话,我们便可以得到:
δjh=δ1hδ2h⋮δnhn×1=扩充方向ω11ω21⋮ωl1ω12ω22⋮ωl2⋯⋯⋱⋯ω1nω2n⋮ωlnTn×lδ1oδ2o⋮δlol×1⊙f′(u1hu2h⋮unhn×1)(46)
这时就可以发现扩充出来的 n×l 矩阵其实就是隐藏层与输出层之间的更新前的权值矩阵WH→O。我们可以依此写出输入层与隐藏层之间的权值矩阵基于梯度下降法的更新方式:
ω11ω21⋮ωn1ω12ω22⋮ωn2⋯⋯⋱⋯ω1mω2m⋮ωnmn×mnew=ω11ω21⋮ωn1ω12ω22⋮ωn2⋯⋯⋱⋯ω1mω2m⋮ωnmn×mold−ηω11ω21⋮ωl1ω12ω22⋮ωl2⋯⋯⋱⋯ω1nω2n⋮ωlnoldTn×lδ1oδ2o⋮δlol×1⊙f′(u1hu2h⋮unhn×1)x1x2⋮ymT1×m(47)
简化后可以写为:
I→HWnew=I→HWold−ηH→OWToldδko⊙f′(uh)xT=I→HWold−ηδjhxT(48)(49)
这便是最终的结果了。
三层神经网络的总结
最后,我们总结一下三层神经网络的权值矩阵更新方式。
H→OWnew=H→OWold−ηδkoyTI→HWnew=I→HWold−ηδjhxTδko=(y^−z)⊙g′(uo)δjh=H→OWToldδko⊙f′(uh)(50)(51)(52)(53)
多层神经网络
反向传播问题的一般化
这里的多层神经网络指的是隐藏层多于一层的情况,也即整个网络结构为输入层,层数大于1的隐藏层和输出层。随着层数的增加,层与层之间的权值矩阵的个数也会随之增加。那么当计算权值矩阵的更新方式时,采用之前所述的方法将会变得越来越复杂。但事实上从三层神经网络的计算结果来看我们可以发现,不同层之间的权值矩阵的更新方式并不是毫不相关的。如果我们把(48)与(49)式用自然语言来描述的话,其实是这样:
当前层更新后的权值矩阵当前层的梯度传播特性矩阵=当前层更新前的权值矩阵−学习率×当前层的梯度传播特性矩阵⋅前一层输出值矩阵的转置=后一层更新前的权值矩阵的转置⋅后一层梯度传播特性矩阵⊙当前层输入值矩阵相对于该层激活函数的导数
那么如果我们需要更新前一层和当前层之间的权值矩阵,那么只需要知道前一层、当前层和后一层的相关信息便可以通过递推公式的方式推导出来。如果把刚才用自然语言描述的内容再度抽象成数学语言,则为:
Wnew(l)δ(l)=Wold(l)−ηδ(l)y(l−1)T=Wold(l+1)Tδ(l+1)⊙f′(l)(u(l))(54)(55)
这里右上角括号内的内容表示神经层的序号,与常见的递推公式诸如数列递推公式中的字母下标等效,其大小表示层的先后顺序,数值越大表示该层在神经网络中越靠后,也可以理解为离输入层越远。u表示的是某一层输入值的矩阵,而y表示的则是某一层输出值的矩阵。而这两者正好就是前向传播中进行运算的量,于是有:
u(l)y(l)=W(l)y(l−1)=f(l)(u(l))(56)(57)
此外,观察(54)与(55)式可以发现反向传播其实计算的就是不同层的δ,根据其结果进行权值矩阵的更新。接下来我们希望证明这个递推公式,不过在此之前可以先考察一下不同序号的权值矩阵在神经网络中的实际位置:
InputIW(1)HiddenH1W(2)H2⋯W(l)Hl⋯W(L−1)HL−1W(L)OutputO(58)
这个式子中箭头所指的便是神经层,箭头上方所标注的便是该箭头两端神经层间对应的权值矩阵。当整个神经网络具有L−1个隐藏层(也即具有L+1个神经层)时权值矩阵的个数为L个(L>2)。前向传播的时候输入层的输入值会经由这L个神经层一步步传递至输出层。而反向传播时我们注意到(55)式中出现了与当前层的后一层(第l+1层)相关的信息,所以对于最后一个权值矩阵来说,它的更新方式与其他的略有不同(从(52)与(53)式中可以看出,实际上就是关于梯度传播的特性项δ不同)。那么之前的递推公式适用范围应为l∈[1,L−1]。接下来用数学归纳法进行证明。
反向传播递推公式证明
对于整个神经网络的最后一个权值矩阵W(L),根据三层神经网络章节中的推导结果可以得出:
δ(L)δ(L−1)=(y(L)−y)f′(L)(u(L))=W(L)Tδ(L)⊙f′(L−1)(u(L−1))=W[(L−1)+1]Tδ[(L−1)+1]⊙f′(L−1)(u(L−1))(59)(60)(61)
其中,y指的用来学习的正确输出值。那么如果使用数学归纳法,则有:
(i)k=1,δ(L−k)=δ(L−1)=W[(L−1)+1]Tδ[(L−1)+1]⊙f′(L−1)(u(L−1))(62)
若令如下算式成立
(ii)k=m(m<L−1),δ(L−k)=δ(L−m)=W[(L−m)+1]Tδ[(L−m)+1]⊙f′(L−m)(u(L−m))(63)(64)
那么有:
(iii)k=m+1,δ(L−k)=δ[L−(m+1)]=∂u[L−(m+1)]∂E=∂u[L−(m+1)]∂u(L−m)∂u(L−m)∂E=∂u[L−(m+1)]∂(W(L−m)y[L−(m+1)])δ(L−m)=∂u[L−(m+1)]∂(W(L−m)f[L−(m+1)](u[L−(m+1)]))δ(L−m)=W(L−m)Tδ(L−m)⊙f′[L−(m+1)](u[L−(m+1)])=W[L−(m+1)+1]Tδ[L−(m+1)+1]⊙f′[L−(m+1)](u[L−(m+1)])(65)(66)(67)(68)(69)(70)(71)
于是,该递推公式成立,其中关于(69)到(70)式的求导过程会放在附录中叙述。
总结
对于L层(L≥3)神经网络,总结其前向传播、反向传播以及其遵循梯度下降法进行权值矩阵更新的数学公式。
InputIW(1)HiddenH1W(2)H2⋯W(l)Hl⋯W(L−2)HL−2W(L−1)OutputO
前向传播
对于任意l(1≤l≤L−1),有:
u(l)y(l)=W(l)y(l−1)=f(l)(u(l))(72)(73)
此外,特别定义,当 l=0 时,y(0)表示输入层的输出。
反向传播
对于任意l(1≤l≤L−2),有:
δ(l)=Wold(l+1)Tδ(l+1)⊙f′(l)(u(l))(74)
此外,特别定义,当 l=L−1 时,
δ(l)=(y(l)−y)f′(l)(u(l))(75)
基于梯度下降法的学习
对于任意l(1≤l≤L−1),有:
Wnew(l)=Wold(l)−ηδ(l)y(l−1)T(76)
附录:反向传播求导过程
69式:
∂u[L−(m+1)]∂(W(L−m)f[L−(m+1)](u[L−(m+1)]))δ(L−m)
这里我们为了后续推导式具有较为简洁的形式,暂且可以去除所有的序号上标,因为上标只是为了指代递推关系,并不会影响到数学计算。所以可以简化为:
∂u∂{Wf(u)}δ
这里我们不妨设前一层具有m个,后一层具有n个神经元节点,那么上式中的矩阵具体写出来的效果为:
u=u1u2⋮um,W=ω11ω21⋮ωn1ω12ω22⋮ωn2⋯⋯⋱⋯ω1mω2m⋮ωnm,δ=δ1δ2⋮δm
代入上式可得:
∂u∂{Wf(u)}δ=∂u∂∑i=1mω1if(ui)∑i=1mω2if(ui)⋮∑i=1mωnif(ui)δ=∂u1∂∑i=1mω1if(ui)⋮∂um∂∑i=1mω1if(ui)⋯⋱⋯∂u1∂∑i=1mωnif(ui)⋮∂um∂∑i=1mωnif(ui)δ=ω11f′(u1)ω12f′(u2)⋮ω1mf′(um)ω21f′(u1)ω22f′(u2)⋮ω2mf′(um)⋯⋯⋱⋯ωn1f′(u1)ωn2f′(u2)⋮ωnmf′(um)δ1δ2⋮δm=ω11ω12⋮ω1mω21ω22⋮ω2m⋯⋯⋱⋯ωn1ωn2⋮ωnmδ1δ2⋮δm⊙f′(u1)f′(u2)⋮f′(um)=WTδ⊙f′(u)
评论COMMENTS