Chapter 2. 反向传播

2019-09-09 17:22:18 浏览数 (1)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/github_39655029/article/details/99436593

  • 前言

BP算法最初在1970年代被提及,主要用于快速计算代价函数梯度,其核心是代价函数CCC关于任意权重www(或偏置bbb)的偏导数∂C∂wfrac {partial C}{partial w}∂w∂C​的表达式,通过改变权重和偏置,从而评估代价函数变化的快慢。

2.1 神经网络中使用矩阵快速计算输出的方法

  • 权重

用wjklw_{j_k}^lwjk​l​表示从(l−1)th(l-1)^{th}(l−1)th层的kthk^{th}kth个神经元到lthl^{th}lth层的jthj^{th}jth个神经元的连接上的权重。

用bjlb_j^lbjl​表示在lthl^{th}lth层第jthj^{th}jth个神经元的偏置,使用ajla^l_jajl​表示lthl^{th}lth层第jthj^{th}jth个神经元的激活值。从而变可以对lthl^{th}lth层的第jthj^{th}jth个神经元的激活值ajla^l_jajl​和(l−1)th(l-1)^{th}(l−1)th层的激活值建立关联:

$ a_j^l=sigma (sum_k w^l_{jk} a{l-1}_{k} b_jl) $

求和在其中(l−1)th(l-1)^{th}(l−1)th层上的kkk个神经元进行。为方便重写,对每层lll均定义一个权重矩阵wlw^lwl,其中的元素为连接到lthl^{th}lth层神经元的权重。同样对每层顶一个偏置向量blb^lbl,其中的元素即为bjlb^l_jbjl​,每个元素对应lthl^{th}lth层的每个神经元。然后定义激活向量ala^lal,元素为激活值ajla^l_jajl​。这样一来,上面的式子就可以改写为下列形式:

al=σ(wlal−1 bl)a^l=sigma (w^l a^{l-1} b^l)al=σ(wlal−1 bl)

上述表达式全局考虑了每层激活值和前一层激活值的关联方式:用权重矩阵作用在激活值上,然后加上一个偏置向量,最后作用于代价函数σsigmaσ,其中wlal−1 blw^l a^{l-1} b^lwlal−1 bl叫做lll层神经元的带权输入

2.2 关于代价函数的两个假设

  • 回顾

$ C = frac{1}{2n} sum _x ||y(x)-aL(x)||2 $

上式为二次代价函数,nnn为训练样本总数,求和遍历每个训练样本xxx,y=y(x)y=y(x)y=y(x)为对应目标输出,LLL表示网络层数,aL=aL(x)a^L=a^L(x)aL=aL(x)是当输入为xxx时网络输出的激活值向量。

  • 两个假设
    • 代价函数可以被写成一个在每个训练样本xxx上的代价函数CxC_xCx​的均值C=1n∑xCxC=frac{1}{n} sum_xC_xC=n1​∑x​Cx​

因为反向传播实际上是对一个独立的训练样本计算∂Cx/∂wpartial C_x / partial w∂Cx​/∂w和∂Cx/∂bpartial C_x / partial b∂Cx​/∂b,然后通过在所有训练样本上进行平均化从而获得∂C/∂wpartial C / partial w∂C/∂w和∂C/∂bpartial C / partial b∂C/∂b。一旦有了这个假设,则可认为训练样本xxx固定.

  • 代价函数可以写成神经网络输出的函数

因为对于一个单体训练样本xxx而言,其二次代价函数可以写成下列式子,同时它也是输出的激活值的函数:

$ C= frac{1}{2}||y-aL||2=frac{1}{2}sum_j(y_j-a_jL)2 $

2.3 Hadamard乘积

  • 定义

假设sss和ttt是相同维度的向量,则使用sΘtsTheta tsΘt来表示按元素的乘积,这种类型的按元素乘法也叫做Hadamard乘积或Schur乘积,即(sΘt)j=sjtj(sTheta t )_j = s_jt_j(sΘt)j​=sj​tj​

$ left[begin{matrix}12end{matrix}right] Theta left[begin{matrix}34end{matrix}right] = left[ begin{matrix} 1 * 3 2 * 4end{matrix}right ]=left[ begin{matrix} 38 end{matrix} right] $

