首先关于神经网络优化方面有很多优化器,搞得人头晕,而说实话,我本人并不喜欢优化器或复杂的学习率调节这个方向,因为我觉得他们都大同小异都是基于梯度,而所谓的性能不一样都是因为参数空间的形状(基于规则)和初始的选择(这不是摇骰子么),所以很多时候我觉得SGD,Adam就足够了。
但今天因为对Nesterov这个复杂的名字感兴趣,所以特地的看了看几种常用的优化器,这里写一下总结:
二阶的比如牛顿法或伪牛顿法就不说了,用的不多。
这个是最常用的, 是学习率,
是损失函数。
动量Momentum SGD与SGD的区别是定义了速度 ,使得更新不光取决于当前梯度,而且保持了惯性(来自
的更新)。
看到这个公式我笑出了猪叫声嚯嚯嚯,这就是莽一下的原理。
如果说Momentum引入了动量的想法,Nesterov就更像是抖机灵了。
之前的损失函数是在当前教训计算,Nesterov说,何必呢?我们知道我们当前的动量,那我干脆就算下一步 处的动量。这样步子不是迈得更大一点,更快一点吗?
通过过往的梯度 累计,自动调节学习率。梯度累计:
这里的 是逐个元素(element-wise)乘机的意思,比如
结果就是
。而自适应的学习率如下:
为了数值稳定,所以我觉得为啥不限制一下
的范围,这样就少了一个参数。新的更新方式和梯度下降一样(除了element-wise)如下:
我也好奇过RMS是啥。
但我觉得其实更应该叫 average moving AdaGrad,因为他把累计梯度加权平均了。
之后的和AdaGrad一样
最后是 Adam,Adam结合了动量,自适应学习率这两个特性,而这两个特性也叫一阶和二阶矩估计(看到 有没有想到
)。
动量:
累计平方梯度:
更新参数:
以上就是一点更新总结。
好久没更新了,我好懒啊。