反向传播算法是计算梯度的快速算法。反向传播算法是一个对代价函数\( C \) 关于任何权重\( w\) 或偏置\( b\)的偏导数的表达式,通过这个表达式,在改变权重和偏置时,表明代价函数变化的快慢。

4.4.1 反向传播模型与假设

主要思想:

  1. 将训练集数据输入到DNN的输入层,经过隐藏层,最后达到输出层并输出结果,这是DNN的前向传播过程。
  2. 由于DNN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层。
  3. 仅仅用一次前向传播,加上一次后向传播,就可以同时计算所有的偏导数\(\frac {∂C}{∂w_{jk}^l}\)、\(\frac {∂C}{∂b_j^l}\)。
  4. 根据代价函数的误差,调整各种参数的值,不断迭代上述过程,直至收敛。
反向传播的计算代价大概是前向传播的两倍,比起直接计算导数,显然有着更大的优势。

模型描述:

  • 参数 \(w_{jk}^l\) 表示从 \((l-1)^{th}\) 层的 \(k^{th}\) 个神经元到 \(l^{th}\) 层的 \(j^{th}\) 个神经元的连接上的权重。
  • \(b_j^l\) 表示在\(l^{th}\) 层第 \(j^{th}\) 个神经元的偏置。
  • \(zj^l\) 表示 \(l^{th}\)层第 \(j \) 个神经元激活函数的带权输入,\(z^l\) 表示 \(l^{th}\) 层神经元激活函数的带权输入 $$z_j^l=∑_k w{jk}^l a_k^{l-1}+b_j^l\→z^l=w^l a^{l-1}+b^l$$
  • \(aj^l \) 表示 \(l^{th}\) 层第 \(j^{th}\) 个神经元的激活值,\(a^l\) 表示 \(l^{th}\) 层神经元的激活值 $$a_j^l=σ(∑_k w{jk}^l a_k^{l-1}+b_j^l )\→a^l=σ(w^l a^{l-1}+b^l )$$
  • \(l^{th}\) 层的激活值 \(a^l\) 与 \(l^{th}\) 层神经元的带权输入 \(z^l\) 之间关系:
  • \(δ_j^l\) 表示 \(l^{th}\) 层的第 \(j^{th}\) 个神经元上的误差度量,\(δ_j^l\) 表示 \(l^{th}\) 层神经元的误差度量:

模型参数

代价函数的两个假设:

  1. 假设一:代价函数可以被写成一个在每个训练样本\(x\)上的代价函数 \(C_x\)的均值:\(C=\frac {1}{m} ∑_x C_x \)。反向传播实际上是计算每一个独立\(\frac {∂C_x}{∂w}\)和(\(\frac {∂C_x}{∂b}\)后,通过在所有训练样本上进行平均化获得\(\frac {∂C}{∂w}\)和\(\frac {∂C}{∂b}\)。
  2. 假设二:代价函数可以写成神经网络输出\(a^L\)的函数。

代价函数假设

二次代价函数满足对于每一个独立的训练样本\\(x\\):\\(C=\frac {1}{2} ||y-a^L ||^2=\frac {1}{2} ∑_j ||y_j-a_j^L ||^2 \\) ,将 \\(C\\) 看成仅有输出激活值\\(a^L\\)的函数,而\\( y\\)仅仅是帮助定义函数的参数而已。

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

反向传播最终极的含义其实就是计算偏导数 \(\frac {∂C}{∂w{jk}^l}\) 和 \(\frac {∂C}{∂b_j^l}\) :首先引入一个中间量 \(δ_j^l\) 称为在 \(l^{th}\) 层第 \(j^{th}\) 个神经元上的误差,反向传播将给出计算误差 \(δ_j^l\) 的流程,然后将其关联到计算 \(\frac {∂C}{∂w{jk}^l}\) 和 \(\frac {∂C}{∂b_j^l}\) 上。

计算输出层误差方程:

方程:

证明:

说明:

  • \(\frac {∂C}{∂a_j^L}\) 表示代价函数随着 \(j^{th}\) 输出激活值变化而变化的速度,\(σ’(z_j^L)\) 表示在 \(z_j^L \) 处激活函数 \(σ\) 变化速度。
  • 向量 \(∇_a C\) 其元素是偏导数 \(\frac {∂C}{∂a_j^L} \),在使用二次代价函数时:

由后一层的误反向计算前一层的误差:

方程:

证明:

说明:

  • 假设知道 \((l+1)^{th}\) 层的误差 \(δ^{l+1}\) ,应用转置的权重矩阵 \((w^{l+1})^T\) ,可以凭直觉地把它看作是在沿着网络反向移动误差,给了度量在 \(l^{th}\) 层输出的误差方法,然后进行 Hadamard乘积运算。这会让误差通过 \(l^{th}\) 层的激活函数反向传递回来并给出在第 \(l^{th}\) 层的带权输入的误差 \(δ\)
  • 通过组合以上两个公式,可以计算任何层的误差 \(δ^l\) 。首先使用第一个公式计算 \(δ^l\) ,然后应用 第二个公式来计算 \(δ^{l-1}\) ,然后再次计算 \(δ^{l-2}\) ,如此一步一步地反向传播完整个网络。

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

方程:

证明:

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

方程:

证明:

4.4.3 反向传播算法应用步骤

随机梯度下降应用步骤:

  1. 通过前向传播,计算并保存每层神经元的带权输入值\(z^1\)和激活值 \(a^1\) :
  2. 计算输出层误差 \(δ^L\) : 计算向量
  3. 通过反向传播,计算并保存每层的误差:
  4. 由每层的激活值 \(a^1\)和每层的误差\(δ^l\),计算并保存每层的代价函数的梯度:
  5. 通过梯度下降算法,更新每层神经元的偏置和权重。

小批量数据应用步骤:

  1. 通过前向传播,计算并保存每层神经元的带权输入值\(z^1\)和激活值 \(a^1\) :
  2. 计算输出层误差 \(δ^{x,L}\) : 计算向量
  3. 通过反向传播,计算并保存每层的误差\(δ^{x,l}\):
  4. 由每层的激活值 \(a^1\)和每层的误差\(δ^l\),计算并保存每层的代价函数的梯度,通过梯度下降算法,更新每层神经元的偏置和权重::
  5. 在实践中实现随机梯度下降,还需要一个产生训练样本的小批量数据的循环,进行多次迭代。