Machine Learning
  • Introduction
  • 机器学习
    • 前言
      • 符号表
    • 监督式学习
      • 感知机
        • 感知机模型
        • 感知机学习算法
        • 算法python实现
      • Logistic回归
        • Logistic分布
        • Logistic回归模型
        • 算法python实现
      • 线性回归
        • 线性回归模型
        • 算法python实现
      • K近邻法
        • k近邻模型
        • kd树方法
        • kd树python实现
        • knn实例
      • 朴素贝叶斯法
        • 模型和原理
        • 参数估计
        • 算法和实现
      • 决策树
        • 模型与学习
        • 特征选择
        • 生成算法和剪枝
        • python实现
      • 支持向量机
    • 神经网络
      • 神经元模型和感知机
      • 神经网络
      • 神经网络的矩阵表达
      • 反向传播算法
        • 算法证明
        • 算法代码
        • 基于矩阵的计算
      • 改进神经网络的学习方法
        • 交叉熵代价函数
        • softmax
        • regularization
        • 权重初始化
      • 卷积神经网络
        • 基本介绍
    • 数学基础
      • 线性代数
        • 特征值和特征向量
      • 概率统计
        • 随机变量的特征
        • 样本统计量
        • 先验后验概率
      • 微积分
        • 向量内积
        • 方向导数和梯度
        • 梯度下降法
      • 信息论
        • 熵
        • 相对熵和交叉熵
        • 条件熵
        • 互信息
Powered by GitBook
On this page
  • 反向传播算法
  • 反向传播算法的证明
  • 两个假设
  • Hadamard乘积
  • 反向传播的四个基本方程
  1. 机器学习
  2. 神经网络

反向传播算法

Previous神经网络的矩阵表达Next算法证明

Last updated 6 years ago

反向传播算法

我们希望有个算法,能够让我们找到权重和偏置,以至于神经网络的输出y(x)y(x)y(x)能够拟合所有的训练输入xxx。为了量化我们如何实现这个目标,我们定义一个代价函数:

C(w,b)=12n∑x∣∣y(x)−aL(x)∣∣2C(w,b)=\frac{1}{2n}\displaystyle\sum_{x}||y(x)-a^L(x)||^2C(w,b)=2n1​x∑​∣∣y(x)−aL(x)∣∣2

这里www表示所有网络中权重的集合,bbb是所有的偏置,nnn是训练输入数据的个数,LLL表示网络的层数,aL=aL(x)a^L=a^L(x)aL=aL(x)是表示当输入为xxx时的网络输出的激活值向量,求和则是在总的训练输出xxx上进行的。符号∣∣v∣∣||v||∣∣v∣∣是指向量vvv的模。我们把CCC称为二次代价函数;有时也别称为均方误差或者MSE。

代价函数C(w,b)C(w,b)C(w,b)是非负的,因为求和公式中的每一项都是非负的。此外,当对于所有的训练输入xxx,y(x)y(x)y(x)接近于输出aaa时,代价函数的值相当小,即C(w,b)≈0C(w,b)\approx0C(w,b)≈0。

反向传播算法给出了一个计算代价函数梯度的的方法:

  1. 输入xxx:为输入层设置对应的激活值a1a^1a1

  2. 前向传播:对每个l=2,3,...,Ll=2,3,...,Ll=2,3,...,L计算相应的的zl=wl⋅a(l−1)+blz^l=w^l\cdot a^{(l-1)} + b^lzl=wl⋅a(l−1)+bl和al=σ(zl)a^l = \sigma(z^l)al=σ(zl)

  3. 输出层误差δL\delta^LδL:计算向量δL=∇aC⨀σ′(zL)\delta^L=\nabla_aC \bigodot\sigma'(z^L)δL=∇a​C⨀σ′(zL)

  4. 反向误差传播:对每个l=L−1,L−2,...,2l= L-1, L-2, ..., 2l=L−1,L−2,...,2,计算δl=((w(l+1)T)δ(l+1))⨀σ′(zL)\delta^l=(({w^{(l+1)}}^T)\delta^{(l+1)})\bigodot\sigma'(z^L)δl=((w(l+1)T)δ(l+1))⨀σ′(zL)

  5. 输出:代价函数的梯度由∂C∂Wjkl=akl−1δjl\frac{\partial C}{\partial W^l_{jk}}=a^{l-1}_k\delta^l_j∂Wjkl​∂C​=akl−1​δjl​和∂C∂bjl=δjl\frac{\partial C}{\partial b^l_{j}}=\delta^l_j∂bjl​∂C​=δjl​得出。

反向传播算法的证明