2.4 反向传播的四个基本方程

反向传播的实质是计算偏导数∂C/∂wjklpartial C / partial w^l_{jk}∂C/∂wjkl​和∂C/∂bjlpartial C / partial b^l_j∂C/∂bjl​,为计算这些值引入中间量δjldelta_j^lδjl​,称为在lthl^{th}lth层第jthj^{th}jth个神经元上的误差,反向传播将给出计算误差的流程,并关联到所计算值。

  • 输出层误差的方程,δLdelta^LδL,BP1

$ delta ^L_j = frac{partial C}{partial a_jL}sigma、(z_j^L) $

右式第一项代表代价随着jthj^{th}jth输出激活值的变化而变化的速度,第二项表示在zjLz^L_jzjL​处激活函数σsigmaσ变化的速度,如果CCC不依赖一个特定的输出神经元jjj,则δjLdelta^L_jδjL​则会极小,符合我们预期目标。以矩阵形式重写方程时可写为如下形式:

$ delta ^L = triangledown _aC Theta sigma、(zL) $

▽aCtriangledown _aC▽a​C是一个向量,其元素为偏导数∂C/∂ajLpartial C / partial a_j^L∂C/∂ajL​,可以将其看成是CCC关于输出激活值的改变速度。

  • 使用下一层的误差δl 1delta ^{l 1}δl 1来表示当前层的误差δldelta ^lδl,BP2

$ delta ^l = ((w{l 1})T delta^{l 1}) Theta sigma、(zl) $

其中(wl 1)T(w^{l 1})^T(wl 1)T是(l 1)th(l 1)^{th}(l 1)th层权重矩阵wl 1w^{l 1}wl 1的转置。通过组合上述两式,就可以计算出任意层的误差δldelta ^lδl。先利用BP1计算δLdelta ^LδL,而后利用BP2计算δL−1delta ^{L-1}δL−1,最后一步一步反向传播到整个网络。

  • 代价函数关于网络中任意偏置的改变率,BP3

$ frac {partial C}{partial b_j^l} = delta^l_j $

即误差δjldelta ^l_jδjl​和偏导数∂C/∂bjlpartial C / partial b_j^l∂C/∂bjl​**完全一致。**BP1和BP2可以计算δjldelta ^l_jδjl​,所以BP3简化为:

$ frac {partial C}{partial b} = delta $

其中误差δdeltaδ和偏置bbb都是针对同一个神经元而言。

  • 代价函数关于任何一个权重的改变率,BP4

$ frac {partial C}{partial w^l_{jk}} = a_k^{l-1} delta_j^l $

也等同于下式,其中aina_{in}ain​是输入给权重www的神经元的激活值,δoutdelta_{out}δout​是输出自权重www的神经元的误差。

$ frac {partial C}{partial w} = a_{in} delta_{out} $

[图片上传失败…(image-aaffdb-1565679482579)]

上述结构中好的结果就是当激活值aina_{in}ain​很小,ain≈0a_{in} approx 0ain​≈0,此时梯度∂C/∂wpartial C / partial w∂C/∂w也趋于很小,这时候就说权重缓慢学习,表示在梯度下降时,权重不会改变太多,即来自低激活值神经元的权重学习将非常缓慢。

  • 其他理解的方面

