反向传播算法详解:从链式法则到梯度计算
反向传播算法详解:从链式法则到梯度计算
反向传播算法是神经网络训练中的核心算法,它通过链式法则将损失函数对权重的梯度分解为多个易于计算的部分,从而实现高效的参数更新。本文将从链式法则开始,逐步介绍正向传播和反向传播的过程,并通过数学推导和计算图的方式,详细解释反向传播算法的核心步骤。
前置知识:链式法则
链式法则在高等数学中就已经学过,它是反向传播算法的基础。链式法则可以表示为:
正向传播
正向传播的主要目的是计算每一层的输出,并最终得到模型的预测结果。以一个简单的神经网络为例:
假设我们使用平方误差作为损失函数,则有:
$$
Loss = \frac{1}{2}\left \langle \sigma (w\cdot x+b) \right \rangle^{2}
$$
对于多层神经网络,只需逐层计算即可。
反向传播
反向传播的目标是计算损失函数对每个权重和偏置的梯度,以便进行梯度下降优化。以一个三层神经网络为例:
根据链式法则,我们可以写出:
$$
\frac { \partial L } { \partial w _ { j i } ^{t}} = \frac { \partial L } { \partial z _ { j } ^ { t} } . \frac { \partial z _ { j } ^ { t } } { \partial w _ { j i }^{t} }
$$
$$
\frac { \partial L } { \partial b_{j} ^ { t } } = \frac { \partial L } { \partial z _ { j } ^ { t} } \cdot \frac { \partial z _{j}^ { t } } { \partial b _ { j }^{t}}
$$
定义误差项:
$$
\delta_{ j }^{t} = \frac { \partial L } { \partial z _ { j } ^ { t} }
$$
由于:
$$
z_{j}^{t}=\sum_{i=1}w_{ji}^{t} \cdot h_{i}^{t-1} +b_{j}^{t}
$$
可以得到:
$$
\frac { \partial z _ { j } ^ { t } } { \partial w _ { j i }^{t} }= h_{i}^{t-1}
$$
$$
\frac { \partial z _{j}^ { t } } { \partial b _ { j }^{t}}=1
$$
代入可得:
$$
\frac { \partial L } { \partial w _ { j i } ^{t}} =\delta_{ j }^{t} . \ h_{i}^{t-1}
$$
$$
\frac { \partial L } { \partial b_{j} ^ { t } } = \delta_{ j }^{t}
$$
接下来计算误差项:
$$
\delta_{ j }^{t}=\sum_{i=1}\frac { \partial L } { \partial z _ { i } ^ { t+1} }.\frac {\partial z _ { i } ^ { t+1}} { \partial h_{j}^{t} }.\frac { \partial h_{j}^{t} } {\partial z _ { j } ^ { t}}
$$
由于:
$$
\frac { \partial L } { \partial z _ { i } ^ { t+1} }=\delta_{ i }^{t+1}
$$
$$
\frac {\partial z _ { i } ^ { t+1}} { \partial h_{j}^{t} }=w_{ij}^{t+1}
$$
$$
\frac { \partial h_{j}^{t} } {\partial z _ { j } ^ { t}}={a}
$$
代入可得:
$$
\delta_{ j }^{t}=a\sum_{i=1}\delta_{ i }^{t+1}.w_{ij}^{t+1}
$$
这样,我们就得到了计算梯度的完整公式。观察发现,计算某一层权重与偏置的梯度需要上一层的输出以及下一层的误差和权重。因此,我们可以从后向前计算梯度,提高计算效率。
整体梳理
- 正向传播得到各层的输出:
$$
h_{1}, \ h_{2} , \ h_{3} ,.........., \ h_{n}
$$
- 反向传播计算梯度:
- 计算最后一层的误差:
$$
\delta_{n}=h_{n}-y
$$
- 计算梯度:
$$
\Delta w_{n-1}= \frac { \partial L } { \partial w _ {n-1} } =\delta_{n} \cdot h_{n-2}
$$
$$
\Delta b_{n-1}= \frac { \partial L } { \partial b _ {n-1} } =\delta_{n}
$$
- 更新参数:
$$
w _ {n-1}=w_{n-1}-\eta\Delta w_{n-1}
$$
$$
b _ {n-1}=b_{n-1}-\eta\Delta b_{n-1}
$$
- 计算第n-1层的误差:
$$
\delta_{n-1}=a \cdot (\delta_{n} \cdot w_{n})
$$
- 重复上述过程,直到更新完所有层的参数。