BP推导
首先进行网络变量和参数的定义,规定JJJ是损失函数,每层的激活值使用aaa表示,ggg是激活函数,al=g(zl),zl=Wlal−1+bla^{l}=g(z^{l}),z^{l}=W^{l}a^{l-1}+b^lal=g(zl),zl=Wlal−1+bl ,其中lll表示层索引,aila_i^lail中iii表示层内的神经元索引,∣l∣|l|∣l∣表示第lll层的神经元数目。推导的目标是求得
∂J∂Wl
\frac{\partial J}{\partial W^l}
∂Wl∂J
1.向量化形式
这里我们统一使用分子范式,在具体的权值更新中再相应的作转置。分几步进行:
-
定义误差变量δ\deltaδ,这里向量化之后
δil=∂J∂zilδl=∂J∂zl \delta_i^l=\frac{\partial J}{\partial z^l_i}\\ \delta^l=\frac{\partial J}{\partial z^l} δil=∂zil∂Jδl=∂zl∂J -
假定最后一层的误差变量δL\delta^LδL已求出,现在求δl+1\delta^{l+1}δl+1和δl\delta^lδl之间的关系
zl+1=Wl+1g(zl)+bl+1 z^{l+1}=W^{l+1}g(z^{l})+b^{l+1} zl+1=Wl+1g(zl)+bl+1δl=∂J∂zl=∂J∂zl+1∂zl+1∂zl=δl+1∂zl+1∂zl下面求 \delta^l=\frac{\partial J}{\partial z^l}=\frac{\partial J}{\partial z^{l+1}}\frac{\partial z^{l+1}}{\partial z^l}=\delta^{l+1}\frac{\partial z^{l+1}}{\partial z^l}下面求 δl=∂zl∂J=∂zl+1∂J∂zl∂zl+1=δl+1∂zl∂zl+1下面求
下面求
∂zl+1∂zl=∂zl+1∂g(zl)∂g(zl)∂zl=Wl+1diag(g′(z1l),g′(z2l),…,g′(z∣l∣l)) \frac{\partial z^{l+1}}{\partial z^l}=\frac{\partial z^{l+1}}{\partial g(z^l)}\frac{\partial g(z^{l})}{\partial z^l}=W^{l+1}\text{diag}(g'(z_1^l),g'(z_2^l),\dots,g'(z^l_{|l|})) ∂zl∂zl+1=∂g(zl)∂zl+1∂zl∂g(zl)=Wl+1diag(g′(z1l),g′(z2l),…,g′(z∣l∣l))
合并可得
δl=δl+1Wl+1diag(g′(z1),g′(z2),…,g′(z∣l∣)) \delta^l=\delta^{l+1}W^{l+1}\text{diag}(g'(z_1),g'(z_2),\dots,g'(z_{|l|})) δl=δl+1Wl+1diag(g′(z1),g′(z2),…,g′(z∣l∣))
验证:采用的是分子范式,因而δl+1:1×∣l+1∣\delta^{l+1}:1\times|l+1|δl+1:1×∣l+1∣,权值Wl:∣l+1∣×∣l∣W^l:|l+1|\times|l|Wl:∣l+1∣×∣l∣,那么δl:1×∣l∣\delta^l:1\times |l|δl:1×∣l∣,简洁明了
- 利用每层的误差变量来求对权值的偏导
∂J∂Wl=∂J∂zl∂zl∂Wl=δl??? \frac{\partial J}{\partial W^l}=\frac{\partial J}{\partial z^{l}}\frac{\partial z^{l}}{\partial W^l}=\delta^{l}??? ∂Wl∂J=∂zl∂J∂Wl∂zl=δl???
显然上式中的∂zl∂Wl\frac{\partial z^{l}}{\partial W^l}∂Wl∂zl问题属于vector-by-matrix的微分问题,超出知识范围,我们利用下节中的第一部分的结论,使用归纳法
∂J∂Wijl=∂J∂zil∂zil∂Wijl=δilajl−1→分子范式:∣l−1∣×∣l∣∂J∂Wl=((δl)T(al−1)T)T=al−1δl \frac{\partial J}{\partial W^l_{ij}}=\frac{\partial J}{\partial z^l_i}\frac{\partial z^{l}_i}{\partial W^l_{ij}}=\delta^l_i a^{l-1}_j\\ \rightarrow \text{分子范式:}|l-1|\times |l|\quad\frac{\partial J}{\partial W^l}=((\delta^l)^T (a^{l-1})^T)^T=a^{l-1}\delta^l\\ ∂Wijl∂J=∂zil∂J∂Wijl∂zil=δilajl−1→分子范式:∣l−1∣×∣l∣∂Wl∂J=((δl)T(al−1)T)T=al−1δl
再具体的向量更新中,如下
Wl(t+1)=Wl(t)+η(al−1δl)T W^l(t+1)=W^l(t)+\eta (a^{l-1}\delta^l)^T Wl(t+1)=Wl(t)+η(al−1δl)T
2.非向量化形式
-
定义误差变量,这里zil=∑j=1∣l−1∣Wijlajl−1+bilz_i^l=\sum ^{|l-1|}_{j=1}W^l_{ij}a_j^{l-1}+b_i^lzil=∑j=1∣l−1∣Wijlajl−1+bil,向量化形式为zl=Wlal−1+blz^l=W^la^{l-1}+b^lzl=Wlal−1+bl。
∂J∂Wijl=∂J∂zil∂zil∂Wijl=δilajl−1 \frac{\partial J}{\partial W^l_{ij}}=\frac{\partial J}{\partial z^l_i}\frac{\partial z^{l}_i}{\partial W^l_{ij}}=\delta^l_i a^{l-1}_j ∂Wijl∂J=∂zil∂J∂Wijl∂zil=δilajl−1 -
求层间误差变量的关系
δil=∂J∂zil=∑j=1∣l+1∣δjl+1∂zjl+1∂zil=∑j=1∣l+1∣δjl+1Wjil+1g′(zil) \delta_i^l=\frac{\partial J}{\partial z^l_i}=\sum\limits^{|l+1|}_{j=1}\delta^{l+1}_j \frac{\partial z^{l+1}_j}{\partial z^l_i}=\sum\limits^{|l+1|}_{j=1}\delta^{l+1}_jW_{ji}^{l+1}g'(z^l_i) δil=∂zil∂J=j=1∑∣l+1∣δjl+1∂zil∂zjl+1=j=1∑∣l+1∣δjl+1Wjil+1g′(zil)
如何将上面的结果向量化,可以看出g′(zil)g'(z_i^l)g′(zil)中的索引为iii与求和的索引无关,因此,我们将其分离出来,先把求和部分向量化。向量化最重要的是维度正确,可以在纸上画出它们相乘的部分。注意这里的δl\delta^lδl我们设为列向量,而不是上节中的横向量。
∑j=1∣l+1∣δjl+1Wj−l+1=(Wl+1)Tδl+1 \sum\limits^{|l+1|}_{j=1}\delta^{l+1}_jW_{j-}^{l+1}=(W^{l+1})^T\delta^{l+1} j=1∑∣l+1∣δjl+1Wj−l+1=(Wl+1)Tδl+1
上面说了,可以看出g′(zil)g'(z_i^l)g′(zil)中的索引为iii与求和的索引无关,只与最终的δil\delta_i^lδil中的iii相关,那么直接将这一项化为逐元素相乘形式,
δl=(Wl+1)Tδl+1∘g′(zl) \delta^l=(W^{l+1})^T\delta^{l+1}\circ g'(z^l) δl=(Wl+1)Tδl+1∘g′(zl)
写成对角阵的形式
δl=diag(g′(z1),g′(z2),…,g′(z∣l∣)(Wl+1)Tδl+1 \delta^l=\text{diag}(g'(z_1),g'(z_2),\dots,g'(z_{|l|}) (W^{l+1})^T\delta^{l+1} δl=diag(g′(z1),g′(z2),…,g′(z∣l∣)(Wl+1)Tδl+1
结果为
∂J∂Wl=δl(al−1)T \frac{\partial J}{\partial W^l}=\delta^l(a^{l-1})^T ∂Wl∂J=δl(al−1)T
1万+





