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

算法证明

Previous反向传播算法Next算法代码

Last updated 6 years ago

下面介绍反向传播基于的四个方程。

1. 输出层误差的方程

第LLL层为输出层,该层得分误差向量δL\delta^LδL中每一个元素定义如下:

δjL=∂C∂zjL=∂C∂ajLσ′(zjL)\delta^L_j= \frac{\partial C}{\partial z^L_j}=\frac{\partial C}{\partial a^L_j}\sigma'(z^L_j)δjL​=∂zjL​∂C​=∂ajL​∂C​σ′(zjL​)

右式第一项∂C∂ajL\frac{\partial C}{\partial a^L_j}∂ajL​∂C​表示代价随着jthj^{th}jth输出激活值的变化而变化的速度,第二项σ′(zjL)\sigma'(z^L_j)σ′(zjL​)刻画了在zjLz^L_jzjL​处激活函数σ\sigmaσ的变化速度。

证明:应用链式法则我们可以就输出激活值的偏导数的形式重新表示上面的偏导数:

δjL=∂C∂zjL=∑k∂C∂akL∂akL∂zjL\delta^L_j= \frac{\partial C}{\partial z^L_j}=\displaystyle\sum_{k}\frac{\partial C}{\partial a^L_k}\frac{\partial a^L_k}{\partial z^L_j}δjL​=∂zjL​∂C​=k∑​∂akL​∂C​∂zjL​∂akL​​

这里的求和是在输出层的所有神经元上运行的,当k≠jk \ne jk=j时∂akL∂zjL=0\frac{\partial a^L_k}{\partial z^L_j}=0∂zjL​∂akL​​=0,于是,我们可以简化方程为:

δjL=∂C∂ajL∂ajL∂zjL\delta^L_j=\frac{\partial C}{\partial a^L_j}\frac{\partial a^L_j}{\partial z^L_j}δjL​=∂ajL​∂C​∂zjL​∂ajL​​

特别的,

做微分,我们得到

代入上式,得到

将公式进行矩阵化,最后得到第一个公式。

举例来说,如下图:

也就是图中两条绿色的线所标识的权重与误差的乘积和。

3. 代价函数关于网络中任意偏置的改变率

用矩阵表示,可以表示成:

4. 代价函数关于任何一个权重的改变率

举例来说:

于是得到:

然后ajL=σ(zjL)a^L_j=\sigma(z^L_j)ajL​=σ(zjL​),于是,可以写成

δjL=∂C∂ajLσ′(zjL)\delta^L_j=\frac{\partial C}{\partial a^L_j}\sigma'(z^L_j)δjL​=∂ajL​∂C​σ′(zjL​)

以矩阵的形式重写方程,其中每个元素∂C∂ajL\frac{\partial C}{\partial a^L_j}∂ajL​∂C​构成的向量表示成∇aC\nabla_aC∇a​C,每个元素σ′(zjL)\sigma'(z^L_j)σ′(zjL​)构成的向量表示成σ′(zL)\sigma'(z^L)σ′(zL),于是得到

δL=[δ1Lδ2Lδ3L...δnL]=[∂C∂a1Lσ′(z1L)∂C∂a2Lσ′(z2L)∂C∂a3Lσ′(z3L)...∂C∂anLσ′(znL)]=∇aC⊙σ′(zL)\delta^{L}= \begin{bmatrix} \delta^L_{1} \\ \delta^L_{2} \\ \delta^L_{3} \\ ... \\ \delta^L_{n} \end{bmatrix}=\begin{bmatrix} \frac{\partial C}{\partial a^L_1}\sigma'(z^L_1) \\ \frac{\partial C}{\partial a^L_2}\sigma'(z^L_2) \\ \frac{\partial C}{\partial a^L_3}\sigma'(z^L_3) \\ ... \\ \frac{\partial C}{\partial a^L_n}\sigma'(z^L_n) \end{bmatrix}=\nabla_aC \odot \sigma'(z^L)δL=​δ1L​δ2L​δ3L​...δnL​​​=​∂a1L​∂C​σ′(z1L​)∂a2L​∂C​σ′(z2L​)∂a3L​∂C​σ′(z3L​)...∂anL​∂C​σ′(znL​)​​=∇a​C⊙σ′(zL)

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

δl=((wl+1)Tδl+1)⊙σ′(zl)\delta^l =((w^{l+1})^T\delta^{l+1}) \odot\sigma'(z^l)δl=((wl+1)Tδl+1)⊙σ′(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+1)th(l+1)^{th}(l+1)th的误差向量δl+1\delta^{l+1}δl+1,当我们应用转置的权重矩阵(wl+1)T(w^{l+1})^T(wl+1)T,我们可以把它看做是沿着网络反向移动误差,给了我们度量在lthl^{th}lth层的误差的方法。然后进行Hadamard乘积运算σ′(zl)\sigma'(z^l)σ′(zl),这会让误差通过lll层的激活函数反向传递回来并给出在第lll层的带权输入误差向量δl\delta^lδl。

根据该公式,我们可以首先根据第一个公式得到输出层的误差δL\delta^LδL,然后得到第(L−1)th(L-1)^{th}(L−1)th层的误差,如此一步步地方向传播完整个网络。

