使用Adam Optimizer解释训练损失与迭代中的峰值


16

我正在使用i)SGD和ii)Adam Optimizer训练神经网络。当使用正常的SGD时,我得到了一条平滑的训练损耗与迭代曲线的曲线,如下图所示(红色的曲线)。但是,当我使用Adam Optimizer时,训练损耗曲线会有一些尖峰。这些尖峰的解释是什么?

型号详情:

14个输入节点-> 2个隐藏层(100-> 40个单位)-> 4个输出单位

我使用的默认参数为亚当beta_1 = 0.9beta_2 = 0.999epsilon = 1e-8batch_size = 32

i)与SGD ii)与Adam带SGD 与亚当


未来的通知,降低您的初始学习速度可以帮助消除Adam的峰值
大胆的

Answers:


12

尖峰是Adam(batch_size=32)中小批量梯度下降的不可避免结果。一些小型批次具有“偶然”不幸的数据进行优化,从而导致使用Adam在成本函数中看到的那些峰值。如果您尝试进行随机梯度下降(与使用相同batch_size=1),则会发现成本函数中的峰值更多。在(完整)批处理GD中不会发生相同的情况,因为它在每个优化时期都使用所有训练数据(即,批处理大小等于您的训练集的基数)。正如您在第一个图形中那样,成本正在平稳地单调下降,似乎标题(i)SGD)是错误的,并且您正在使用(完全)批处理梯度下降而不是SGD。

在吴哥(Coursera)出色的深度学习课程中,吴恩达(Andrew Ng)使用以下图片对此进行了详细说明:

成本函数


2
“ SGD ...使用所有培训数据”-您确定吗?这意味着在转发所有数据后将更新权重,但这称为全批gd,而不是sgd。随机意味着小批量交易
亚历克斯

感谢@Alex指出我的错误,我已经解决了该错误,并通过提供更多信息作为参考改进了答案。
xboard

@xboard-不,我在第一个中使用小批量梯度下降。
阿卜杜勒·法迪尔

7

我花了很多时间调试爆炸的渐变和类似的行为。您的答案将取决于损失函数,数据,体系结构等。有数百种原因。我列举几个。

  • 取决于损耗。对数似然损失需要进行裁剪,如果不是,则可能会评估log(0)数据集中的不良预测/离群值,从而导致爆炸梯度。大多数程序包(torch,tensorflow等)默认会对其损失进行裁剪。
  • 数据集中的异常值。
  • 具有小批处理大小和大epsilon(超参数)的BatchNorm 。使用batchnorm为,然后使用较小的和可以得到高幅值ϵy=(xu)/(s+ϵ)sϵy
  • 如果数据集不能被batchsize整除,则时代中的最终批次可能很小。火炬数据加载器中有一个标志drop_last。小批量=高差异

现在,为什么您在Adam而不是SGD上看到它?显然,您与亚当的损失降低了。如前所述,如果99.9%的数据集在某一点除某个观察点之外具有最佳状态,则可能是观察点在随机选择一批时尖叫“ NO”并从局部最小值跳出。如果您在每个dataset_size//batch_size+1步骤中都看到它,则可能是由于最终批处理量较小。我敢打赌,如果让它达到更低的损失,您也会看到SGD峰值。

奖励:动量优化器(Adam)的真正快速降低可能意味着某些层(输入层还是输出层?)的初始化超出了比例(以大/小权重)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.