1 基于梯度的优化问题——探险家的故事
要形象地理解无约束多变量最优化问题,我们可以想象“一个探险家在广袤无际、完全黑暗的地界上,他要只凭脚底感受到的地面的坡度,找寻最深的谷底”。最优化的过程中,我们面临的就是探险家一般艰难的境况。实际上这个模型还是有点不够准确,因为在我们找寻最低点的过程应当是离散的。因此可以进而改善这个模型:天神听闻探险家的事情,感其诚,遂决定赐予他一个技能——他能够迈步任意距离到下一个位置(如果到达的地点是空中,则视为到对应垂直下方的地面,因此实际上“位置”只需考虑水平面的坐标(x,y)),但每次释放技能都会耗费同等的体力。
现在探险家面临的问题就变成了一个回合制游戏——他的目标是在尽可能少的回合数内到达峡谷的最低点。探险家每回合的行动包含两个部分:(1)往什么方向走?(2)每步走多远?因为探险家什么都看不见,因此脚底坡度的信息对他而言十分重要。他很容易能想到,每次都应该朝梯度下降的方向迈步,这就解决了方向的问题。然而步长(在机器学习中常称为“学习率”)却令他发愁。显而易见,每次行动迈步太短会浪费“体力值”。但是,步长太长则有可能迈过头了,比如从这边山头迈到那边山头,完美错过谷底。探险家应当如何到达至深之地呢?根据探险家的具体情况,我们可以给他私人定制不同的算法。
如果探险家比较老了,记忆力不大好——他每达到一个新的位置,并不怎么记得之前发生了什么,那么他能采用的算法就是简单粗暴的随机梯度下降法(SGD)。
如果探险家能够记得他上一步行动的信息,那么利用好这些信息或许能给他的决策带来裨益,因此他可以采用Momentum、AdaGrad、RMSProp、Adam等算法。
以上算法都是仅使用梯度信息的一阶优化算法。假如探险家是一个堪比拉普拉斯妖一般的智者,他不但能从脚底感知梯度,还能感知梯度的梯度(Hessian矩阵),那么他就可以使用二阶优化算法,如牛顿法、阻尼牛顿法、拟牛顿法、共轭梯度法等。
2 探险家的故事续——以一个简单的峡谷为例
下面是探险家面临的一个狭长峡谷
峡谷的函数表达式:
从上帝视角看,很显然最低点在(0,0)处。
探险家若使用固定步长的随机梯度下降法:
while
我们发现探险家还是走了不少弯路的,因为步子跨得大了。如果将步长修改为0.1呢?
尽管不像上次那样“之”字形移动,但步数太多了,收敛到最低点的速度缓慢。由此可以看到步长对收敛速度影响非常大。
实际上,用展开泰勒级数的方法可以知道,对于能用二次函数很好近似的函数(此例目标函数正是二次函数),可以根据梯度和Hessian矩阵确定最优步长:
if
只用三步这位智者探险家就到达最低点了。
以一个更复杂的目标函数为例,用Matlab实现一些基本的梯度优化算法。以下主要是实现算法并绘制收敛轨迹,得到一个对优化过程的形象理解,不保证代码中的参数已经调整至最优。
目标函数:
初值:(-1.2,1.0)
有最低点坐标:(1,1)
3 一阶优化算法
3.1 随机梯度下降法(SGD)
% 无线搜索的SGD
收敛步数:9085
x=(0.9889, 0.9779)
收敛速度极慢,且结果不够准确
% 有线搜索的SGD
收敛步数:48
x=(1.0002, 1.0004)
收敛速度快,且结果较准确
可以对比得到学习率的线搜索策略的对于优化过程的重要性
3.2 动量随机梯度下降法(Momentum)
% Momentum
收敛步数:812
x=(0.9890, 0.9780)
3.3 AdaGrad
% AdaGrad
收敛步数:4762
x=(0.9889, 0.9779)
3.4 RMSProp
% RMSProp
收敛步数:23956
x=(0.9889, 0.9779)
% Nesterov-RMSProp
收敛步数:724
x=(0.9985, 0.9970)
3.5 Adam
% Adam
收敛步数:12314
x=(0.9889, 0.9779)
4 二阶优化算法
二阶方法收敛速度非常快,对于参数较少的问题优势很大。然而由于要存储Hessian逆矩阵,二阶方法复杂度非常高(大多是多项式复杂度),在深度学习的训练中存在计算量大、训练慢等问题,目前还不能广泛适用于深度学习模型的训练中。
4.1 牛顿法
% 牛顿法
收敛步数:5
x=(1.0000,1.0000)
4.2 阻尼牛顿法
% 阻尼牛顿法
收敛步数:11
x=(0.9996,0.9993)
4.3 DFP拟牛顿法
% DFP拟牛顿法
收敛步数:35
x=(0.9999,0.9997)
除此以外,拟牛顿法中还有更先进的BFGS及L-BFGS算法。
4.4 共轭梯度法
% 共轭梯度法
收敛步数:14
x=(1.0000,1.0000)