我一直在编写一个神经网络包以供自己娱乐,它似乎有效。我一直在阅读有关亚当的文章,据我所见,它很难被击败。
好吧,当我在我的代码中实现 Adam 算法时,它的表现非常糟糕——收敛速度非常慢,甚至对于我测试过的一些问题都发散了。看起来我一定犯了一个错误,但算法非常简单。
为了消除一些编程错误的可能性,我决定在 Excel 中创建一个非常简单的函数,并将 Adam 与标准梯度下降进行比较。据我所知,标准梯度下降对于许多参数(至少对于相对简单的确定性函数)来说效果更好。不管你喂什么,Adam 似乎收敛得更可靠,但总是更慢。
但是 - 我读过的内容始终将 Adam 描绘成一种灵丹妙药,在几乎所有情况下,它的收敛速度都比任何其他算法都要快得多。那么给了什么?
它是否仅在足够复杂的问题上优于其他算法?是否需要更仔细地调整超参数?如果我没有得到收敛,我是否需要更仔细地查看我的网络架构?是否有某些激活功能使其性能特别差?或者,也许我只是错误地直接实现了算法?
这是一个示例,我将 x^2 + x^4 的标准梯度下降与 Adam 进行了比较,使用 0.1 的学习率(其他 Adam 参数使用 0.9、0.999 和 1e-8)。我刚刚绘制了每次迭代的梯度,从 x=1 开始。对于小学习率的这个简单函数,Adam 的收敛速度较慢,但它会在我测试过的每个学习率上收敛(而标准梯度下降很难在学习率超过 0.3 时收敛)。这看起来是正确的还是看起来我有什么问题?
这是 Adam 几次迭代的中间变量:
我(也许天真地)期望我只是将 Adam 算法插入到我的代码中,并带有一组参数,一切都会加快。我在这里想念什么?
谢谢你的帮助!