(1) 基础介绍1
Adam就像蒙着眼睛走,你需要方向,也需要对环境的感知。
一阶距就是惯性的保持,代表方向。
二阶距就是环境的感知,代表坡度的大小。
(1) 基础介绍2
先理解随机变量的一阶矩和二阶矩。模型的梯度是一个随机变量,一阶矩表示梯度均值,二阶矩表示其方差,一阶矩来控制模型更新的方向,二阶矩控制步长(学习率)。用moveing average来对一阶矩和二阶矩进行估计。bias correct是为了缓解初始一阶矩和二阶矩初始为0带来的moving average的影响。
一、Adam基础介绍:
Adam是一种可以替代传统随机梯度下降过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重;
Adam使用动量和自适应学习率来加快收敛速度;
Adam名字来源于适应性矩估计(adaptive moment estimation)的缩写。
二、Adam优势:
- 直截了当地实现
- 高效的计算
- 所需内存少
- 梯度对角缩放的不变性
- 适合解决含大规模数据和参数的优化问题
- 适用于非稳态(non-stationary)目标
- 适用于解决包含很高噪声或稀疏梯度的问题
- 超参数可以很直观地解释,并且基本上只需极少量的调参
三、Adam主要做法:
做法:基于梯度的一阶矩估计(First Moment Estimation,即梯度的均值)和二阶矩估计(Second Moment Estimation,即梯度的未中心化的方差)进行综合考虑,计算出更新步长。
与传统随机梯度下降保持同一个学习率不同,adam方法从梯度的一阶矩和二阶矩的预算来计算不同参数的自适应学习速率。
什么是一阶矩估计:在adam中为即一阶梯度的均值。一阶矩估计在数学上为是期望值,换句话说就是平均数(离散随机变量很好理解,连续的可以类比一下)。举例:xy坐标系中,x取大于零的整数,y1, y2, ...,yn 对应x=1, 2,..., n的值,现在我要对y求期望,就是所有y累加除以n,也就是y的均值。
什么是二阶据估计:在adam中为梯度中心化的方差。二阶中心矩就是对随机变量与均值(期望)的差的平方求期望。为什么要用平方,因为如果序列中有负数就会产生较大波动,而平方运算就好像对序列添加了绝对值,这样更能体现偏离均值的范围。
Adam 算法同时获得了 AdaGrad 和 RMSProp 算法的优点。
适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。
均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。
具体来说,算法计算了梯度的指数移动均值(exponential moving average),超参数 beta1 和 beta2 控制了这些移动均值的衰减率。
超参数 beta1 :控制一阶距估计的衰减;
超参数 beta2 :控制二阶距估计的衰减;
移动均值的初始值和 beta1、beta2 值接近于 1(推荐值),因此矩估计的偏差接近于 0。该偏差通过首先计算带偏差的估计而后计算偏差修正后的估计而得到提升。
四、Adam的参数配置:
alpha:同样也称为学习率或步长因子,它控制了权重的更新比率(如 0.001)。较大的值(如 0.3)在学习率更新前会有更快的初始学习,而较小的值(如 1.0E-5)会令训练收敛到更好的性能。
beta1:一阶矩估计的指数衰减率(如 0.9)。
beta2:二阶矩估计的指数衰减率(如 0.999)。该超参数在稀疏梯度(如在 NLP 或计算机视觉任务中)中应该设置为接近 1 的数。
五、Adam算法伪代码:
在上述伪代码中:
(1)初始化确定参数(步长)、、(矩估计得指数衰弱速率,在[0,1)之间)和随机目标函数 。这些都是预定义好的;
(2)初始化参数向量、一阶矩向量、二阶矩向量和时间步;
(3)循环,当参数没有收敛时,循环迭代地更新各个部分。即时间步加1、更新目标函数在该时间步上对参数所求的梯度、更新偏差的一阶矩估计和二阶原始矩估计,再计算偏差修正的一阶矩估计和偏差修正的二阶矩估计,然后再用以上计算出来的值更新模型的参数θt;
(4)当参数收敛时,返回模型参数。
注意算法的效率可以通过改变计算顺序而得到提升,例如将伪代码最后三行循环语句替代为以下两个:
其实,就是3个公式收缩成2个公式;
六、优化器实现
1、预定义优化器对象,一般在代码_main_处:
# 预定义优化器
optimizers = {
'adam': torch.optim.Adam, # default lr=0.001
}
# 初始化优化器
# opt.optimizer=“Adam”
opt.optimizer = optimizers[opt.optimizer]
2、初始化优化器
# 初始化模型参数
_params = filter(lambda p: p.requires_grad, self.model.parameters())
# 初始化优化器对象
# self.opt.learning_rate为学习旅
# self.opt.l2reg为二阶矩估计衰减率
optimizer = self.opt.optimizer(_params, lr=self.opt.learning_rate, weight_decay=self.opt.l2reg)
3、模型训练处
# 梯度回传
loss.backward()
# 更新参数
optimizer.step()
七、Adam的改进和优化策略(待更新)
八、参考文献:
Adam优化器
如何理解Adam算法(Adaptive moment estimation)? - 知乎 (zhihu.com)----带你飞