梯度降低无疑是大多数机器学习(ML)算法的核心和灵魂。对于初学者来讲,这样作可以让咱们更好地理解大多数机器学习算法是如何工做的。另外,想要培养对复杂项目的直觉,理解基本的概念也是十分关键的。python
为了理解梯度降低的核心,让咱们来看一个运行的例子。这项任务是这个领域的一项老任务——使用一些历史数据做为先验知识来预测房价。算法
咱们的目标是讨论梯度降低,因此咱们会尽量地举简单的例子。网络
假设咱们想爬一座很高的山,咱们的目标是最快到达山顶,可咱们环顾四周后,意识到有不止一条路能够走。既然咱们在山脚,那么全部的路都能让咱们离山顶更近。运维
若是咱们想以最快的方式到达顶峰,要怎么作呢?怎样才能只迈出一步,就可以离山顶最近?机器学习
到目前为止,咱们还不清楚如何迈出这一步!而这就是梯度的用武之地。函数
正如可汗学院的这段视频所述,梯度获取了一个多变量函数的全部偏导数。post
让咱们一步步来看看它是如何工做的。性能
用更简单的话来讲,导数是一个函数在某一点的变化率或斜率。学习
以f(x)=x²函数为例。f(x)的导数就是另外一个函数f'(x)在一个定点x的值,f'(x)就是f(x)的斜率函数。在这种状况下,当x=2时,f(x) = x²的斜率是2 x,也就是2*2=4。ui
f(x) = x²在不一样点的斜率。
简单来讲,导数指向上升最陡的方向。恰巧的是,梯度和导数基本上是同样的。除了一点,即梯度是一个向量值函数,向量里包含着偏导数。换句话说,梯度是一个向量,它的每个份量都是对一个特定变量的偏导数。
以函数f(x,y)=2x²+y²为另外一个例子。
这里的f(x,y)是一个多变量函数。它的梯度是一个向量,其中包含了f(x,y)的偏导数,第一个是关于x的偏导数,第二个是关于y的偏导数。
若是咱们计算f(x,y)的偏导数。
获得的梯度是如下这样的向量:
请注意,其中每一个元素都指示了函数里每一个变量的最陡上升方向。换句话说,梯度指向函数增加最多的方向。
回到登山的例子中,坡度指向的方向是最快到达山顶的方向。也就是说,梯度指向一个面更高的地方。
一样的,若是咱们有一个有四个变量的函数,咱们会获得一个有四个偏导数的梯度向量。一般,一个有n个变量的函数会产生一个n维梯度向量。
可是对于梯度降低,咱们不想让f函数尽快地最大化,而是想让它最小化。
因此咱们须要先定义咱们的任务,让目标变得更清晰明确一点。
咱们的目标是基于历史数据来预测房价。而想要创建一个机器学习模型,一般须要至少3个要素——问题T、性能度量P和经验E。
为了解决问题T,咱们将使用一个简单的线性回归模型。该模型将从经验E中学习,通过训练,模型就能将其知识推广到未知数据中。
线性模型是一个很好的学习模型。它是许多其余ML算法的基础,好比神经网络和支持向量机。
在本例中,经验E就是房屋数据集。房屋数据集包含了圣路易斯奥比斯波县及其周边地区最近的房地产清单。
数据集包含了781条数据记录,能够在原文下载CSV格式的数据文件。为了简便,在数据的8个特征中,咱们只关注其中的两个特征 : 房屋大小和价格。在这781条记录中,每一条记录的房屋大小(以平方英尺为单位)将是咱们的输入特征,而价格则是咱们的预测目标值。
此外,为了检查咱们的模型是否正确地从经验E中学习到了模式知识,咱们须要一个机制来衡量它的性能。所以,咱们将平方偏差(MSE)的均值做为性能度量P。
多年来,MSE一直是线性回归的标准。但从理论上讲,任何其余偏差测量方法,好比绝对偏差,都是可用的。而MSE的一些优势是,它对偏差的衡量比绝对偏差更好。
如今咱们已经公式化了咱们的学习算法,接下来就深刻研究代码。
首先,咱们使用pandas在python中加载数据,并分离房屋大小和价格特征。以后,咱们对数据进行标准化,以防止某些特征的大小范围与其余特征不一样。并且,标准化过的数据在进行梯度降低时,收敛速度比其余方法快得多。
下面,你能够看到以平方米为单位的房价分布。
按面积计算的房价分布。数据被标准化到了[0,1]区间。
线性回归模型的工做原理是在数据上画一条线。所以,咱们的模型由一个简单的直线方程表示。
线性方程,m和b分别是斜率和y轴的截距,x变量是输入值。
对于线性模型,斜率m和y轴的截距b是两个自由的参数。咱们则要经过改变这两个参数来找到最好的直线方程。
咱们将对它们迭代执行一些细小的改变,这样它就能够沿着偏差曲面上最陡的降低方向走。在每次迭代以后,这些权重变化将改善咱们的模型,使得它可以表示数据集的趋势。
在继续往下看以前,请记住咱们要取梯度的反方向来进行梯度降低。
你能够把梯度降低想象成一个球滚下山谷。咱们想让它落在最深的山谷里,然而很明显,咱们看到实际状况可能会出错。
打个比方,咱们能够把梯度降低想象成一个球滚下山谷。最深的山谷是最优的全局最小值,这是咱们的目标。
根据球开始滚动的位置,它可能停在某一个山谷的底部。但不是最低的。这叫作局部极小值,在咱们的模型中,山谷就是偏差面。
注意,在类比中,并非全部的局部极小值都是糟糕的。实际上其中一些几乎和最低的(全局)同样低(好)。事实上,对于高维偏差曲面,最多见的方法是使用这些局部极小值中的一个(其实也不是很糟糕)。
相似地,咱们初始化模型权重的方法可能会致使它停留在局部极小值。为了不这种状况,咱们从均值为零且方差较小的随机正态分布中初始化两个权值向量。
在每次迭代中,咱们将取数据集的一个随机子集,并将其与权重线性组合。这个子集称为迷你批处理(mini-batch)。在线性组合后,咱们把获得的向量输入MSE函数,计算新的偏差。
利用这个偏差,咱们能够计算出偏差的偏导数,而后获得梯度。
首先,咱们获得关于W0的偏导数:
接下来,咱们求W1的偏导数
由这两个偏导数,咱们能够获得梯度向量:
其中Err是MSE错误函数。
有了这个,咱们下一步是使用梯度更新权重向量W0和W1,以最小化偏差。
咱们想要更新权重,以便它们能够在下一次迭代中将错误下降。咱们须要使它们遵循每一个相应梯度信号的相反方向。为此,咱们将在这个方向上采起小尺寸η的小步骤。
步长η是学习率,它控制学习速度。根据经验,一个好的起点是0.1。最后,更新步骤规则设置为:
在代码中,完整的模型看起来像这样。查看两个梯度DW0和DW1前面的减号。这保证了咱们将在与梯度相反的方向上采起步骤。
更新权重后,咱们使用另外一个随机小批量重复该过程,就是这样。
逐步地,每次重量更新致使线路中的小的移动朝向其最佳表示。最后,当偏差方差足够小时,咱们就能够中止学习。
随时间变换的线性模型。第一次权重更新使线条快速达到理想的表示。
此版本的梯度降低称为迷你批处理(Mini-Batch)随机梯度降低。在这个版本中,咱们使用一小部分训练数据来计算梯度。每一个小批量梯度提供最佳方向的近似值。即便梯度没有指向确切的方向,实际上它也会收敛到很是好的解决方案。
每个Epoch的错误信号。请注意,在很是快地减少偏差信号以后,模型会减慢并收敛。
若是仔细观察错误图表,就会注意到,在开始时学习速度会更快。 然而,在通过一些Epoch以后,它会放慢速度并保持平稳。这是由于,在开始时,指向最陡降低的梯度向量的幅度很长。结果,两个权重变量W0和W1遭受更大的变化。
接着,随着它们愈来愈靠近偏差表面的顶点,梯度逐渐变得愈来愈小,这致使了权重的很是小的变化。
最后,学习曲线稳定,而且过程完成。
原文标题:Machine Learning 101: An Intuitive Introduction to Gradient Descent
不要光顾着收藏,记得点赞、关注哦~~~