机器学习算法由四大部分组成:数据集、模型、损失函数和优化方法。
数据集是用来概括问题领域的。小数据集容易导致欠拟合,而大数据集则可能导致计算负担过重。因此,我们需要提升计算能力,以便能处理更大规模的数据集。
模型则是用来构建问题领域的一种方式。小模型可能会欠拟合,而大模型则可能过拟合。因此,我们需要选择合适的模型来进行有效的推理。
损失函数用于评估模型的好坏。例如,偏差小和方差小分别表示模型的预测误差较小和稳定性较好。我们希望损失函数能使模型逐渐接近最优状态。
优化方法帮助我们快速准确地找到最佳模型。在机器学习中,很多问题是非凸的,好的优化方法可以帮助模型快速找到全局或局部最优解。
在机器学习实践中,梯度下降是一种常用的优化算法。
一、梯度下降的基本原理
在深度学习中,梯度下降通常用于反向传播过程中优化模型。优化的目标通常是使某个函数f(x)最小化;若需最大化某函数,则可以通过取其相反数转化为最小化问题。在机器学习中,这类函数通常被称为目标函数、代价函数、损失函数或误差函数,本文统一称其为损失函数。当x为使得f(x)最小的x值时,我们可以写作x=argmin f(x)。
梯度实际上就是导数,梯度下降意味着函数f(x)沿导数的反方向移动。例如,当x<0时,f'(x)<0,f(x)将向右移动;当x>0时,f'(x)>0,f(x)将向左移动;当x=0时,f'(x)=0,这时函数达到最小值。
当导数为零时,函数f(x)处于临界点。在临界点,函数有可能达到局部最小值,也可能达到全局最小值。此外,临界点还可能是鞍点,即既不是极大值也不是极小值。比如,第一张图展示的是局部最小值,第二张图展示的是局部最大值,第三张图展示的是鞍点。
函数f(x)可能存在一个全局最小值,也可能存在多个全局最小值,或者存在一些不是全局最小值的局部最小值。在深度学习中,尤其是面对高维度输入时,局部最小值和鞍点往往给优化过程带来挑战。因此,我们通常采用近似最小化策略,即选取一个局部最小值,只要损失函数达到一定阈值即可接受。
对于具有多维输入的函数,偏导数∂f(x)/∂xi描述了当Xi发生变化时,f(x)的变化率。∇xf(x)表示f(x)所有偏导数组成的向量,称为梯度向量。临界点是指梯度向量中的所有元素都为零的点。沿着负梯度方向移动可以减少f(x),这就是梯度下降法。新位置可以通过公式x=x-ϵg来确定,其中ϵ为学习率,代表模型训练的速度,是一个较小的常数。
二、梯度下降的问题
在机器学习中,较大的数据集有助于提高模型的泛化能力,但同时也增加了计算成本。损失函数通常是所有样本损失函数的总和。传统的批量梯度下降法需要计算所有样本的梯度,这在深度学习中尤其耗时,尤其是在拥有大量训练数据的情况下。
例如,数据集的对数似然可以表示为:
L(x,y:θ) = -log p(y|x;θ)
其中,L(x,y:θ)表示每个样本的损失函数,m表示样本数量。
批量梯度下降法需要计算所有样本的梯度,其计算复杂度为O(m),当m很大时,计算量非常大。
三、梯度下降的优化
为了解决批量梯度下降法带来的问题,出现了随机梯度下降法和小批量梯度下降法。
梯度下降法优化的核心思想是通过少量样本近似估计梯度。具体来说,在每一次迭代中,我们从训练数据集中随机抽取m'个样本,m'相对于m来说是一个较小的数字。当m'为1时,我们称之为随机梯度下降法;当m'不等于1时,我们称之为小批量梯度下降法。这种方法即使在拥有数十亿样本的数据集上,每次梯度更新也只需要用到少量样本。
优化后的梯度下降法需要计算小批量样本的梯度,然后使用θ <- θ - ϵg来更新参数θ。
随机梯度下降法的优点在于速度快,但因为每次只用一个样本,所以准确性较低。而小批量梯度下降法则在速度和准确性之间找到了平衡。
梯度下降法不仅在深度学习中应用广泛,在其他大规模数据的线性模型训练中也有重要作用。在深度学习出现之前,非线性模型的学习主要依赖于核技巧,将低维输入空间映射到高维特征空间,然后在高维空间中进行线性操作。这些方法虽然泛化性能一般,但计算复杂度非常高。相比之下,深度学习不仅能获得较好的泛化性能,还能显著降低计算成本。