我们学习的第一个算法是线性回归算法。让我们通过一个例子来开始:这个例子是预测住房价格的,我们使用的数据集包含俄勒冈州波特兰市的住房价格。现在我根据不同房屋尺寸所售出的价格,画出图像。比方说,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱。那么,你可以做的一件事就是构建一个模型,从这个数据模型上来看,它是一条直线,所以也许你可以告诉你的朋友,他能以大约220000(美元)左右的价格卖掉这个房子。这就是监督学习算法的一个例子。
它被称作监督学习是因为对于每个数据来说,我们给出了“正确的答案”,即告诉我们:根据我们的数据来说,房子实际的价格是多少,更具体来说,这是一个回归问题。回归一词指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格,同时,还有另一种最常见的监督学习方式,叫做分类问题,当我们想要预测离散的输出值,例如,我们正在寻找癌症肿瘤,并想要确定肿瘤是良性的还是恶性的,这就是0/1离散输出的问题。
以之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示:
我们将要用来描述这个回归问题的标记如下:
这就是一个监督学习算法的工作方式,我们可以看到这里有我们的训练集里的房屋大小和价格,我们把它喂给我们的学习算法,学习算法工作然后输出一个函数,通常表示为小写 h 表示。h 代表hypothesis(假设),h 表示一个函数,输入是房屋尺寸大小,就像你朋友想出售的房屋,因此 h 根据输入的 x 值来得出 y 值,y 值对应房子的价格 因此,h 是一个从x 到 y 的函数映射。
那么,对于我们的房价预测问题,我们该如何表达 h ?一种可能的表达方式为:,因为只含有一个特征/输入变量,因此这样的问题叫单变量线性回归问题。
在线性回归中我们有一个像这样的训练集,m代表了训练样本的数量,比如 m = 47。而我们的假设函数,也就是用来进行预测的函数,是这样的线性函数形式:
接下来我们会引入一些术语我们现在要做的便是为我们的模型选择合适的参数(parameters)和 ,在房价问题这个例子中便是直线的斜率和在y 轴上的截距。
我们选择的参数决定了我们得到的直线相对于我们的训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模误差(modeling error)。
我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数。 即使得代价函数 最小。们绘制一个等高线图,三个坐标分别为和和
则可以看出在三维空间中存在一个使得最小的点。
代价函数也被称作平方误差函数,有时也被称为平方误差代价函数。我们之所以要求出误差的平方和,是因为平方误差代价函数,对于大多数问题,特别是回归问题,都是一个合理的选择。还有其他的代价函数也能很好地发挥作用,但是平方误差代价函数可能是解决回归问题最常用的手段了。也许这个函数有点抽象,可能你仍然不知道它的内涵,在接下来的内容里,我将更进一步解释代价函数的工作原理,并尝试更直观地解释它在计算什么,以及我们使用它的目的。
下图中左边是前面讲述的假设函数以及代价函数的表达式,目标是获得最小的代价。右边是简化后的表达式,即取=0。
紧接着取=0后,下面这幅图中,我们每固定一个,针对每次的输入变量x,都能得到一个确切的y值,然后按照代价函数的公式就可以计算出,可以在右图中看出当=1时,最小。
这节的内容和初中学的地理等高线有关联,如果忘记了也没有关系,那就放弃吧(bushi)。前面我提到过,可以看出在三维空间中存在一个使得最小的点。
右图就是一个等高线图,悄悄告诉你,位于同一等高线上的点值相同
通过这些图形,我希望大家能更好地理解代价函数 J所表达的值是什么样的,当然,我们真正需要的是一种有效的算法,我也不希望编个程序把这些点画出来,然后人工的方法来读出这些点的数值,这很明显不是一个好办法。我们会遇到更复杂、更高维度、更多参数的情况,而这些情况是很难画出图的,因此更无法将其可视化,因此我们真正需要的是编写程序来找出这些最小化代价函数和的值,在下一节内容中,我将介绍一种算法,能够自动地找出能使代价函数J最小化的参数和的值。
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数的最小值。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
想象一下你正站立在你想象的这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山。然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
批量梯度下降(batch gradient descent)算法的公式为:
其中α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数,注意这里是同时!(原因我没深入了解,只知道这样的结果更准确)
本节我们更深入研究一下,更直观地感受一下梯度算法是做什么的,以及梯度下降算法的更新过程有什么意义。梯度下降算法如下图:
描述:对赋值,使得按梯度下降最快方向进行,一直迭代下去,最终得到局部最小值。其中α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。
上图那条红色的直线,刚好与函数相切于一点,现在这条线有一个正斜率,也就是说它有正导数,因此我得到的更新后的的等于原来的减去一个正数乘以α。这就是梯度下降法的更新规则:
让我们来看看如果α太小或α太大会出现什么情况:
如果α太小了,即学习率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,它会需要很多步才能到达全局最低点。
如果α太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果α太大,它会导致无法收敛,甚至发散。
现在,我有一个问题,如果我们预先把放在一个局部的最低点,你认为下一步梯度下降法会怎样工作?
假设你将初始化在局部最低点,结果是局部最低点的导数将等于零,因为它是那条切线的斜率。这意味着你已经在局部最低点,它使得不再改变,也就是新的等于原来的,因此,如果你的参数已经处于局部最低点,那么梯度下降法更新其实什么都没做,它不会改变参数的值。这也解释了为什么即使学习速率α保持不变时,梯度下降也可以收敛到局部最低点。
我们来看一个例子,这是代价函数。
我想找到它的最小值,首先初始化梯度下降算法,在那个品红色的点初始化,你会发现这个点的导数是相当陡的,如果我更新一步梯度下降,也许它会带我到这个绿色的点,随着我接近最低点,我的导数越来越接近零,所以梯度下降一步后,新的导数会变小一点点。所以随着梯度下降法的运行,你移动的幅度会自动变得越来越小,直到最终移动幅度非常小,你会发现,已经收敛到局部极小值。
回顾一下,在梯度下降法中,当我们接近局部最低点时,梯度下降法会自动采取更小的幅度,这是因为当我们接近局部最低点时,很显然在局部最低时导数等于零,所以当我们接近局部最低时,导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度,这就是梯度下降的做法,所以实际上没有必要再另外减小a。这就是梯度下降算法,你可以用它来最小化任何代价函数J,不只是线性回归中的代价函数J。在接下来的内容中,我们要用代价函数J,回到它的本质--线性回归中的代价函数。也就是我们前面得出的平方误差函数,结合梯度下降法,以及平方代价函数,我们会得出第一个机器学习算法,即线性回归算法。
在之前的小节中我们谈到梯度下降是很常用的算法,在这一小节中,我们要将梯度下降和代价函数结合,并将其应用于具体的拟合直线的线性回归算法里。梯度下降算法和线性回归算法比较如图:
对我们之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数,就是高数里的求偏导
则将算法改写成:
我们刚刚使用的算法,有时也称为批量梯度下降。实际上,在机器学习中,通常不太会给算法起名字,但这个名字“批量梯度下降”,指的是在梯度下降的每一步中,我们都用到了所有的训练样本,在计算偏导数时,我们需要进行求和运算。因此,批量梯度下降法这个名字说明了我们需要考虑所有这一批训练样本,而事实上,有时也有其他类型的梯度下降法,不是这种批量型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。在后面的内容中,我也将介绍这些方法。但就目前而言,应用刚刚学到的算法,你应该已经掌握了批量梯度算法,并且能把它应用到线性回归中了,这就是用于线性回归的梯度下降法。
如果你之前学过线性代数,有些同学之前可能已经学过高等线性代数,你应该知道有一种计算代价函数J最小值的数值解法,不需要梯度下降这种迭代算法。在后面的课程中,我们也会谈到这个方法,它可以在不需要多步梯度下降的情况下,也能解出代价函数J的最小值,这是另一种称为正规方程(normal equations)的方法。实际上在数据量较大的情况下,梯度下降法比正规方程要更适用一些。
现在我们已经掌握了梯度下降,我们可以在不同的环境中使用梯度下降法,我们还将在不同的机器学习问题中大量地使用它。所以,祝贺大家成功学会第一个机器学习算法。
后续的内容要用到线代的一些知识,比如说:矩阵的逆、转置、乘法,大家可以稍微复习一下 。