两个假设

第二个假设就是代价可以写成神经网络输出的函数

Hadamard乘积

Hadamard 乘积是按元素乘法的运算

反向传播的四个基本方程

接下来我们介绍四个基本方程。

反向传播算法的目标是计算代价函数CCC分别关于www和bbb的偏导数∂C∂Wjkl\frac{\partial C}{\partial W^l_{jk}}∂Wjkl​∂C​和∂C∂bjl\frac{\partial C}{\partial b^l_{j}}∂bjl​∂C​。为了让方向传播可行,我们需要做出关于代价函数的两个主要假设。

第一个假设就是代价函数可以被写成一个在每个训练样本xxx上的代价函数CxC_xCx​的均值C=1n∑xCxC=\frac{1}{n}\displaystyle\sum_{x}C_xC=n1​x∑​Cx​。对于二次代价函数,每个独立的训练样本的代价是Cx=12∣∣y(x)−aL(x)∣∣2C_x=\frac{1}{2}||y(x)-a^L(x)||^2Cx​=21​∣∣y(x)−aL(x)∣∣2,这个假设对于其他的代价函数也必须满足。需要这个假设的原因是反向传播实际上是对一个独立的训练样本计算了∂Cx∂w\frac{\partial C_x}{\partial w}∂w∂Cx​​和∂Cx∂b\frac{\partial C_x}{\partial b}∂b∂Cx​​,然后通过在所有的训练样本上进行平均化获得∂C∂w\frac{\partial C}{\partial w}∂w∂C​和∂C∂b\frac{\partial C}{\partial b}∂b∂C​。

如图所示,将代价函数CCC看成仅有输出激活值aLa^LaL的函数。

[12]⊙[34]=[1∗32∗4]=[38]\begin{bmatrix} 1 \\ 2 \end{bmatrix} \odot \begin{bmatrix} 3 \\ 4 \end{bmatrix}=\begin{bmatrix} 1*3 \\ 2*4 \end{bmatrix} =\begin{bmatrix} 3 \\ 8 \end{bmatrix}[12​]⊙[34​]=[1∗32∗4​]=[38​]

假设sss和ttt是两个相同维度的向量,那么我们使用s⊙ts \odot ts⊙t来表示按元素的乘积。所以s⊙ts \odot ts⊙t的元素就是(s⊙t)j=sjtj(s \odot t )_j=s_jt_j(s⊙t)j​=sj​tj​。

反向传播其实是对权重和偏置变化影响代价函数过程的理解。最终的含义就是计算偏导数∂C∂Wjkl\frac{\partial C}{\partial W^l_{jk}}∂Wjkl​∂C​和∂C∂bjl\frac{\partial C}{\partial b^l_{j}}∂bjl​∂C​。为了计算这些值,我们先引入一个中间量δjl\delta^l_jδjl​,这个称之为在lthl^{th}lth的第jthj^{th}jth个神经元上的误差。反向传播将给出计算误差δjl\delta^l_jδjl​的流程,然后将其关联到计算上面两个偏导数上面。

假定在lthl^{th}lth层的第jthj^{th}jth神经元上,对神经元的带权输入增加很小的变化Δzjl\Delta z^l_jΔzjl​,这使得神经元的输出由σ(zjl)\sigma(z^l_j)σ(zjl​)变成σ(zjl+Δzjl)\sigma(z^l_j+\Delta z^l_j)σ(zjl​+Δzjl​),这个变化会向网络后的层进行传播,最终导致整个代价产生∂C∂zjlΔzjl\frac{\partial C}{\partial z^l_j} \Delta z^l_j∂zjl​∂C​Δzjl​的改变。 假如∂C∂zjl\frac{\partial C}{\partial z^l_j}∂zjl​∂C​是一个很大的值(或正或负),那么可以通过选择与其相反的符号的Δzjl\Delta z^l_jΔzjl​来降低代价。相反如果∂C∂zjl\frac{\partial C}{\partial z^l_j}∂zjl​∂C​是一个接近于000的值,这时候并不能通过调整输入zjlz^l_jzjl​来改善多少代价。所以这里有个启发式的认识,∂C∂zjl\frac{\partial C}{\partial z^l_j}∂zjl​∂C​是神经元的误差度量。

按照上面的描述,我们定义lthl^{th}lth层的第jthj^{th}jth个神经元的上的误差δjl\delta^l_jδjl​为

δjl=∂C∂zjl\delta^l_j=\frac{\partial C}{\partial z^l_j}δjl​=∂zjl​∂C​

我们使用δl\delta^lδl表示关联于lll层的误差向量。