什么是梯度下降法?

梯度下降是通过迭代搜索一个函数极小值的优化算法。使用梯度下降,寻找一个函数的局部极小值的过程起始于一个随机点,并向该函数在当前点梯度(或近似梯度)的反方向移动。

在线性和对数几率回归中,梯度下降可以用于搜索最优参数。至于SVM和神经网络,我们之后才考虑。在很多模型中,比如对率回归或者SVM,优化标准是凸形的。凸形函数只有一个极小值,即全局最小值。相比之下,神经网络中的优化标准是非凸形的。不过,即使只找到局部最小值,在很多实际问题中也足够了。

让我们来了解一下梯度下降是怎样工作的。

梯度下降

在本节中,我们具体说明利用梯度下降如何求解一个线性回归问题[1]。我们用Python代码配合说明我们的描述,同时也用图表表示几个梯度下降迭代后解的变化。这里,我们用的数据集只有单一特征。即便这样,优化标准仍会有两个参数:wb。扩展到多维度训练数据很简单:二维数据的时候我们有w(1),w(2)和b,三维数据则有w(1),w(2),w(3)和b,以此类推。

举一个更具体的例子,这里使用一个现实数据集(可在本书的维基中找到)。数据包括以下两列:每年各个公司用于广播广告的开销,以及它们每年销售的单位数量。我们想要构建一个回归模型,可基于公司在广播广告上的开销预测单位销售量。数据集中的每一行代表一个具体的公司。

我们有200个公司的数据,也就有200个训练样本,具体形式为(xi,yi)=(开销,销售)。全部样本可以表示在图4.1中的图表中。

 

什么是梯度下降法?_第1张图片

 

图4.1 原数据

注:y轴对应销售单位(我们想要预测的量),x轴对应我们的特征,即在广播广告上的开销(百万美元)。

什么是梯度下降法?_第2张图片

我们回顾一下,线性回归模型的形式是:f(x)=wx+b。我们并不知道wb的最优值,需要从数据中学习。具体地说,我们要找使均方误差最小化的wb值:

 

 

梯度下降从计算每个参数的偏导数开始:

 

 

(4.1)

为求(yi-(wx+b))2对w的偏导数,我们需要使用链式法则。这里,f=f2(f1)是复合函数。其中,f1=yi-(wx+b),且

。要求fw的偏导数,需要先求ff2的偏导数,等于2(yi-(wx+b))(线性代数中,我们已知导数

)。接着,乘以yi-(wx+b)对w的偏导数-x。组合在一起,有

。如法炮制,求lb的偏导数

梯度下降分周期(epoch)进行。每个周期使用整个训练集更新每个参数。在第一个周期,我们初始化[2]参数w←0和b←0。偏导函数

分别等于

。在每个周期,我们用偏导数更新wb。更新的幅度由学习速率α控制。

 

 

(4.2)

我们从参数值中减去(而不是加)偏导数,因为导数是一个函数增速的指标。如果导数在某一点[3]为正,那么该函数在这一点是增长的。因为我们想要最小化目标函数,所以当导数为正值时,参数应向反方向移动(坐标轴的左侧)。当导数为负值时(函数在下降),参数继续向右移动,从而使函数继续减小。

在下一个周期,我们用式4.1和新的wb值重新计算偏导数;重复该步骤,直到收敛。一般情况是,我们需要很多周期才能观察到wb值在每个周期后不再有大的变化,这时便可以停止了。

很难想象有完全不喜欢使用Python编程语言的机器学习工程师。因此,如果读者还在等待时机开始学习这门语言,现在就再恰当不过了。下面我们看一下在Python语言中如何实现梯度下降。

在每个周期中,更新参数wb的函数如下所示。

 

什么是梯度下降法?_第3张图片

 

 

什么是梯度下降法?_第4张图片

 

以一个for循环重复多个周期的函数如下所示。

 

什么是梯度下降法?_第5张图片

 

上面train函数中的avg_loss函数用于计算平均平方误差,具体定义如下:

 

什么是梯度下降法?_第6张图片

 

如果我们预设函数α=0.001、w=0.0、b=0.0,并以周期为1 500运行train函数,我们将看到以下输出(只显示部分输出)。

 

什么是梯度下降法?_第7张图片

 

我们可以看到,随着train函数循环地运行每个周期,平均损失随之下降。回归线随着训练周期的变化如图4.2所示。

 

什么是梯度下降法?_第8张图片

 

图4.2 回归线随着梯度下降周期变化而改变

最后,一旦我们找到参数wb的最优值,就只需要一个进行预测的函数:

 

 

试着运行以下代码。

 

什么是梯度下降法?_第9张图片

 

输出结果应该是13.97。

梯度下降对学习速率α的选择较敏感。同时,在大数据集上的训练速度较慢。庆幸的是,计算机科学家们已经在原算法基础上提出了一些重要的改进。

小批次随机梯度下降(minibatch Stochastic Gradient Descent,minibatch SGD)就是其中一个改良的版本,通过使用小批量训练样本(子集)估算梯度,从而使计算加速。SGD本身也有诸多“升级”。比如,Adagrad就是其中一个升级版,可通过历史梯度调整每个参数的学习速率α:当梯度非常大时α减小,反之增大。动量(Momentum)是一种加速SGD的方法,它指定梯度下降方向为相关方向并减少摇摆。在训练神经网络时,也常用到SGD的变形,如RMSprop和Adam。

需要注意的是,梯度下降和其变形并不是机器学习算法。它们仅是最小化问题的求解程序,前提是被最小化的函数有一个梯度(在定义域的大多数点上)。

本文摘自《机器学习精讲》

什么是梯度下降法?_第10张图片

 

本书用简短的篇幅、精炼的语言,讲授机器学习领域必备的知识和技能。全书共11章和一个术语表,依次介绍了机器学习的基本概念、符号和定义、算法、基本实践方法、神经网络和深度学习、问题与解决方案、进阶操作、非监督学习以及其他学习方式等,涵盖了监督学习和非监督学习、支持向量机、神经网络、集成学习、梯度下降、聚类分析、维度降低、自编码器、迁移学习、强化学习、特征工程、超参数调试等众多核心概念和方法。全书最后给出了一个较为详尽的术语表。

本书能够帮助读者了解机器学习是如何工作的,为进一步理解该领域的复杂问题和进行深入研究打好基础。本书适合想要学习和掌握机器学习的软件从业人员、想要运用机器学习技术的数据科学家阅读,也适合想要了解机器学习的一般读者参考。

你可能感兴趣的:(随机梯度下降,梯度下降,机器学习,算法)