版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/github_39655029/article/details/99436593
BP算法最初在1970年代被提及,主要用于快速计算代价函数的梯度,其核心是代价函数CCC关于任意权重www(或偏置bbb)的偏导数∂C∂w\frac {\partial C}{\partial w}∂w∂C的表达式,通过改变权重和偏置,从而评估代价函数变化的快慢。
用wjklw_{j_k}^lwjkl表示从(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层神经元的带权输入。
$ 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时网络输出的激活值向量。
因为反向传播实际上是对一个独立的训练样本计算∂Cx/∂w\partial C_x / \partial w∂Cx/∂w和∂Cx/∂b\partial C_x / \partial b∂Cx/∂b,然后通过在所有训练样本上进行平均化从而获得∂C/∂w\partial C / \partial w∂C/∂w和∂C/∂b\partial C / \partial b∂C/∂b。一旦有了这个假设,则可认为训练样本xxx固定.
因为对于一个单体训练样本xxx而言,其二次代价函数可以写成下列式子,同时它也是输出的激活值的函数:
$ C= \frac{1}{2}||y-aL||2=\frac{1}{2}\sum_j(y_j-a_jL)2 $
假设sss和ttt是相同维度的向量,则使用sΘts\Theta tsΘt来表示按元素的乘积,这种类型的按元素乘法也叫做Hadamard乘积或Schur乘积,即(sΘt)j=sjtj(s\Theta t )_j = s_jt_j(sΘt)j=sjtj
$ \left[\begin{matrix}1\2\end{matrix}\right] \Theta \left[\begin{matrix}3\4\end{matrix}\right] = \left[ \begin{matrix} 1 * 3 \2 * 4\end{matrix}\right ]=\left[ \begin{matrix} 3\8 \end{matrix} \right] $
反向传播的实质是计算偏导数∂C/∂wjkl\partial C / \partial w^l_{jk}∂C/∂wjkl和∂C/∂bjl\partial C / \partial b^l_j∂C/∂bjl,为计算这些值引入中间量δjl\delta_j^lδjl,称为在lthl^{th}lth层第jthj^{th}jth个神经元上的误差,反向传播将给出计算误差的流程,并关联到所计算值。
$ \delta ^L_j = \frac{\partial C}{\partial a_jL}\sigma、(z_j^L) $
右式第一项代表代价随着jthj^{th}jth输出激活值的变化而变化的速度,第二项表示在zjLz^L_jzjL处激活函数σ\sigmaσ变化的速度,如果CCC不依赖一个特定的输出神经元jjj,则δjL\delta^L_jδjL则会极小,符合我们预期目标。以矩阵形式重写方程时可写为如下形式:
$ \delta ^L = \triangledown _aC \Theta \sigma、(zL) $
▽aC\triangledown _aC▽aC是一个向量,其元素为偏导数∂C/∂ajL\partial C / \partial a_j^L∂C/∂ajL,可以将其看成是CCC关于输出激活值的改变速度。
$ \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的转置。通过组合上述两式,就可以计算出任意层的误差δl\delta ^lδl。先利用BP1计算δL\delta ^LδL,而后利用BP2计算δL−1\delta ^{L-1}δL−1,最后一步一步反向传播到整个网络。
$ \frac {\partial C}{\partial b_j^l} = \delta^l_j $
即误差δjl\delta ^l_jδjl和偏导数∂C/∂bjl\partial C / \partial b_j^l∂C/∂bjl**完全一致。**BP1和BP2可以计算δjl\delta ^l_jδjl,所以BP3简化为:
$ \frac {\partial C}{\partial b} = \delta $
其中误差δ\deltaδ和偏置bbb都是针对同一个神经元而言。
$ \frac {\partial C}{\partial w^l_{jk}} = a_k^{l-1} \delta_j^l $
也等同于下式,其中aina_{in}ain是输入给权重www的神经元的激活值,δout\delta_{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/∂w\partial 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…。所以如果输出神经元处于或低(≈0\approx 0≈0)或高(≈1\approx 1≈1)激活值时,最终层的权重学习速度将变缓慢或终止,此时则称输出神经元已经饱和,类似结果对输出神经元的偏置也成立。
上述结构中好的结果就是当激活值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)≈0\sigma^、(z_j^L)\approx0σ、(zjL)≈0。所以如果输出神经元处于或低(≈0\approx 0≈0)或高(≈1\approx 1≈1)激活值时,最终层的权重学习速度将变缓慢或终止,此时则称输出神经元已经饱和,类似结果对输出神经元的偏置也成立。
基于传统矩阵乘法,另一种反向传播方程的表示形式如下:
δL=∑、(zL)▽aC\delta^L=\sum^、(z^L)\triangledown_aCδL=∑、(zL)▽aC
δl=∑、(zL)(wl+1)Tδl+1\delta^l=\sum^、(z^L)(w^{l+1})^T\delta^{l+1}δl=∑、(zL)(wl+1)Tδl+1