我应该期望亚当工作到什么程度?

机器算法验证 机器学习 神经网络 优化 亚当
2022-04-08 00:23:51

我一直在编写一个神经网络包以供自己娱乐,它似乎有效。我一直在阅读有关亚当的文章,据我所见,它很难被击败。

好吧,当我在我的代码中实现 Adam 算法时,它的表现非常糟糕——收敛速度非常慢,甚至对于我测试过的一些问题都发散了。看起来我一定犯了一个错误,但算法非常简单。

为了消除一些编程错误的可能性,我决定在 Excel 中创建一个非常简单的函数,并将 Adam 与标准梯度下降进行比较。据我所知,标准梯度下降对于许多参数(至少对于相对简单的确定性函数)来说效果更好。不管你喂什么,Adam 似乎收敛得更可靠,但总是更慢。

但是 - 我读过的内容始终将 Adam 描绘成一种灵丹妙药,在几乎所有情况下,它的收敛速度都比任何其他算法都要快得多。那么给了什么?

它是否仅在足够复杂的问题上优于其他算法?是否需要更仔细地调整超参数?如果我没有得到收敛,我是否需要更仔细地查看我的网络架构?是否有某些激活功能使其性能特别差?或者,也许我只是错误地直接实现了算法?

这是一个示例,我将 x^2 + x^4 的标准梯度下降与 Adam 进行了比较,使用 0.1 的学习率(其他 Adam 参数使用 0.9、0.999 和 1e-8)。我刚刚绘制了每次迭代的梯度,从 x=1 开始。对于小学习率的这个简单函数,Adam 的收敛速度较慢,但​​它会在我测试过的每个学习率上收敛(而标准梯度下降很难在学习率超过 0.3 时收敛)。这看起来是正确的还是看起来我有什么问题?

f(x) 的梯度 = x^4 + x^2

这是 Adam 几次迭代的中间变量:

在此处输入图像描述

我(也许天真地)期望我只是将 Adam 算法插入到我的代码中,并带有一组参数,一切都会加快。我在这里想念什么?

谢谢你的帮助!

2个回答

这里可能有几个因素在起作用:

  1. 基于动量的算法的最佳学习率通常低于普通 GD,因为动量增加了有效步长。我不知道您尝试了多少速率,但通常对我有用。105103

  2. Adam 和许多其他带有动量变体的 SGD 是为优化嘈杂的、非常高维的非凸函数而设计的,具有许多鞍点和其他病理。您对的测试几乎与此相反,因此它可能无法反映 Adam 的优势。x2+x4

  3. iirc 具有适当的学习率和衰减时间表,SGD 将收敛到与 Adam 一样好或可能更好的结果。正如您所指出的,降低对超参数设置的敏感性是 Adam 的一个优势

实际上,ADAM 的关键特性之一速度较慢,因此更加谨慎。见论文第 2.1 节

特别是,步长的上限非常严格。论文列出了 3 个上限,最简单的是在任何更新期间没有单个参数步长大于,建议为 0.001。α

对于随机梯度,尤其是那些样本之间可能存在非常大变化的梯度,这是一个非常重要的特征。您的模型当前可能在优化过程中的某个时刻具有接近最优的参数值,但运气不好,它在算法终止前不久就遇到了异常值,从而导致巨大的跳跃到一组非常次优的参数值。通过像 ADAM 那样使用极小的信任区域,您可以大大降低发生这种情况的可能性,因为您需要连续命中大量异常值才能远离当前解决方案。

当您有可能非常嘈杂的梯度近似值(特别是在极少数情况下近似值极不准确的情况下)以及二阶导数可能非常不稳定的情况下,此信任区域方面非常重要。如果这些条件不存在,那么 ADAM 的信任域方面很可能会大大减慢收敛速度,而没有太多好处。