### SGD 和 Adam 的区别

什么是优化算法？

在深入了解这两种算法之前，我们先明确一下什么是优化算法

在训练神经网络时，我们的目标是最小化损失函数（Loss Function）。损失函数衡量了模型预测结果与真实值之间的差距。优化算法就是一种方法，它告诉我们如何调整模型的参数（即权重和偏置），以使损失函数的值越来越小，从而让模型变得越来越准确

可以把优化算法想象成在下山时，如何选择每一步的方向和步长，才能最快地到达山谷（即损失函数的最小值）

1. 随机梯度下降（SGD, Stochastic Gradient Descent）

基本原理

SGD 是最基础、最原始的优化算法。它的“随机”体现在：在每一次迭代中，它随机选择一个样本（或一小批样本，即 Mini-Batch SGD），然后计算这一个（或一小批）样本的损失，并根据这个损失来更新模型的参数

这与传统的批量梯度下降（Batch Gradient Descent）不同，后者会计算所有训练样本的损失来更新一次参数。

优点

- 计算效率高：由于每次只处理一小批样本，计算量大大减少，尤其是在面对海量数据时
- 跳出局部最优：SGD 的“随机性”使得它有机会跳出一些浅的局部最优解，找到更好的全局最优解。

缺点

- 收敛速度慢且不稳定：由于每次的梯度只代表了一小部分数据，更新方向可能会非常“抖动”和不稳定，导致损失函数在下降时像锯齿一样波动
- 需要手动设置学习率：如果学习率（步长）太大，可能无法收敛；如果太小，收敛速度会非常慢。而且，整个训练过程都使用同一个固定的学习率，无法根据参数的重要性进行调整

2. Adam（Adaptive Moment Estimation）

基本原理

Adam 是一种自适应学习率的优化算法。它结合了RMSprop 和 Adagrad 的优点，是目前最常用、效果最好的优化器之一。它的核心思想是：为每个参数都动态地调整学习率

Adam 主要通过计算梯度的一阶矩（均值）和二阶矩（方差）的指数移动平均值来调整学习率

- 一阶矩（mt）：可以看作是梯度的加权平均，它决定了更新方向
- 二阶矩（vt）：可以看作是梯度平方的加权平均，它决定了更新的步长大小

Adam 会根据这些动态计算的矩，为不同的参数提供不同的学习率。对于梯度大的参数，它会减小学习率；对于梯度小的参数，它会增加学习率

优点

- 收敛速度快：由于它能够自适应地调整学习率，Adam 在多数情况下比 SGD 收敛得更快
- 无需手动调优学习率：大多数情况下，使用 Adam 的默认参数就能取得很好的效果，大大简化了调参过程
- 能处理稀疏梯度：对于有稀疏梯度的任务（如自然语言处理），Adam 表现出色

缺点

- 可能会收敛到局部最优：一些研究表明，Adam 在某些特定场景下可能会收敛到比 SGD 差的局部最优解，这是因为它自适应的学习率可能导致它在训练后期学习率过低，无法跳出局部最优

特性 | SGD | Adam
--- | --- | ---
学习率 | 固定，需要手动设置 | 自适应，为每个参数动态调整
更新方式 | 根据单个样本或 mini-batch 的梯度直接更新 | 结合一阶矩和二阶矩，动态调整更新方向和步长
收敛性 | 波动较大，可能收敛到全局最优 | 平稳且快速收敛，但可能陷入较差的局部最优
适用性 | 在大型模型或特定任务上需要精细调参，效果可能更好 | 绝大多数场景下都能快速获得不错的效果，易于使用
调参难度 | 高，需要仔细调整学习率 | 低，默认参数通常表现良好