优化器总结
1、sgd
针对每个训练样本进行参数更新,执行速度块,参数波动大。改进:每个batch进行参数更新,减少波动,更加稳定
# 梯度下降法
x += - learning_rate * dx
问题:容易产生震荡,且容易被困在鞍点,迟迟不能到达全局最优值
2、Adgrad
累积平方梯度,保证每次学习率的每次更新,解决了SGD中学习率不能自适应调整的问题。缺点:
- 对于训练深度神经网络模型而言,从训练开始时累积平方梯度值会越来越大,会导致学习率过早和过量的减少,从而导致迭代后期收敛及其缓慢。AdaGrad在某些深度学习模型上效果不错,但不是全部。
- 需要手动设置全局学习率
3、Adam
当前梯度的更新,考虑上一次梯度更新的值和当前计算的真实梯度,每次都会累加参数的梯度值,包括一阶和二阶梯度。
问题:nlp任务中,如果某个单词只出现了一次,比如第一次,在后续更新,它并没有出现过,计算的梯度值是0,但是累加的梯度mt,vt不是0,他依然会更新。而lazyadam的优化器解决这个问题,他只考虑batch层面的更新,不是全局的梯度迭代累加
# Adam
m = beta1*mt-1 + (1-beta1)*dx
v = beta2*vt-1 + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)
4.AdamW
AdamW就是Adam优化器加上L2正则,来限制参数值不可太大