证明:根据链式法则,我们可以将δjl=∂C∂zjl\delta^l_j= \frac{\partial C}{\partial z^l_j}δjl​=∂zjl​∂C​写成:

δjl=∂C∂zjl=∑k∂C∂zkl+1∂zkl+1∂zjl=∑k∂zkl+1∂zjlδkl+1\delta^l_j= \frac{\partial C}{\partial z^l_j}=\displaystyle\sum_{k}\frac{\partial C}{\partial z^{l+1}_{k}}\frac{\partial z^{l+1}_k}{\partial z^l_j}=\displaystyle\sum_{k}\frac{\partial z^{l+1}_k}{\partial z^l_j}\delta^{l+1}_kδjl​=∂zjl​∂C​=k∑​∂zkl+1​∂C​∂zjl​∂zkl+1​​=k∑​∂zjl​∂zkl+1​​δkl+1​

这里我们将最后一个式子交换了两边的项,并用δkl+1\delta^{l+1}_kδkl+1​代入。然后

zkl+1=∑jwkjl+1ajl+bkl+1=∑jwkjl+1σ(zjl)+bkl+1z^{l+1}_k=\displaystyle\sum_{j}w^{l+1}_{kj}a^l_j+b^{l+1}_k=\displaystyle\sum_{j}w^{l+1}_{kj}\sigma(z^{l}_j)+b^{l+1}_kzkl+1​=j∑​wkjl+1​ajl​+bkl+1​=j∑​wkjl+1​σ(zjl​)+bkl+1​
∂zkl+1∂zjl=wkjl+1σ′(zjl)\frac{\partial z^{l+1}_k}{\partial z^l_j}=w^{l+1}_{kj}\sigma'(z^{l}_j)∂zjl​∂zkl+1​​=wkjl+1​σ′(zjl​)
δjl=∑kwkjl+1σ′(zjl)δkl+1=(∑kwkjl+1δkl+1)σ′(zjl)\delta^l_j=\displaystyle\sum_{k}w^{l+1}_{kj}\sigma'(z^{l}_j)\delta^{l+1}_k=(\displaystyle\sum_{k}w^{l+1}_{kj}\delta^{l+1}_k) \sigma'(z^{l}_j)δjl​=k∑​wkjl+1​σ′(zjl​)δkl+1​=(k∑​wkjl+1​δkl+1​)σ′(zjl​)

当我们已经计算得到了第333层的误差向量δ3=[δ13δ23]\delta^{3}= \begin{bmatrix} \delta^3_{1} \\ \delta^3_{2} \end{bmatrix}δ3=[δ13​δ23​​],这时计算第222层的误差向量δ2\delta^2δ2,我们先计算δ32\delta^2_3δ32​,根据上面的公式可以得到

δ32=(∑kwk33δk3)σ′(z33)=(w133δ13+w233δ23)σ′(z32)=([w133w233]T⋅[δ13δ23])σ′(z32)\delta^2_3=(\displaystyle\sum_{k}w^{3}_{k3}\delta^3_k) \sigma'(z^{3}_3)=(w^{3}_{13}\delta^3_1+w^{3}_{23}\delta^3_2) \sigma'(z^{2}_3)=(\begin{bmatrix} w^3_{13} \\ w^3_{23} \end{bmatrix}^T \cdot \begin{bmatrix} \delta^3_{1} \\ \delta^3_{2} \end{bmatrix})\sigma'(z^{2}_3)δ32​=(k∑​wk33​δk3​)σ′(z33​)=(w133​δ13​+w233​δ23​)σ′(z32​)=([w133​w233​​]T⋅[δ13​δ23​​])σ′(z32​)
∂C∂bjl=δjl\frac{\partial C}{\partial b^l_j}=\delta^l_j∂bjl​∂C​=δjl​

也就是误差δjl\delta^l_jδjl​和∂C∂bjl\frac{\partial C}{\partial b^l_j}∂bjl​∂C​完全一致。

证明:根据链式法则,其中zjl=∑kwjklakl−1+bjlz^l_j = \displaystyle\sum_{k}w^l_{jk} a^{l-1}_k + b^l_jzjl​=k∑​wjkl​akl−1​+bjl​,最终可以得到

∂C∂bjl=∂C∂zjl∂zjl∂bjl=∂C∂zjl\frac{\partial C}{\partial b^l_j} = \frac{\partial C}{\partial z^l_{j}}\frac{\partial z^l_j}{\partial b^l_j}=\frac{\partial C}{\partial z^l_{j}}∂bjl​∂C​=∂zjl​∂C​∂bjl​∂zjl​​=∂zjl​∂C​
∂C∂bl=δl\frac{\partial C}{\partial b^l}=\delta^l∂bl∂C​=δl
∂C∂wjkl=akl−1δjl\frac{\partial C}{\partial w^l_{jk}}=a^{l-1}_k\delta^l_j∂wjkl​∂C​=akl−1​δjl​

