优化器(Optimizer)是深度学习和机器学习中最核心的组件之一。
简单来说,优化器的作用就是指导模型如何学习。它决定了在反向传播计算出梯度(模型应该朝哪个方向调整)之后,模型应该以多大的“步伐”和什么样的方式来实际更新它的权重和偏置。
你可以把优化器看作是一个驾驶员,而梯度(Loss 对权重的导数)是导航仪给出的方向。驾驶员(优化器)负责实际操作方向盘和油门,最终将汽车(模型)开向目的地(Loss 最小化)。
优化器的核心工作原理
在你的代码中,无论是在版本 1 还是版本 2,你都使用了最基础、最简单的优化器思想:随机梯度下降(SGD),具体体现在以下公式中:
$$\text{新的权重} = \text{旧的权重} - (\text{学习率} \times \text{梯度})$$
在你的代码实现中:
# 例如在 Linear 层的 backward 方法中
self.w -= self.lr * dw
self.b -= self.lr * db
优化器就是管理这个更新过程的组件。
优化器的三个关键要素
要素 | 描述 | 在你的代码中的体现 |
---|---|---|
1. 梯度 (Gradient) | 方向。由反向传播计算得到,表示 Loss 增加最快的方向。优化器要朝着相反的方向调整。 | dw 和 db |
2. 学习率 (Learning Rate) | 步长。这是优化器迈出的每一步的大小。它是一个超参数,决定了更新的快慢。 | self.lr |
3. 更新规则 (Update Rule) | 策略。优化器根据当前和过去的梯度信息,决定如何调整权重。 | 最简单的规则是:w = w - lr * dw |
为什么需要更复杂的优化器?
虽然最简单的 SGD 也能工作,但在实际的复杂任务中,它经常会遇到以下问题:
- 收敛慢: 遇到平坦区域(梯度接近 0)时,更新非常缓慢。
- 震荡: 在陡峭的“峡谷”地形中,SGD 可能会在两侧来回震荡,难以沿着谷底高效前进。
现代的复杂优化器,如 Adam、RMSprop、Adagrad 等,就是为了解决这些问题而诞生的。它们通过引入动量(Momentum)、自适应学习率等机制来改进更新规则:
复杂优化器 | 核心改进点 | 效果 |
---|---|---|
动量 (Momentum) | 引入一个“惯性”项,让更新方向像滚雪球一样积累速度。 | 帮助模型冲过局部最优,加速收敛。 |
Adam | 结合了动量和自适应学习率。它为每个权重独立计算和维护一个学习率。 | 在大多数情况下,是目前最常用、最稳定的优化器。 |
因此,一个完整的、面向对象的神经网络框架(如 PyTorch 或 TensorFlow)会有一个独立的 Optimizer Class 来管理所有层的权重更新,而不是像你现在这样将 w -= lr * dw
硬编码到每个 Linear
层的 backward
方法中。