对于(BP1)中的KaTeX parse error: Can't use function '(' in math mode at position 9: sigma^、̲(̲z_j^l),当KaTeX parse error: Can't use function '(' in math mode at position 7: sigma̲(̲z_j^l)近似等于0或1时,σsigmaσ函数变得非常平,此时KaTeX parse error: Can't use function '(' in math mode at position 9: sigma^、̲(̲z_j^L)approx…。所以如果输出神经元处于或低(≈0approx 0≈0)或高(≈1approx 1≈1)激活值时,最终层的权重学习速度将变缓慢或终止,此时则称输出神经元已经饱和,类似结果对输出神经元的偏置也成立。

  • 总结
  • 问题 基于传统矩阵乘法,另一种反向传播方程的表示形式如下:
    • BP1 δL=∑、(zL)▽aCdelta^L=sum^、(z^L)triangledown_aCδL=∑、(zL)▽a​C
    • BP2 δl=∑、(zL)(wl 1)Tδl 1delta^l=sum^、(z^L)(w^{l 1})^Tdelta^{l 1}δl=∑、(zL)(wl 1)Tδl 1
    • 从而推出 δl=∑、(zl)(wl 1)T...∑、(zL−1)(wL)T∑、(zL)▽aCdelta^l = sum ^、(z^l)(w^{l 1})^T...sum ^、(z^{L-1})(w^L)^Tsum^、(z^L)triangledown _aCδl=∑、(zl)(wl 1)T...∑、(zL−1)(wL)T∑、(zL)▽a​C

2.6 反向传播算法

  • 算法描述
    1. 输入x:为输入层设置对应的激活值a1a^1a1;
    2. 前向传播:对每个l=1,2,3,...,Ll=1,2,3,...,Ll=1,2,3,...,L计算相应的zl=wlal−1 blz^l=w^la^{l-1} b^lzl=wlal−1 bl和KaTeX parse error: Can't use function '(' in math mode at position 11: a^l=sigma̲(̲z^l);
    3. 输出层误差δLdelta^LδL:计算向量KaTeX parse error: Can't use function '(' in math mode at position 41: …CThetasigma^、̲(̲z^L);
    4. 反向误差传播:对于每个l=L−1,L−2,...,2l=L-1,L-2,...,2l=L−1,L−2,...,2,计算KaTeX parse error: Can't use function '(' in math mode at position 10: delta^l=̲(̲(w^{l 1})^Td…;
    5. 输出:代价函数的梯度由∂C∂wjkl=a_kl−1δl_jfrac{partial C}{partial w_{jk}^l} = a_k^{l-1}delta^l_j∂wjkl​∂C​=a_kl−1δl_j和∂C∂bjl=δ_jlfrac{partial C}{partial b_{j}^l}=delta_j^l∂bjl​∂C​=δ_jl共同得出; ‌ 也等同于下式,其中www的神经元的激活值,δoutδ_{out}δout​​是输出自权重www的神经元的误差。 ∂w∂C​=ain​δout​ frac{∂w}{∂C​}=a_{in}​δ_{out}​∂C​∂w​=ain​​δout​​

上述结构中好的结果就是当激活值aina_{in}ain​很小,ain≈0a_{in} approx 0ain​≈0,此时梯度∂C/∂w∂C/∂w∂C/∂w也趋于很小,这时候就说权重缓慢学习,表示在梯度下降时,权重不会改变太多,即来自低激活值神经元的权重学习将非常缓慢。

  • 其他理解的方面

对于(BP1)中的σ、(zjl)sigma^、(z_j^l)σ、(zjl​),当σ(zjl)sigma(z_j^l)σ(zjl​)近似等于0或1时,σsigmaσ函数变得非常平,此时σ、(zjL)≈0sigma^、(z_j^L)approx0σ、(zjL​)≈0。所以如果输出神经元处于或低(≈0approx 0≈0)或高(≈1approx 1≈1)激活值时,最终层的权重学习速度将变缓慢或终止,此时则称输出神经元已经饱和,类似结果对输出神经元的偏置也成立。

  • 总结
  • 问题

基于传统矩阵乘法,另一种反向传播方程的表示形式如下:

  • BP1

δL=∑、(zL)▽aCdelta^L=sum^、(z^L)triangledown_aCδL=∑、​(zL)▽a​C

  • BP2

δl=∑、(zL)(wl 1)Tδl 1delta^l=sum^、(z^L)(w^{l 1})^Tdelta^{l 1}δl=∑、​(zL)(wl 1)Tδl 1

  • 从而推出 δl=∑、(zl)(wl 1)T...∑、(zL−1)(wL)T∑、(zL)▽aCdelta^l = sum ^、(z^l)(w^{l 1})^T...sum ^、(z^{L-1})(w^L)^Tsum^、(z^L)triangledown _aCδl=∑、​(zl)(wl 1)T...∑、​(zL−1)(wL)T∑、​(zL)▽a​C

0 人点赞