证明:根据链式法则,其中zjl=∑kwjklakl−1+bjlz^l_j = \displaystyle\sum_{k}w^l_{jk} a^{l-1}_k + b^l_jzjl​=k∑​wjkl​akl−1​+bjl​,最终可以得到

∂C∂wjkl=∂C∂zjl∂zjl∂bjl=∂C∂zjlajl−1=akl−1δjl\frac{\partial C}{\partial w^l_{jk}} = \frac{\partial C}{\partial z^l_{j}}\frac{\partial z^l_j}{\partial b^l_j}=\frac{\partial C}{\partial z^l_{j}} a^{l-1}_j=a^{l-1}_k\delta^l_j∂wjkl​∂C​=∂zjl​∂C​∂bjl​∂zjl​​=∂zjl​∂C​ajl−1​=akl−1​δjl​

上面图中,想要计算∂C∂w133\frac{\partial C}{\partial w^3_{13}}∂w133​∂C​,则∂C∂w133=a32δ13\frac{\partial C}{\partial w^3_{13}}=a^2_3\delta^3_1∂w133​∂C​=a32​δ13​。也可以理解成:

∂C∂w=ainδout\frac{\partial C}{\partial w}=a_{in}\delta_{out}∂w∂C​=ain​δout​

其中aina_{in}ain​是输入给权重www的神经元的激活值,δout\delta_{out}δout​是输出自权重www的神经元的误差。

用矩阵表示,可以表示成(其中第(l−1)th(l-1)^{th}(l−1)th层神经元有mmm个,第lthl^{th}lth层神经元有nnn个)

∂C∂wl=∂C/∂[w11lw12lw13l...w1mlw21lw22lw23l...w1mlw31lw12lw13l...w1ml...wn1lwn2lwn3l...wnml]=[a1l−1δ1la2l−1δ1la3l−1δ1l...aml−1δ1la1l−1δ2la2l−1δ2la3l−1δ2l...aml−1δ2la1l−1δ3la2l−1δ3la3l−1δ3l...aml−1δ3l...a1l−1δnla2l−1δnla3l−1δnl...aml−1δnl]\frac{\partial C}{\partial w^l} = \partial C/\partial \begin{bmatrix} w^l_{11} & w^l_{12} & w^l_{13} & ... & w^l_{1m} \\ w^l_{21} & w^l_{22} & w^l_{23} & ... & w^l_{1m} \\ w^l_{31} & w^l_{12} & w^l_{13} & ... & w^l_{1m} \\ ... \\ w^l_{n1} & w^l_{n2} & w^l_{n3} & ... & w^l_{nm} \end{bmatrix}=\begin{bmatrix} a^{l-1}_1 \delta^l_1 & a^{l-1}_2 \delta^l_1 & a^{l-1}_3 \delta^l_1 & ... & a^{l-1}_m \delta^l_1 \\ a^{l-1}_1 \delta^l_2 & a^{l-1}_2 \delta^l_2 & a^{l-1}_3 \delta^l_2 & ... & a^{l-1}_m \delta^l_2 \\ a^{l-1}_1 \delta^l_3 & a^{l-1}_2 \delta^l_3 & a^{l-1}_3 \delta^l_3 & ... & a^{l-1}_m \delta^l_3 \\ ... \\ a^{l-1}_1 \delta^l_n & a^{l-1}_2 \delta^l_n & a^{l-1}_3 \delta^l_n & ... & a^{l-1}_m \delta^l_n \end{bmatrix}∂wl∂C​=∂C/∂​w11l​w21l​w31l​...wn1l​​w12l​w22l​w12l​wn2l​​w13l​w23l​w13l​wn3l​​............​w1ml​w1ml​w1ml​wnml​​​=​a1l−1​δ1l​a1l−1​δ2l​a1l−1​δ3l​...a1l−1​δnl​​a2l−1​δ1l​a2l−1​δ2l​a2l−1​δ3l​a2l−1​δnl​​a3l−1​δ1l​a3l−1​δ2l​a3l−1​δ3l​a3l−1​δnl​​............​aml−1​δ1l​aml−1​δ2l​aml−1​δ3l​aml−1​δnl​​​
∂C∂wl=[δ1lδ2lδ3l...δnl]⋅[a1l−1,a2l−1,...,aml−1]\frac{\partial C}{\partial w^l}= \begin{bmatrix} \delta_1^{l} \\ \delta_2^{l} \\ \delta_3^{l} \\ ... \\ \delta_n^{l} \end{bmatrix}\cdot [a^{l-1}_1, a^{l-1}_2, ..., a^{l-1}_m]∂wl∂C​=​δ1l​δ2l​δ3l​...δnl​​​⋅[a1l−1​,a2l−1​,...,aml−1​]

其中[δ1l,δ2l,...,δnl][\delta^l_1, \delta^l_2, ..., \delta^l_n][δ1l​,δ2l​,...,δnl​]是n∗1n * 1n∗1,[a1l−1,a2l−1,...,aml−1][a^{l-1}_1, a^{l-1}_2, ..., a^{l-1}_m][a1l−1​,a2l−1​,...,aml−1​]是1∗m1 * m1∗m,最终得到n∗mn*mn∗m的权重矩阵。