优化器算法
[TOC]
0. 基础
1. 导入
1 | import torch.optim as optim |
2. 常用的优化器
- SGD/Momentum SGD
- Adam/AdamW
- AdaGrad
- RMS prop
3. 使用框架
- 生成优化器
1 | import torch.optim as optim |
- 同一个模型定义不同的优化器
1 | import torch |
- 使用优化器
1 | for input, target in dataset: |
1. SGD/Momentum SGD
SGD:随机梯度优化,最简单常用的优化器,卷积神经网络时代比较好用,transformer时代被AdamW取代。
1.1 SGD原理
1. 计算梯度: 是模型函数,是上一步的参数,是向量梯度计算,是权重衰减系数
2. 梯度更新:是权重衰减系数,是学习率
1.2 Momentum SGD原理
1. 计算梯度: 和SGD一样计算权重衰减后的梯度
2. 计算动量:是当前动量,上一步的动量,是动量系数
目前新的版本使用 代替,作为动量抑制系数
3. 梯度更新:是学习率
1.3 代码
1 | class SGD(Optimizer): |
参数:
- params:待优化的模型参数,通过**model.parameters()**获得
- lr:学习率
- momentum:梯度动量系数
- dampening:动量抑制
- eps:分母的添加项,增加数值稳定性1e-8
- weight_decay:权重衰减系数,正则化系数
2. Adam/AdamW
2.1 Adam
1. 计算梯度: 是模型函数,是上一步的参数,是向量梯度计算,是权重衰减系数
2. 计算动量:是当前动量,上一步的动量,是动量系数
3. 计算二阶动量:是当前动量,上一步的动量,是动量系数
4. 快速启动:由于初始时$m_0=0, v_0=0,\beta \approx1 $,m和v更新很慢,需要很多步才能到正常值,需要进行偏差修正
5. 梯度更新:是学习率
2.2 AdamW
AdamW是对Adam的修正,修改了权重衰减的位置,权重衰减放到了最后的损失位置,而不是最开始的梯度位置。
1. 计算梯度: 是模型函数,是上一步的参数,是向量梯度计算,是权重衰减系数
2. 计算动量:是当前动量,上一步的动量,是动量系数
3. 计算二阶动量:是当前动量,上一步的动量,是动量系数
4. 快速启动:由于初始时$m_0=0, v_0=0,\beta \approx1 $,m和v更新很慢,需要很多步才能到正常值,需要进行偏差修正
5. 梯度更新:是学习率
3. AdaGrad/RMS prop
相当于动量系数为0的Adam,根据参数之前的梯度作为当前参数的权重