2.1.4 梯度下降算法
1.梯度下降算法的原理
机器学习中很多问题的求解本质上都是求解优化相关的问题,找到合适的参数以期最小化损失函数值。求解类似的优化问题,有很多成熟的方法可以参考,梯度下降就是一种经典的方法。它利用梯度信息,通过不断迭代调整参数来寻找合适的解。
对于一个多元函数f(x),梯度定义为对其中每个自变量的偏导数构成的向量,用f'(x)表示,如式(2.6)所示:
考查f(x+Δx)在x处的泰勒展开,如式(2.7)所示:
要想使得f(x+Δx)<f(x),忽略高阶项,就需要f'(x)TΔx<0,也就是说,满足这个条件就可以使得函数值减小,进一步地,f'(x)TΔx=||f'(x)T||·||Δx||·cosθ,取Δx=–αf'(x),可保证更新后的x可以使得函数值减小,这里α是一个超参数,用于调整每次更新的步长,称为学习率。
机器学习中优化的目标是最小化损失函数,通过梯度下降的方法进行求解的过程分为以下几步,算法过程如代码清单2-1所示。首先,通过随机初始化为需要求解的参数赋初值,作为优化的起点;接下来,使用模型对所有样本进行预测,计算总体的损失值;然后利用损失值对模型参数进行求导,得到相应的梯度;最后基于梯度调整参数,得到迭代之后的参数。重复上述过程,直到达到停止条件。
作一个形象的比喻,梯度下降算法就像是一个人下山,他在山顶,想要达到山脚,但是山上的浓雾很大,他分不清下山的路,必须利用自己周围的信息去找到下山的路径,这时候就可以使用梯度下降算法。具体来说就是,以他当前所处的位置为基准,找到这个位置最陡峭的方向,然后朝着这个方向往山下走,每走一段路就重复上述步骤,最后就能成功到达山脚了。
梯度下降算法
2.随机梯度下降算法
前面介绍的梯度下降算法需要首先计算所有数据上的损失值,然后再进行梯度下降,这种方式在数据规模比较大时是比较低效的。主要体现在3个方面,一是数据规模大时,模型计算所有样本的时间增加;二是随着数据维度的增加,梯度计算的复杂度也会增加;三是虽然可以基于所有样本得到准确的梯度值,但是仅需进行一次参数更新,我们称这样的梯度下降算法为批梯度下降(Batch Gradient Descent)。
如果不使用全量的样本来计算梯度,而使用单一样本来近似估计梯度,就能极大地减少计算量,提高计算效率,但是这种方法是否能保证一定收敛呢?可以证明,这种算法的收敛性是可以保证的,这种方法称为随机梯度下降(Stochastic Gradient Descent,SGD)。
具体来说就是,每次从训练集中随机选择一个样本,计算其对应的损失和梯度,进行参数更新,反复迭代。这种方式在数据规模比较大时可以减小计算复杂度,从概率意义上来说单个样本的梯度是对整个数据梯度的无偏估计,但是它存在着一定的不确定性,因此收敛速率相比批梯度下降得更慢。
改进的方法是每次使用多个样本来估计梯度,这样可以减小不确定性,提高收敛速率。这种方法称为小批量随机梯度下降(mini-batch SGD),其中每次迭代选取的样本数量称为批大小(batch size),算法步骤如下所示。
小批量随机梯度下降