Pytorch 一共有11个优化器 其中比较常用的主要有4种 SGD、Momentum、RMSProp、Adam。
SGD实现随机梯度下降。
CLASS torch.optim.SGD(params, lr required parameter , momentum 0, dampening 0, weight_decay 0, nesterov False)参数 params (iterable) –待优化参数的iterable或者是定义了参数组的dictlr (float) – 学习率momentum (float, 可选) – 动量因子 默认 0 通常设置为0.9 0.8 weight_decay (float, 可选) – 权重衰减 L2惩罚 默认 0 dampening (float, 可选) – 动量的抑制因子 默认 0 nesterov (bool, 可选) – 使用Nesterov动量 默认 False 例子
optimizer torch.optim.SGD(model.parameters(), lr 0.1, momentum 0.9) optimizer.zero_grad() loss_fn(model(input), target).backward() optimizer.step()
优点 ①使用mini-batch的时候 可以收敛得很快
缺点 ①在随机选择梯度的同时会引入噪声 使得权值更新的方向不一定正确
②不能解决局部最优解的问题
使用动量的随机梯度下降法。更新的时候在一定程度上保留之前更新的方向 用法为在torch.optim.SGD的momentum参数不为零。
优点 加快收敛速度 有一定摆脱局部最优的能力 一定程度上缓解了没有动量的时候的问题
缺点 仍然继承了一部分SGD的缺点
RMSProp实现均方根传递。
思想 梯度震动较大的项 在下降时 减小其下降速度 对于震动幅度小的项 在下降时 加速其下降速度
CLASS torch.optim.RMSprop(params, lr 0.01, alpha 0.99, eps 1e-08, weight_decay 0, momentum 0, centered False)参数 params (iterable) –待优化参数的iterable或者是定义了参数组的dictlr (float) – 学习率momentum (float, 可选) – 动量因子 默认 0 通常设置为0.9 0.8 alpha (float, 可选) – 平滑常数 默认 0.99 为了增加数值计算的稳定性而加到分母里的项 默认 1e-8 centered (bool, 可选) –如果为True 计算中心化的RMSProp 并且用它的方差预测值对梯度进行归一化weight_decay (float, 可选) – 权重衰减 L2惩罚 默认 0
优点 可缓解Adagrad学习率下降较快的问题 并且引入均方根 可以减少摆动 适合处理非平稳目标 对于RNN效果很好
缺点 依然依赖于全局学习率
Adam将Momentum算法和RMSProp算法结合起来使用的一种算法 既用动量来累积梯度 又使得收敛速度更快同时使得波动的幅度更小 并进行了偏差修正。最常用的优化器。
CLASS torch.optim.Adam(params, lr 0.001, betas (0.9, 0.999), eps 1e-08, weight_decay 0, amsgrad False)参数 params (iterable) –待优化参数的iterable或者是定义了参数组的dictlr (float) – 学习率betas (Tuple[float, float], 可选) – 动量因子 默认 0 通常设置为0.9 0.8 eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项 默认 1e-8 weight_decay (float, 可选) – 用于计算梯度以及梯度平方的运行平均值的系数 默认 0.9 0.999 amsgrad (boolean, 可选) – 是否使用AMSGrad变量 (默认: False)
优点
1、对目标函数没有平稳要求 即loss function可以随着时间变化
2、参数的更新不受梯度的伸缩变换影响
3、更新步长和梯度大小无关 只和alpha、beta_1、beta_2有关系。并且由它们决定步长的理论上限
4、更新的步长能够被限制在大致的范围内 初始学习率
5、能较好的处理噪音样本 能天然地实现步长退火过程 自动调整学习率
6、很适合应用于大规模的数据及参数的场景、不稳定目标函数、梯度稀疏或梯度存在很大噪声的问题



