Chapter 2. 反向传播

  • 前言

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

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

  • 权重

w j k l w_{j_k}^l 表示从 ( l 1 ) t h (l-1)^{th} 层的 k t h k^{th} 个神经元到 l t h l^{th} 层的 j t h j^{th} 个神经元的连接上的权重。

第2层的第4个神经元到第3层的第2个神经元的连接上的权重

b j l b_j^l 表示在 l t h l^{th} 层第 j t h j^{th} 个神经元的偏置,使用 a j l a^l_j 表示 l t h l^{th} 层第 j t h j^{th} 个神经元的激活值。从而变可以对 l t h l^{th} 层的第 j t h j^{th} 个神经元的激活值 a j l a^l_j ( l 1 ) t h (l-1)^{th} 层的激活值建立关联:

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

求和在其中 ( l 1 ) t h (l-1)^{th} 层上的 k k 个神经元进行。为方便重写,对每层 l l 均定义一个权重矩阵 w l w^l ,其中的元素为连接到 l t h l^{th} 层神经元的权重。同样对每层顶一个偏置向量 b l b^l ,其中的元素即为 b j l b^l_j ,每个元素对应 l t h l^{th} 层的每个神经元。然后定义激活向量 a l a^l ,元素为激活值 a j l a^l_j 。这样一来,上面的式子就可以改写为下列形式:

a l = σ ( w l a l 1 + b l ) a^l=\sigma (w^l a^{l-1}+b^l)

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

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

  • 回顾

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

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

  • 两个假设
    • 代价函数可以被写成一个在每个训练样本 x x 上的代价函数 C x C_x 的均值 C = 1 n x C x C=\frac{1}{n} \sum_xC_x

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

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

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

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

2.3 Hadamard乘积

  • 定义

假设 s s t t 是相同维度的向量,则使用 s Θ t s\Theta t 来表示按元素的乘积,这种类型的按元素乘法也叫做Hadamard乘积或Schur乘积,即 ( s Θ t ) j = s j t j (s\Theta t )_j = s_jt_j

$
\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]
$

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

反向传播的实质是计算偏导数 C / w j k l \partial C / \partial w^l_{jk} C / b j l \partial C / \partial b^l_j ,为计算这些值引入中间量 δ j l \delta_j^l ,称为在 l t h l^{th} 层第 j t h j^{th} 个神经元上的误差,反向传播将给出计算误差的流程,并关联到所计算值。

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

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

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

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

a C \triangledown _aC 是一个向量,其元素为偏导数 C / a j L \partial C / \partial a_j^L ,可以将其看成是 C C 关于输出激活值的改变速度。

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

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

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

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

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

即误差 δ j l \delta ^l_j 和偏导数 C / b j l \partial C / \partial b_j^l **完全一致。**BP1和BP2可以计算 δ j l \delta ^l_j ,所以BP3简化为:

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

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

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

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

也等同于下式,其中 a i n a_{in} 是输入给权重 w w 的神经元的激活值, δ o u t \delta_{out} 是输出自权重 w w 的神经元的误差。

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

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

上述结构中好的结果就是当激活值 a i n a_{in} 很小, a i n 0 a_{in} \approx 0 ,此时梯度 C / w \partial C / \partial 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 )或高( 1 \approx 1 )激活值时,最终层的权重学习速度将变缓慢或终止,此时则称输出神经元已经饱和,类似结果对输出神经元的偏置也成立。

  • 总结

反向传播的四个方程式

  • 问题

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

    • BP1

      δ L = ( z L ) a C \delta^L=\sum^、(z^L)\triangledown_aC

    • BP2

      δ l = ( z L ) ( w l + 1 ) T δ l + 1 \delta^l=\sum^、(z^L)(w^{l+1})^T\delta^{l+1}

    • 从而推出

      δ l = ( z l ) ( w l + 1 ) T . . . ( z L 1 ) ( w L ) T ( z L ) a C \delta^l = \sum ^、(z^l)(w^{l+1})^T...\sum ^、(z^{L-1})(w^L)^T\sum^、(z^L)\triangledown _aC

2.6 反向传播算法

  • 算法描述
    1. 输入x:为输入层设置对应的激活值 a 1 a^1
    2. 前向传播:对每个 l = 1 , 2 , 3 , . . . , L l=1,2,3,...,L 计算相应的 z l = w l a l 1 + b l z^l=w^la^{l-1}+b^l KaTeX parse error: Can't use function '\(' in math mode at position 11: a^l=\sigma\̲(̲z^l\)
    3. 输出层误差 δ L \delta^L :计算向量KaTeX parse error: Can't use function '\(' in math mode at position 41: …C\Theta\sigma^、\̲(̲z^L\)
    4. 反向误差传播:对于每个 l = L 1 , L 2 , . . . , 2 l=L-1,L-2,...,2 ,计算KaTeX parse error: Can't use function '\(' in math mode at position 10: \delta^l=\̲(̲\(w^{l+1}\)^T\d…
    5. 输出:代价函数的梯度由 C w j k l = a _ k l 1 δ l _ j \frac{\partial C}{\partial w_{jk}^l} = a\_k^{l-1}\delta^l\_j C b j l = δ _ j l \frac{\partial C}{\partial b_{j}^l}=\delta\_j^l 共同得出;

      也等同于下式,其中 w w 的神经元的激活值, δ o u t δ_{out} ​是输出自权重 w w 的神经元的误差。
      w C = a i n δ o u t \frac{∂w}{∂C​}=a_{in}​δ_{out}​

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

  • 其他理解的方面

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

  • 总结

反向传播的四个方程式

  • 问题

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

  • BP1

δ L = ( z L ) a C \delta^L=\sum^、(z^L)\triangledown_aC

  • BP2

δ l = ( z L ) ( w l + 1 ) T δ l + 1 \delta^l=\sum^、(z^L)(w^{l+1})^T\delta^{l+1}

  • 从而推出
    δ l = ( z l ) ( w l + 1 ) T . . . ( z L 1 ) ( w L ) T ( z L ) a C \delta^l = \sum ^、(z^l)(w^{l+1})^T...\sum ^、(z^{L-1})(w^L)^T\sum^、(z^L)\triangledown _aC
发布了104 篇原创文章 · 获赞 69 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/github_39655029/article/details/99436593