从一些神经网络文章中我读到,如果你扩大神经网络架构,损失表面中不同局部最小值的差异会减小。基本上所有局部最小值都变得等价。
如果是这种情况,那么为什么 SGD 的不同变体(如 Adagrad、ADAM 等)比普通 SGD 效果更好?我相信使用这些 SGD 变体的原因是为了解决“坏”的局部最小值问题,但是如果所有局部最小值都或多或少相同,那么使用这些变体的目的是什么?
从一些神经网络文章中我读到,如果你扩大神经网络架构,损失表面中不同局部最小值的差异会减小。基本上所有局部最小值都变得等价。
如果是这种情况,那么为什么 SGD 的不同变体(如 Adagrad、ADAM 等)比普通 SGD 效果更好?我相信使用这些 SGD 变体的原因是为了解决“坏”的局部最小值问题,但是如果所有局部最小值都或多或少相同,那么使用这些变体的目的是什么?
我相信使用这些 SGD 变体的原因是为了解决“坏”的局部最小值问题
这是不准确的。这些变体主要是关于在面对浅或快速变化的梯度时加速梯度下降的步骤,或者在需要自适应学习率的梯度时,因为网络的某些部分比其他部分获得更强的梯度信号。他们通过加权或调整每个维度的步长来做到这一点,基于对当前梯度的额外知识,例如先前梯度的历史。
成本函数“景观”中的鞍点或弯曲沟壑等形状可能会给基本 SGD 带来困难。以鞍点为例 - 没有“坏”最小值,鞍点在成本函数中可能非常高。但是梯度值可能非常低,即使如果您可以远离鞍点,它们会再次上升。SGD 的问题在于,仅使用梯度可能会使更新在鞍的陡峭部分上下波动,而不是在远离鞍点的浅方向上移动。其他困难的形状可能会导致类似的问题。
为了可视化某些优化器在鞍点上的行为差异,请查看此动画(我想找到它的创意共用变体并包含在答案中)和参考的博客它。
此外,对于深度学习网络,还有一个问题是,当您通过层回溯时,梯度可能会“爆炸”或“消失”。使用 ReLU 激活或类似方法可以帮助解决这个问题,但并非总是可行的(想想在 LSTM 模块中需要 sigmoid 激活的 RNN)。像 RMSprop 这样的优化器通过根据最近的历史对权重更新步骤使用的梯度进行归一化来处理这个问题。虽然 SGD 可能更容易卡住并且无法更新较低层的权重(更接近输入的权重)——要么根本不更新它们,要么采取过大的步骤。