本文基于吴恩达老师的机器学习课程。看了吴恩达老师的机器学习课程,收获很多,想把课上学做的笔记结合自己的理解以及找到的一些资料综合起来做一个总结。大家感兴趣也可以自己去看一看吴恩达老师的课,这套课程,被公认为最好的机器学习的入门教程,下面是课程视频链接:
上一篇博客机器学习(二):监督学习、无监督学习和强化学习讲了机器的学习被分为三类,监督学习、无监督学习和强化学习。这篇博客就来讲我们的第一个监督学习算法,梯度下降算法。
线性回归
上一篇中,我们举的房屋价格预测的例子,它属于一类被称为"回归问题"的问题范畴,回归(regression)这个词代表了我们需要预测的对象是连续的变量值。我们的第一个监督学习型算法,也可以规约于一个回归任务,我们还是看房屋价格预测的这个例子。
假设上面的左边是我们收集到的房屋数据,右边是根据数据画出的坐标图。问题是如果给你这样一组训练数据的集合,你要怎样让算法学会预测房屋大小以及卧室数量和房屋价格的关系?
我们先引入一些符号,接下来我们会一直使用这些符号:
m:训练样本的个数
X:输入变量(特征)(在这个例子中表示房屋的大小和卧室间数)
Y:输出变量(目标变量)(这个例子中表示房屋价格)
:一个训练样本(在图中的表格中一行代表一个训练样本)
:第i个训练样本(在图中的表格中第i行代表第i个训练样本)
在监督学习中,我们有一个数据集,这个数据集被称为训练集(training set)。在房子价格预测的例子中,我们一开始收集到的房屋面积,卧室间数和价格就是训练集,我们的任务就是从中学习预测房子的价格。监督学习算法的工作方式:
因而,要解决房价预测问题,我们实际上是要将训练集输入给我们的学习算法,进而学习得到一个假设h,然后将我们要预测的房屋的尺寸X作为输入变量输入给H,预测出该房屋的交易价格Y作为输出变量输出为结果。因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。可以看出,我们最后的目的就是求得这个H函数,我们接下来需要去思考的是怎样得到这个假设H。
最小二乘法-损失函数
对于我们要讨论的第一个学习算法,我们仅仅讨论线性假设,以后我们会讨论复杂的多的假设和更加高阶的函数。假设为特征房屋的大小,对假设进行线性表示:
这里的被称为学习算法的参数(Parameters),
、
都是实数,利用训练集合选择或学习,得到合适的参数值,是学习算法的的任务。这里为了简洁,我们假设有特征
,所以,对于有多种特征输入时:
那么,我们应该怎么样选取参数,来让我们的假设
对所有房屋做出准确预测呢?假设我们有个训练集合X,并假设对训练集合中的房子价格的预测为
。为了让学习算法的预测在训练数据上尽可能准确,我们希望使用最小二乘法,使预测和实际价格的平方差
尽可能的小。
我们有m个训练样本,所以对于我们的m个样本,我们令为从1到m对应的加上第i个房子的预测价格减去目标变量(第i个训练样本的实际价格):
。通常,我们会在前面乘以一个
,而不是直接对平方差求和,这会简化我们之后的数学运算,我们称
为损失函数(loss function),也被称为代价函数(cost function)或平方误差函数(Squared error function):
当我们只有一个输入特征时,也只有参数
和
,这时假设函数为
,对应的损失函数
为
。这里
和
都是我们的输入数据,是已知的,也就是
是一个关于
的一元二次方程,我们想要求他的最小值很容易,他的图像是一个三维曲面:
如果我们有两个输入特征或三个输入特征时,对应的损失函数的图像是三维、四维的,那么这样我们怎么样求出使最小的
值呢,这就要用到梯度下降算法了。
梯度下降(Gradient Descent)
梯度下降算法可以将损失函数最小化,梯度下降是很常用的算法,它不仅被使用在线性回归问题上,实际上它还被用在机器学习的其它许多地方,下面我们来具体讲下梯度下降算法是怎么样工作的。
上面我们说到有两个输入特征对应的损失函数的图像是一个三维的曲面,我们需要找到这个三维曲面中的最低点所对应的值,我们就必须先找到这个最低点。我们先赋予
和
一个初始值,我们一般初始化为0,你也可以将它们初始化为其他值。
你可以将这张图想像成公园中的两座高山,想像你正站在你所想像的公园的这座红色的高山上,在梯度下降算法中,我们要做的就是,旋转360度,看我们周围,我们要在某个方向上,以小碎步尽快下山。如果我要下山,我想以最快的速度下去,这些小碎步要朝什么方向?如果我们站在山坡上的这一点,最佳的下山方向应该是下山最陡的方向,即这一点的梯度方向。然后我们在山上的新的起点,再看看周围,继续向最陡的方向迈步。不断重复,直到到达或者接近最低点。
但是梯度下降算法找到的最低点,不一定是整个函数的最小值。梯度下降算法的结果有时会依赖于参数的初始值,如果选择的起点不同,得到的结果也可能是另一个局部最优值,后面我们将探讨这个问题。
就像上面说的那样,寻找最低点的时候,每次找的最陡的方向是该点处的梯度方向,即损失函数在该点处的方向导数沿着该方向会取得最大值。
我们可以把这个步骤,写成这样的数学形式,这里会不断的更新的值,下面是实现同时更新的方法,同时更新是梯度下降中的一种常用方法:
这里的符号":="(colon equal)是赋值符号,它会把左边变量的值设成右边变量的值。这里不用=赋值,是因为在算法中,=表示的是一个真值赋值,是说左边的值等于右边的值。
这里的是算法的参数,称之为学习速度,它控制了梯度下降的快慢,通常是手动设置的。过小时,
会花很长时间收敛,使
达到最小值。过大时,
更新的很快,导致可能会错过最小值点。
所以,如果你将初始值选在了一个局部最优的点,此时,这点的斜率为0,也就是损失函数的导数项为0。你会发现
不再改变,也就是你已经在局部最优点,所以,如果你已经处于局部最优点,其实梯度下降算法什么也没有做,它不会改变参数的值,这也正是我们想要的,因为它使你的解保持在局部最优点。
假设只有一组训练样本的情形,我们把对
的导数展开:
所以,我们最后得到的的更新表达式:
这就是梯度下降算法,经过对的不断更新,直到求出
的值使损失函数
取得最小值。到达局部最小值时,梯度也为0,所以当接近局部最小值时,梯度越来越小,参数
也减小的越来越慢。最后,把参数带入
后,我们就得到了假设函数
。
在预测房屋价格的例子中,的初始值都是0。在房屋数据的点状图中,我们可以看到最下面那条0的线表示了初始参数下的假设。经过数次迭代后,
收敛了,我们得到了这组数据的最小二乘拟合。
写的若有错误之处,欢迎大家批评指正!