无论是什么优化算法,最后都可以用一个简单的公式抽象:
是参数,而
是参数的增量,而各种优化算法的主要区别在于对
的计算不同,本文总结了下面十个优化算法的公式,以及简单的Python实现:
- SGD
- Momentum
- Nesterov Momentum
- AdaGrad
- RMSProp
- AdaDelta
- Adam
- AdaMax
- Nadam
- NadaMax
- SGD
虽然有凑数的嫌疑,不过还是把SGD也顺带说一下,就算做一个符号说明了。常规的随机梯度下降公式如下:
其中
是学习率,
是损失关于参数的梯度(有的资料中会写成
等形式),不过相比SGD,用的更多的还是小批量梯度下降(mBGD)算法,不同之处在于一次训练使用多个样本,然后取所有参与训练样本梯度的平均来更新参数,公式如下:
其中
是第
次训练中
个样本损失关于参数梯度的均值,如无特别声明,下文所出现
也遵循该定义
另外
或者
在下面的优化算法中,只是作为一个传入的变量,其具体的计算是由其他模块负责,可以参考下面两个链接:
永远在你身后:Numpy实现神经网络框架(3)——线性层反向传播推导及实现zhuanlan.zhihu.com
- Momentum
Momentum,也就是动量的意思。该算法将梯度下降的过程视为一个物理系统,下图是在百度图片中找的(侵删)
如上图所示,在该物理系统中有一个小球(质点),它所处的水平方向的位置对应为
的值,而垂直方向对应为损失。设其质量
,在第
时刻,在单位时间内,该质点受外力而造成的动量改变为:
(1.1)到(1.2)是因为
,所以约去了。另外受到的外力可以分为两个分量:
重力沿斜面向下的力
和
粘性阻尼力
令
代入(1.2)式中:
然后对“位置”进行更新:
所以这里
,另外
的方向与损失的梯度方向相反,并取系数为
,得到:
代入(1.4),得到速度的更新公式: