- 前言
BP算法最初在1970年代被提及,主要用于快速计算代价函数的梯度,其核心是代价函数 关于任意权重 (或偏置 )的偏导数 的表达式,通过改变权重和偏置,从而评估代价函数变化的快慢。
2.1 神经网络中使用矩阵快速计算输出的方法
- 权重
用 表示从 层的 个神经元到 层的 个神经元的连接上的权重。
用 表示在 层第 个神经元的偏置,使用 表示 层第 个神经元的激活值。从而变可以对 层的第 个神经元的激活值 和 层的激活值建立关联:
$
a_j^l=\sigma (\sum_k w^l_{jk} a{l-1}_{k}+b_jl)
$
求和在其中 层上的 个神经元进行。为方便重写,对每层 均定义一个权重矩阵 ,其中的元素为连接到 层神经元的权重。同样对每层顶一个偏置向量 ,其中的元素即为 ,每个元素对应 层的每个神经元。然后定义激活向量 ,元素为激活值 。这样一来,上面的式子就可以改写为下列形式:
上述表达式全局考虑了每层激活值和前一层激活值的关联方式:用权重矩阵作用在激活值上,然后加上一个偏置向量,最后作用于代价函数 ,其中 叫做 层神经元的带权输入。
2.2 关于代价函数的两个假设
- 回顾
$
C = \frac{1}{2n} \ sum _x ||y(x)-aL(x)||2
$
上式为二次代价函数, 为训练样本总数,求和遍历每个训练样本 , 为对应目标输出, 表示网络层数, 是当输入为 时网络输出的激活值向量。
- 两个假设
- 代价函数可以被写成一个在每个训练样本 上的代价函数 的均值
因为反向传播实际上是对一个独立的训练样本计算 和 ,然后通过在所有训练样本上进行平均化从而获得 和 。一旦有了这个假设,则可认为训练样本 固定.
- 代价函数可以写成神经网络输出的函数
因为对于一个单体训练样本 而言,其二次代价函数可以写成下列式子,同时它也是输出的激活值的函数:
$
C= \frac{1}{2}||y-aL||2=\frac{1}{2}\sum_j(y_j-a_jL)2
$
2.3 Hadamard乘积
- 定义
假设 和 是相同维度的向量,则使用 来表示按元素的乘积,这种类型的按元素乘法也叫做Hadamard乘积或Schur乘积,即
$
\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 反向传播的四个基本方程
反向传播的实质是计算偏导数 和 ,为计算这些值引入中间量 ,称为在 层第 个神经元上的误差,反向传播将给出计算误差的流程,并关联到所计算值。
- 输出层误差的方程, ,BP1
$
\delta ^L_j = \frac{\partial C}{\partial a_jL}\sigma、(z_j^L)
$
右式第一项代表代价随着 输出激活值的变化而变化的速度,第二项表示在 处激活函数 变化的速度,如果 不依赖一个特定的输出神经元 ,则 则会极小,符合我们预期目标。以矩阵形式重写方程时可写为如下形式:
$
\delta ^L = \triangledown _aC \Theta \sigma、(zL)
$
是一个向量,其元素为偏导数 ,可以将其看成是 关于输出激活值的改变速度。
- 使用下一层的误差 来表示当前层的误差 ,BP2
$
\delta ^l = ((w{l+1})T \delta^{l+1}) \Theta \sigma、(zl)
$
其中 是 层权重矩阵 的转置。通过组合上述两式,就可以计算出任意层的误差 。先利用BP1计算 ,而后利用BP2计算 ,最后一步一步反向传播到整个网络。
- 代价函数关于网络中任意偏置的改变率,BP3
$
\frac {\partial C}{\partial b_j^l} = \delta^l_j
$
即误差 和偏导数 **完全一致。**BP1和BP2可以计算 ,所以BP3简化为:
$
\frac {\partial C}{\partial b} = \delta
$
其中误差 和偏置 都是针对同一个神经元而言。
- 代价函数关于任何一个权重的改变率,BP4
$
\frac {\partial C}{\partial w^l_{jk}} = a_k^{l-1} \delta_j^l
$
也等同于下式,其中 是输入给权重 的神经元的激活值, 是输出自权重 的神经元的误差。
$
\frac {\partial C}{\partial w} = a_{in} \delta_{out}
$
[图片上传失败…(image-aaffdb-1565679482579)]
上述结构中好的结果就是当激活值 很小, ,此时梯度 也趋于很小,这时候就说权重缓慢学习,表示在梯度下降时,权重不会改变太多,即来自低激活值神经元的权重学习将非常缓慢。
- 其他理解的方面
对于(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时, 函数变得非常平,此时KaTeX parse error: Can't use function '\(' in math mode at position 9: \sigma^、\̲(̲z\_j^L\)\approx…。所以如果输出神经元处于或低( )或高( )激活值时,最终层的权重学习速度将变缓慢或终止,此时则称输出神经元已经饱和,类似结果对输出神经元的偏置也成立。
- 总结
-
问题
基于传统矩阵乘法,另一种反向传播方程的表示形式如下:
-
BP1
-
BP2
-
从而推出
-
2.6 反向传播算法
- 算法描述
- 输入x:为输入层设置对应的激活值 ;
- 前向传播:对每个 计算相应的 和KaTeX parse error: Can't use function '\(' in math mode at position 11: a^l=\sigma\̲(̲z^l\);
- 输出层误差 :计算向量KaTeX parse error: Can't use function '\(' in math mode at position 41: …C\Theta\sigma^、\̲(̲z^L\);
- 反向误差传播:对于每个 ,计算KaTeX parse error: Can't use function '\(' in math mode at position 10: \delta^l=\̲(̲\(w^{l+1}\)^T\d…;
- 输出:代价函数的梯度由
和
共同得出;
也等同于下式,其中 的神经元的激活值, 是输出自权重 的神经元的误差。
上述结构中好的结果就是当激活值 很小, ,此时梯度 也趋于很小,这时候就说权重缓慢学习,表示在梯度下降时,权重不会改变太多,即来自低激活值神经元的权重学习将非常缓慢。
- 其他理解的方面
对于(BP1)中的 ,当 近似等于0或1时, 函数变得非常平,此时 。所以如果输出神经元处于或低( )或高( )激活值时,最终层的权重学习速度将变缓慢或终止,此时则称输出神经元已经饱和,类似结果对输出神经元的偏置也成立。
- 总结
- 问题
基于传统矩阵乘法,另一种反向传播方程的表示形式如下:
- BP1
- BP2
- 从而推出