梯度下降是通过迭代搜索一个函数极小值的优化算法。使用梯度下降,寻找一个函数的局部极小值的过程起始于一个随机点,并向该函数在当前点梯度(或近似梯度)的反方向移动。
在线性和对数几率回归中,梯度下降可以用于搜索最优参数。至于SVM和神经网络,我们之后才考虑。在很多模型中,比如对率回归或者SVM,优化标准是凸形的。凸形函数只有一个极小值,即全局最小值。相比之下,神经网络中的优化标准是非凸形的。不过,即使只找到局部最小值,在很多实际问题中也足够了。
让我们来了解一下梯度下降是怎样工作的。
梯度下降
在本节中,我们具体说明利用梯度下降如何求解一个线性回归问题[1]。我们用Python代码配合说明我们的描述,同时也用图表表示几个梯度下降迭代后解的变化。这里,我们用的数据集只有单一特征。即便这样,优化标准仍会有两个参数:w和b。扩展到多维度训练数据很简单:二维数据的时候我们有w(1),w(2)和b,三维数据则有w(1),w(2),w(3)和b,以此类推。
举一个更具体的例子,这里使用一个现实数据集(可在本书的维基中找到)。数据包括以下两列:每年各个公司用于广播广告的开销,以及它们每年销售的单位数量。我们想要构建一个回归模型,可基于公司在广播广告上的开销预测单位销售量。数据集中的每一行代表一个具体的公司。
我们有200个公司的数据,也就有200个训练样本,具体形式为(xi,yi)=(开销,销售)。全部样本可以表示在图4.1中的图表中。
图4.1 原数据
注:y轴对应销售单位(我们想要预测的量),x轴对应我们的特征,即在广播广告上的开销(百万美元)。
我们回顾一下,线性回归模型的形式是:f(x)=wx+b。我们并不知道w和b的最优值,需要从数据中学习。具体地说,我们要找使均方误差最小化的w和b值:
梯度下降从计算每个参数的偏导数开始:
(4.1)
为求(yi-(wx+b))2对w的偏导数,我们需要使用链式法则。这里,f=f2(f1)是复合函数。其中,f1=yi-(wx+b),且
。要求f对w的偏导数,需要先求f对f2的偏导数,等于2(yi-(wx+b))(线性代数中,我们已知导数
)。接着,乘以yi-(wx+b)对w的偏导数-x。组合在一起,有
。如法炮制,求l对b的偏导数
。
梯度下降分周期(epoch)进行。每个周期使用整个训练集更新每个参数。在第一个周期,我们初始化[2]参数w←0和b←0。偏导函数
和
分别等于
和
。在每个周期,我们用偏导数更新w和b。更新的幅度由学习速率α控制。
(4.2)
我们从参数值中减去(而不是加)偏导数,因为导数是一个函数增速的指标。如果导数在某一点[3]为正,那么该函数在这一点是增长的。因为我们想要最小化目标函数,所以当导数为正值时,参数应向反方向移动(坐标轴的左侧)。当导数为负值时(函数在下降),参数继续向右移动,从而使函数继续减小。
在下一个周期,我们用式4.1和新的w、b值重新计算偏导数;重复该步骤,直到收敛。一般情况是,我们需要很多周期才能观察到w、b值在每个周期后不再有大的变化,这时便可以停止了。
很难想象有完全不喜欢使用Python编程语言的机器学习工程师。因此,如果读者还在等待时机开始学习这门语言,现在就再恰当不过了。下面我们看一下在Python语言中如何实现梯度下降。
在每个周期中,更新参数w和b的函数如下所示。
以一个for循环重复多个周期的函数如下所示。
上面train函数中的avg_loss函数用于计算平均平方误差,具体定义如下:
如果我们预设函数α=0.001、w=0.0、b=0.0,并以周期为1 500运行train函数,我们将看到以下输出(只显示部分输出)。
我们可以看到,随着train函数循环地运行每个周期,平均损失随之下降。回归线随着训练周期的变化如图4.2所示。
图4.2 回归线随着梯度下降周期变化而改变
最后,一旦我们找到参数w和b的最优值,就只需要一个进行预测的函数:
试着运行以下代码。
输出结果应该是13.97。
梯度下降对学习速率α的选择较敏感。同时,在大数据集上的训练速度较慢。庆幸的是,计算机科学家们已经在原算法基础上提出了一些重要的改进。
小批次随机梯度下降(minibatch Stochastic Gradient Descent,minibatch SGD)就是其中一个改良的版本,通过使用小批量训练样本(子集)估算梯度,从而使计算加速。SGD本身也有诸多“升级”。比如,Adagrad就是其中一个升级版,可通过历史梯度调整每个参数的学习速率α:当梯度非常大时α减小,反之增大。动量(Momentum)是一种加速SGD的方法,它指定梯度下降方向为相关方向并减少摇摆。在训练神经网络时,也常用到SGD的变形,如RMSprop和Adam。
需要注意的是,梯度下降和其变形并不是机器学习算法。它们仅是最小化问题的求解程序,前提是被最小化的函数有一个梯度(在定义域的大多数点上)。
本书用简短的篇幅、精炼的语言,讲授机器学习领域必备的知识和技能。全书共11章和一个术语表,依次介绍了机器学习的基本概念、符号和定义、算法、基本实践方法、神经网络和深度学习、问题与解决方案、进阶操作、非监督学习以及其他学习方式等,涵盖了监督学习和非监督学习、支持向量机、神经网络、集成学习、梯度下降、聚类分析、维度降低、自编码器、迁移学习、强化学习、特征工程、超参数调试等众多核心概念和方法。全书最后给出了一个较为详尽的术语表。
本书能够帮助读者了解机器学习是如何工作的,为进一步理解该领域的复杂问题和进行深入研究打好基础。本书适合想要学习和掌握机器学习的软件从业人员、想要运用机器学习技术的数据科学家阅读,也适合想要了解机器学习的一般读者参考。