反向传播算法是计算梯度的快速算法。反向传播算法是一个对代价函数\( C \) 关于任何权重\( w\) 或偏置\( b\)的偏导数的表达式,通过这个表达式,在改变权重和偏置时,表明代价函数变化的快慢。
4.4.1 反向传播模型与假设
主要思想:
- 将训练集数据输入到DNN的输入层,经过隐藏层,最后达到输出层并输出结果,这是DNN的前向传播过程。
- 由于DNN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层。
- 仅仅用一次前向传播,加上一次后向传播,就可以同时计算所有的偏导数\(\frac {∂C}{∂w_{jk}^l}\)、\(\frac {∂C}{∂b_j^l}\)。
- 根据代价函数的误差,调整各种参数的值,不断迭代上述过程,直至收敛。
模型描述:
- 参数 \(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}\) 层神经元的误差度量:
代价函数的两个假设:
- 假设一:代价函数可以被写成一个在每个训练样本\(x\)上的代价函数 \(C_x\)的均值:\(C=\frac {1}{m} ∑_x C_x \)。反向传播实际上是计算每一个独立\(\frac {∂C_x}{∂w}\)和(\(\frac {∂C_x}{∂b}\)后,通过在所有训练样本上进行平均化获得\(\frac {∂C}{∂w}\)和\(\frac {∂C}{∂b}\)。
- 假设二:代价函数可以写成神经网络输出\(a^L\)的函数。
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 反向传播算法应用步骤
随机梯度下降应用步骤:
- 通过前向传播,计算并保存每层神经元的带权输入值\(z^1\)和激活值 \(a^1\) :
- 计算输出层误差 \(δ^L\) : 计算向量
- 通过反向传播,计算并保存每层的误差:
- 由每层的激活值 \(a^1\)和每层的误差\(δ^l\),计算并保存每层的代价函数的梯度:
- 通过梯度下降算法,更新每层神经元的偏置和权重。
小批量数据应用步骤:
- 通过前向传播,计算并保存每层神经元的带权输入值\(z^1\)和激活值 \(a^1\) :
- 计算输出层误差 \(δ^{x,L}\) : 计算向量
- 通过反向传播,计算并保存每层的误差\(δ^{x,l}\):
- 由每层的激活值 \(a^1\)和每层的误差\(δ^l\),计算并保存每层的代价函数的梯度,通过梯度下降算法,更新每层神经元的偏置和权重::
- 在实践中实现随机梯度下降,还需要一个产生训练样本的小批量数据的循环,进行多次迭代。