什么是反向传播算法?它是如何计算梯度的?代码举例讲解

反向传播算法是一种通过链式求导计算复杂函数的梯度的算法。它通过递归地应用链式法则,从函数的最终输出层一层层地向前计算每个参数的梯度。

反向传播算法的主要步骤是:

  1. 初始化梯度:输出层参数的梯度等于损失函数对其的导数,其余层参数梯度设置为0。
  2. 逐层求导:从输出层开始,对每一层的参数进行求导,求得其梯度。每层的梯度等于其上一层的梯度乘以该层的导数。
  3. 迭代更新:重复步骤2,一直向前迭代到输入层,求得所有参数的梯度。
  4. 梯度下降:使用梯度更新每个参数,完成一轮迭代。
  5. 梯度清零:清空所有梯度,开始下一轮迭代。

反向传播算法的代码实现主要依赖于链式求导法则。以一个两层神经网络为例:

python
# 计算输出对输入层的梯度
d_input = d_output * W2.T * sigmoid(z1).grad 
# 计算隐层对输入层的梯度 
d_hidden = d_output * W2.T * sigmoid(z1).grad * W1 
# 梯度下降更新
W1 -= learning_rate * d_hidden 
b1 -= learning_rate * d_hidden.mean(axis=1, keepdims=True)
W2 -= learning_rate * d_output 
b2 -= learning_rate * d_output.mean(axis=1, keepdims=True)

我们通过矩阵乘法,不断地根据导数和上一层的梯度来求得每一层的梯度,这个过程就叫做“反向传播”。反向传播算法是神经网络等机器学习模型的参数学习中最为重要的算法。