一、概念
梯度下降法(gradient descent)是一个最优化算法,常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型。梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一。
二、原理
平时我们说的训练神经网络就是最小化损失函数的过程,损失函数的值衡量了模型在给定数据集下的表现(拟合)能力。那么如何能迅速的使损失函数的值走向最低点呢?我们假设:位于三维空间里的任意一个点都可以找到与之相切的平面,在高维的情况下也能找到超平面与其相切。那么在相切平面上的任意一个点都有多种方向,但只有一个方向能使该函数值上升最快,这个方向我们称之为梯度方向,而这个梯度方向的反方向就是函数值下降最快的方向,这就是梯度下降的过程。
三、变种
3.1 Batch gradient descent (BGD)
BGD(批量梯度更新)。就是一次性把所有样本同时计算之后得到梯度值,然后更新参数。这种方法十分简便,它对凸函数可以收敛到全局最优值,对于非凸函数则收敛到局部最优值。与此同时它缺点显而易见:在大数据量下内存占用巨大、计算时间久,并且无法进行在线更新。其需要计算整个训练集的梯度,即:
θ=θ−η∇θJ(θ)
其中 η 为学习率,用来控制更新的“力度”。
优点:
对于凸目标函数,可以保证全局最优; 对于非凸目标函数,可以保证一个局部最优。
缺点:
速度慢; 数据量大时不可行; 无法在线优化(即无法处理动态产生的新样本)。
3.2 Stochastic gradient descent (SGD)
面对 BGD 的瓶颈 SGD 应运而生,它每次只更新一个样本,相对比于 BGD ,它的收敛速度更快并且可以在线更新,有机会跳出局部最优。仅计算某个样本的梯度,即针对某一个训练样本 xixi 及其label yiyi更新参数:
θ=θ−η∇θJ(θ;xi,yi)
逐步减小学习率,SGD表现得同BGD很相似,最后都可以有不错的收敛。
优点:
更新频次快,优化速度更快; 可以在线优化(可以无法处理动态产生的新样本);一定的随机性导致有几率跳出局部最优(随机性来自于用一个样本的梯度去代替整体样本的梯度)
缺点:
随机性可能导致收敛复杂化,即使到达最优点仍然会进行过度优化,因此SGD得优化过程相比BGD充满动荡。
3.3 Mini-batch gradient descent (MBGD)
由于 SGD 无法利用矩阵操作加速计算过程,考虑到上述两种方法的优缺点,就有了小批量梯度下降算法(MBGD),每次只选取固定小批量数据进行梯度更新。MBGD)计算包含n 个样本的mini-batch的梯度:
θ=θ−η∇θJ(θ;x(i:i+n),y(i:i+n))
MBGD是训练神经网络最常用的优化方法。
优点:
参数更新时的动荡变小,收敛过程更稳定,降低收敛难度;可以利用现有的线性代数库高效的计算多个样本的梯度。
3.4面临的挑战
1. 如何选择合适的学习率?
学习率过小导致收敛太慢,过大又导致收敛动荡甚至偏离最优点。
2. 如何确定学习率的调整策略?
目前调整学习率基本都按照一种 “退火”的思想,要么按照预定模式调整,要么根据目标函数值的变化是否满足阈值动态改变学习率。 但是,“模式”和“阈值”都需要事先指定,无法自适应不同数据集。
3. 对所有参数的更新采用相同的学习率是否恰当?
如果数据是稀疏的且特征分布不均,似乎我们更应该给予较少出现的特征一个大的更新。
4. 如何跳出局部最优?
理论上只有严格的凸函数才可以通过梯度下降获得全局最优解。 但是,神经网络所面临的基本上都是严重非凸的目标函数,这也意味着优化容易陷入局部最优。 事实上,我们的困难往往来自 “鞍点” 而非局部极小点。 鞍点周围通常拥有相同的损失函数值,这导致SGD很难发挥作用,因为每个方向的梯度都接近于0。