本文仅对一些常见的优化方法进行直观介绍和简单的比较,各类优化方法的详细内容及公式只好去认真啃论文了,在此我就不赘述了。html
此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及 mini-batch gradient descent的具体区别就不细说了。如今的SGD通常都指mini-batch gradient descent。算法
SGD就是每一次迭代计算mini-batch的梯度,而后对参数进行更新,是最多见的优化方法了。即:网络
其中,是学习率,
是梯度 SGD彻底依赖于当前batch的梯度,因此
可理解为容许当前batch的梯度多大程度影响参数更新学习
缺点:(正由于有这些缺点才让这么多大神发展出了后续的各类算法)大数据
momentum是模拟物理里动量的概念,积累以前的动量来替代真正的梯度。公式以下:优化
其中,是动量因子spa
特色:3d
nesterov项在梯度更新时作一个校订,避免前进太快,同时提升灵敏度。 将上一节中的公式展开可得:htm
能够看出,并无直接改变当前梯度
,因此Nesterov的改进就是让以前的动量直接影响当前的动量。即:内存
因此,加上nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校订。以下图:
momentum首先计算一个梯度(短的蓝色向量),而后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量),nesterov项首先在以前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度而后进行校订(绿色梯向量)
其实,momentum项和nesterov项都是为了使梯度更新更加灵活,对不一样状况有针对性。可是,人工设置一些学习率总仍是有些生硬,接下来介绍几种自适应学习率的方法
Adagrad实际上是对学习率进行了一个约束。即:
此处,对从1到
进行一个递推造成一个约束项regularizer,
,
用来保证分母非0
特色:
缺点:
Adadelta是对Adagrad的扩展,最初方案依然是对学习率进行自适应约束,可是进行了计算上的简化。 Adagrad会累加以前全部的梯度平方,而Adadelta只累加固定大小的项,而且也不直接存储这些项,仅仅是近似计算对应的平均值。即:
在此处Adadelta其实仍是依赖于全局学习率的,可是做者作了必定处理,通过近似牛顿迭代法以后:
其中,表明求指望。
此时,能够看出Adadelta已经不用依赖于全局学习率了。
特色:
RMSprop能够算做Adadelta的一个特例:
当时,
就变为了求梯度平方和的平均数。
若是再求根的话,就变成了RMS(均方根):
此时,这个RMS就能够做为学习率的一个约束:
特色:
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每一个参数的学习率。Adam的优势主要在于通过偏置校订后,每一次迭代学习率都有个肯定范围,使得参数比较平稳。公式以下:
其中,,
分别是对梯度的一阶矩估计和二阶矩估计,能够看做对指望
,
的估计;
,
是对
,
的校订,这样能够近似为对指望的无偏估计。 能够看出,直接对梯度的矩估计对内存没有额外的要求,并且能够根据梯度进行动态调整,而
对学习率造成一个动态约束,并且有明确的范围。
特色:
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。公式上的变化以下:
能够看出,Adamax学习率的边界范围更简单
Nadam相似于带有Nesterov动量项的Adam。公式以下:
能够看出,Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。通常而言,在想使用带动量的RMSprop,或者Adam的地方,大多可使用Nadam取得更好的效果。
最后展现两张可厉害的图,一切尽在图中啊,上面的都没啥用了... ...
损失平面等高线
在鞍点处的比较
[1]Adagrad
[3]Adadelta
[4]Adam
[5]Nadam
[6]On the importance of initialization and momentum in deep learning
[8]Alec Radford(图)
[9]An overview of gradient descent optimization algorithms