Adam全称时是一种优化算法adaptive moment estimation(适应性矩估计)
SGD 和Adam
SGD( stochastic gradient descent随机梯度下降)和Adam(adaptive 当权重更新时,随机梯度下降方法的学习率一直相同,对于每个网络权重(参数),学习率保持不变。Adam 独立的自适应性学习率是通过计算梯度的一阶矩估计和二阶矩估计来设计的。
Adam原理
Adam结合了Adaptive Gradient Algorithm (AdaGrad,适应梯度算法为每个参数保留一个学习率,从而提高稀疏梯度问题的性能)和Root Mean Square Propagation (RMSProp,基于权重梯度的最新量级平均值,方根传播保留了每个参数的学习率。,该算法在网上和不稳定性方面表现良好) 优势
Adam 该算法的偏差修正使其在梯度稀疏时比 RMSprop 算法更快更优秀。Insofar 和 Adam 优化算法基本上是最好的全局选择。
优势
使用非凸优化问题Adam吸引人的好处
- 实现简单
- 计算效率高。
- 内存需求很少
- 非常适合数据和/或参数较大的问题。
- 适用于不稳定问题。
- 许多噪音/稀疏梯度计算
- 超参数有直观的解释,通常不需要调整
Adam配置参数
-
alpha。也叫学习率或步长。权重比例已更新(例如0.001)。较大值(如00.3)在更新速度之前,初始学习速度会更快。较小的值(如1).0E-5)会在beta1训练期间逐渐降低学习速度。
-
beta1 一阶矩估计的指数衰减率估计值(例如0.9)。
-
beta2.二阶矩估计的指数衰减率(例如0.999)。梯度稀疏(如NLP以及计算机视觉问题),该值应设置为近1.0。
-
epsilon。在实现过程中防止零除是一个小数字(例如10E-8)。
测试机器学习问题的默认参数设置为:alpha=0.001、beta1=0.9、beta2=0.999 和 epsilon=10E?8。
实践
问题:两种不同的优化器用于文本分类,SGD和Adam,Adam参数为
pytorch
optim.Adam(model.paramters(),lr=0.001,betas=(0.9,0.999),eps=1e-8,weight_decay=0,amsgrad=False) 发现第二轮loss几乎不变,而且SGD正常。
在线搜索答案:有些人也遇到过这样的问题(https://stackoverflow.com/questions/47813715/pytorch-loss-value-not-change),但是别人的weight_decay=0.1.有两种解决方案,1.. weight_decay设置为0.01,(weight_decay term is set to be 0.1. weight_decay is used to regularize the network’s parameters. This term maybe too label so that the regularization is too much. Try to reduce the value of weight_decay),2.不要weight_decay(I realised that L2_loss in Adam Optimizer make loss value remain unchanged (I haven’t tried in other Optimizer yet). It works when I remove L2_loss)不适合自己
解决:该SGD只设置模型参数
参考: https://machinelearningmastery.com/adam-optimization-algorithm-for-deep-learning/