最优化问题在机器学习/深度学习中是经常遇到的问题,也是很重要的一个问题。学习算法的本质都是建立优化模型,通过最优化方法对目标函数(或损失函数)进行优化,从而训练出最好的模型。常见的最优化方法主要有以下几种。
一、梯度下降法
1.1 标准梯度下降法(Batch Gradient Descent)
参数更新:
其中:
梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。
优点:
代价函数若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值。
缺点:
(1)靠近极小值时收敛速度减慢
(2)可能会“之字形”地下降
(3)训练数较多时,需要较大内存
(4)不允许在线更新模型
也就是说梯度下降法在接近最优解的区域收敛速度明显变慢,利用梯度下降法求解需要很多次的迭代。而且是先计算所有样本汇总误差,然后根据总误差来更新权值,这样无疑是比较慢的。批量梯度下降最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下。
1.2 随机梯度下降法(Stochastic Gradient Descent)
参数更新:
随机梯度下降随机抽取一个样本来计算误差,然后更新权值。所以如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将参数迭代到最优解了。
随机梯度下降法是最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。
优点:
(1)算法收敛速度比Batch Gradient Descent算法快
(2)可以在线更新
(3)有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优
缺点:
容易收敛到局部最优,并且容易被困在鞍点。
1.3 Mini-batch Gradient Descent
参数更新:
mini-batch Gradient Descent的方法是在上述两个方法中取折衷, 每次从所有训练数据中取一个子集(mini-batch) 用于计算梯度,然后更新参数。
优点:
(1)收敛速度比上述两个都快
(2)收敛较为稳定
缺点:
(1) 因为要兼顾整个神经网络中所有参数的训练效果, 因此对学习率的选择比较敏感
(2) 容易收敛到局部最优, 并且在某些情况下容易被困在鞍点, 需要使用合适的初始化和步长
(3) 参数的更新仅仅依赖于当前 batch 中的数据, 当数据波动大时, 更新往往不够稳定
但是整体性能还是强于上述两个,因此现在说梯度下降法一般都是指的是Mini-batch Gradient Descent。
1.4 TensorFlow中
loss=........ #定义代价函数
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss) #设置学习率,最小化代价函数
具体配置
二、Momentum(动量)
2.1 Momentum
参数更新:
其中:
当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样
可以加快小球的向下的速度。
Momentum算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。
Momentum算法会观察历史梯度 v t − 1 v_{t−1} vt−1,若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。一种形象的解释是:我们把一个球推下山,球在下坡时积聚动量,在途中变得越来越快,γ可视为空气阻力,若球的方向发生变化,则动量会衰减。
优点:
(1)下降初期时