Python机器学习算法: 原理、实现与案例
上QQ阅读APP看书,第一时间看更新

1.3 梯度下降

1.3.1 梯度下降算法

有很多机器学习模型的最优化参数不能像普通最小二乘法那样通过“闭式”方程直接计算,此时需要求助于迭代优化方法。通俗地讲,迭代优化方法就是每次根据当前情况做出一点点微调,反复迭代调整,直到达到或接近最优时停止,应用最为广泛的迭代优化方法是梯度下降(Gradient Descent)。图1-2所示为梯度下降算法逐步调整参数,从而使损失函数最小化的过程示意图。

图1-2

梯度下降算法常被形象地比喻为“下山”。如果你想尽快走下一座山,那么每迈一步的方向应选择当前山坡最陡峭的方向,迈一步调整一下方向,一直走到发现脚下已是平地。对于函数而言,梯度向量的反方向是其函数值下降最快的方向,即最陡峭的方向。梯度下降算法可描述为:

(1)根据当前参数计算损失函数梯度

(2)沿着梯度反方向调整,调整的大小称为步长,由学习率控制。使用公式表述为:

(3)反复执行上述过程,直到梯度为0或损失函数降低小于阈值,此时称算法已收敛。

应用梯度下降算法时,超参数学习率的选择十分重要。如果过大,则有可能出现走到接近山谷的地方又一大步迈到了山另一边的山坡上,即越过了最小值点;如果过小,下山的速度就会很慢,需要算法更多次的迭代才能收敛,这会导致训练时间过长。以上两种情形如图1-3所示。

图1-3

另外,还需知道的是,图1-3中的损失函数对于梯度下降算法是很理想的,它仅有一个全局最小值点,算法最终将收敛于该点。但也有很多机器学习模型的损失函数存在局部最小值,其曲线如绵延起伏的山脉,如图1-4所示。

对于图1-4中的损失函数,假设梯度下降算法的起始点位于局部最小值点左侧,算法则有可能收敛于局部最小值,而非全局最小值。此例子表明,梯度下降算法并不总收敛于全局最小值。

本节我们讨论的线性回归的损失函数是一个凸函数,不存在局部最小值,即只有一个全局最小值,因此梯度下降算法可收敛于全局最小值。

图1-4

在1.2节中,我们计算出线性回归损失函数的梯度为:

设学习率为,梯度下降算法的参数更新公式为:

可以看出,执行梯度下降算法的每一步都是基于整个训练集计算梯度的,因此梯度下降也被称为批量梯度下降:每次使用整批训练样本计算梯度,在训练集非常大时,批量梯度下降算法会运行得极慢。1.3.2小节将介绍的随机梯度下降和小批量梯度下降可以解决该问题。

1.3.2 随机梯度下降和小批量梯度下降

随机梯度下降和小批量梯度下降可以看成是对批量梯度下降的近似,算法流程基本相同,只是每步使用少量的训练样本计算梯度。

随机梯度下降是与批量随机下降相反的极端情况,每一步只使用一个样本来计算梯度。

随机梯度下降算法的梯度计算公式为:

设学习率为,随机梯度下降算法的参数更新公式为:

因为每次只使用一个样本来计算梯度,所以随机梯度下降运行速度很快,并且内存开销很小,这使得随机梯度下降算法可以支持使用海量数据集进行训练。随机梯度下降过程中,损失函数的下降不像批量梯度下降那样缓缓降低,而是不断上下起伏,但总体上趋于降低,逐渐接近最小值。通常随机梯度下降收敛时,参数是足够优的,但不是最优的。随机梯度下降算法的另一个优势是,当损失函数很不规则时(存在多个局部最小值),它更有可能跳过局部最小值,最终接近全局最小值。

随机梯度下降算法的一轮(Epoch)训练是指:迭代训练集中每一个样本,使用单个样本计算梯度并更新参数(一轮即m步),在每轮训练前通常要随机打乱训练集。

小批量梯度下降是介于批量梯度下降和随机梯度下降之间的折中方案,每一步既不使用整个训练集又不使用单个样本,而使用一小批样本计算梯度。

设一小批样本的数量为N,小批量梯度下降算法的梯度计算公式为:

设学习率为,小批量梯度下降算法的参数更新公式为:

小批量梯度下降同时具备批量梯度下降和随机梯度下降二者的优缺点,应用时可视具体情况指定N值。