前段时间放假在家的时候,总算是看完了斯坦福的机器学习公开课(Andrew NG)的监督学习,这项计划持续了将近一个学期。无监督学习和强化学习部分暂时还不太想看,目前来说监督学习与我现在的情况更契合一些。看完监督学习部分,对机器学习的了解又深了一些,加上之前帮师兄做实验,从工程角度和理论角度共同推进,感觉还是挺好的。
为了巩固学习成果,在刷题之余,准备写一系列笔记,自己推导一遍机器学习里比较重要的几个算法,并附上自己的理解。我一直认为能讲出来的东西,才是自己的。写笔记有助于我自己理清思路,当然也希望对后来人能有所帮助。
准备细致推导的主要有以下几个算法,争取在9月开学前完成:
1.梯度下降
2.Logistic Regression
3.Naive Bayes
4.SVM
5.学习理论
==================================
1.机器学习的任务
机器学习的任务是比较明确的,我的理解是:通过一些算法(模型),去挖掘出数据中的潜在规律(特征),并能对未知数据进行合理的推测(预测)。举一个简单的例子来说明这个问题。
一个在美国波特兰的房主想卖掉自己的房子,他不知道他的房子能值多少钱。他找到了一些房屋交易数据,想做一下参考。数据如下
这里主要有房屋面积大小和售价的关系,发现符合我的直觉:房子越大,卖的越贵。但事实真的是这样吗?我们以面积大小为X轴,售价为Y轴,将这些数据画出来,如下图
嗯,基本符合我们的预期,房屋的售价与面积大小是成正相关的。以上的这个过程都很make sense,其实我们在不经意间遵循了一个流程,如下图:
图中,Trainging Set是数据集的意思,就是这个美国人找的的之前房屋交易的数据(房屋面积-售价)。Learning algorithm就是学习的过程,他通过直观推理和画图的方式,得出了“面积越大,售价越高”的市场价格规律,就是那个h,即hypothsis。然后他量了一下自己的房屋面积x,根据得到的市场规律,去预估自己的房子值多少钱,就是最后的那个y。于是,一个机器学习的问题就产生了。
现在我们回过头来,还看这个房屋面积和售价的例子,参照我个人对机器学习的理解:通过一些算法(模型),去挖掘出数据中的潜在规律(特征),并能对未知数据进行合理的推测(预测)。这里其实是包含两个步骤的:
步骤1:根据已有的房屋交易数据,去获得一个市场价格规律;
步骤2:根据这个市场价格规律,和自己房屋的面积,来预测自己的房屋价值。
这两个步骤就是一个机器学习问题的一般步骤,我们接着往下看。
2.Linear Regression线性回归
可是我们都知道,一个房子的售价并不仅仅受面积大小影响,像卧室数量、地理位置、采光、车库、新房还是二手房等等这些因素都会左右售价。那么我们这里再考虑进一个简单的因素:卧室数量。还是老样子,先拿到一些数据:
然后该画图找规律了,但是我们发现这里的图不太好画,因为这是三维的,画出的是立体的,并不直观。那这样的数据怎样分析比较好呢?我们可以用数学的方法。在二维情况下(房屋面积-售价),我们得到的市场价格规律是正相关的。这里加了一个新特征(卧室数量),我们直观上理解,应该也是卧室数量越多,售价越高,也是正相关。这样一来,房屋面积和卧室数量,这二者和房价的关系应该也是正相关的,因为现实情况就是这样,三室两厅的房子就是比一室一厅的要贵。
为了简化问题,我们暂且用线性关系来表示这个正相关,即房屋面积、卧室数量与房价之间的关系是线性的。在数学上如何来定义这个问题呢?
我们学过,一条直线可以用f(x)=ax+b来表示,这里我们采取同样的办法,用下式来表示房价:
可以认为就是那个的ax,就是那个b,而就是房价。x1是第一个特征,即房屋大小;x2是第二个特征,即卧室数量。这里的变量有三个,是theta, theta1和theta2。这里我们发现没有x0,那就假设x0为1,可以将上面公式整理成下面的样子:
,这里theta和x都是一个矩阵。
我们上面说了,机器学习有两个步骤。具体到这个公式里,两个步骤做了以下工作:
步骤一,是通过数据(x)学习规律(theta),得到f(x)=ax+b中的a和b,假设a=2,b=3,f(x)=2x+3。
步骤二,自己房屋面积x=150,那么售价的预测值就是f(150)=2*150+3=330。
在这个例子中,我们主要阐述了机器学习的两个常规步骤,即模型学习和结果预测。至于线性回归,我个人的理解是:特征值与结果间的关系是线性的,以此线性模型来进行预测,达到的效果是使得预测值与真实值尽可能的接近。当然越接近,说明我们的预测越准确,我们的模型效果越好。
那么问题来了,如何让我们预测的准确呢?其实从公式中我们就可以知道,我们所说的模型,具体而言就是theta值。如何让theta值更准,就是我们下一步的主要工作。
3.Least Mean Square 最小均方法
如何在数学上定义”预测的准“这样的说法?当然是预测值和真实值之间的差别了,即误差=|真实值-预测值|。但是实际情况中,我们并不这样简单粗暴的用差值来表示误差,往往会加以包装,主要是为了方便后续的计算,在这里我们用最小均方法来定义误差:
,让我们来仔细看这个公式。表示的就是第i个训练数据的真实值与预测值的误差,加个平方是消除正负,前面加个1/2是为了方便计算。从1到m加和后,表示的就是整个数据集的误差。我们要使这个值最小(LSE的目的),就说明在整个数据集上,我们对每一个的数据预测都挺准,换句话说,我们的模型就很好。
那么好了,我们的目的就是选择合适的theta,让J(theta)最小,那么要采用什么方法呢?这就是今天我主要想记录的重点——梯度下降。
4.Gradient Descent 梯度下降
我先说一个场景吧,有助于我们理解梯度下降。我们在开车的时候,根据路况,心里都会有一个觉得合适的速度。如果比这个速度慢,我们就会踩油门提速,慢的越多,油门踩的越深;如果有点快,就会踩刹车或者遛一会儿让车速降下来。
在这里,如果我们说心中合适的速度是真实值,而实际的速度是预测值,二者相差的多少就是误差。当误差越大,我们的油门猜的就越深,车就能尽快的到达我们心中那个合适的速度。这就是一个梯度上升的例子:当误差较大的时候,参数theta要产生巨大的变化,使得预测值的输出改变较多,从而减小误差;当误差较小的时候,参数theta要保证微调,使得预测值更加接近真实值。
以上所述就是梯度下降/上升的原理,公式如下:
能看明白吗?我们主要看偏微分那部分。J(theta)是误差,对它求偏微分,得到的就是当前车速和心中理想车速差的有多大,是斜率。alpha是步长,可以理解为踩油门的单位长度。举例来说,alpha步长是1厘米,即每次踩1厘米,而偏微分得到的值为10,还需要再往下踩10个1厘米。再来看减号左边的theta(j),它表示的是当前的油门深度,假设为5。5+10=15,即我们的theta要从5变成15,油门要踩的更深些,才能让车速更快些,让误差更小些。这样一来,我们就更新了一次theta。
Ok理解了吗?公式是梯度下降的公式,是减号。而我说的场景是梯度上升,是加号,即往下再踩油门,让速度提升,尽快减小当前车速与我预期车速的差距。
好的理解了梯度的思路以后,我们就明白可以通过梯度下降的方法,去更新theta值,从而优化模型,提高准确率。这里我们可以看到,更新theta的源泉是误差,是预测值与实际值的误差。这里我们相当于是拿实际值作为参考,不断的来修正模型,这叫做监督学习。监督就体现在,“我知道正确的答案(实际值),你现在模型的输出(预测值)不对,还差得远,需要再修改,回去改去吧。”那么无监督学习是什么样子呢?就是“本身没有正确答案,我也不知道对不对。只要你尽力按照你的思路做了,那么你觉得对就对。”强化学习,我也了解的不太多,是另一种形式的监督学习,做的好了给奖励,做的不好打脸,应该比梯度方法更新参数更狠一些吧,不懂我也就不乱说。
好了,算是把梯度的方法给说清楚了,那么开始推导几种形式吧。公式总是不好看的,把他分的细一点,带入J(theta),会成什么样子呢?
首先我们先考虑最简单的场景,即只有一个训练数据(x,y),那么就变成一下样子
,这个推导过程不多说了,很清楚。有意思的是我们要关注最后结果,alpha*误差*训练输入值xj,就是xj对应的theta(j),就是油门应该再往下踩多深。这样一来,一切都是已知的了,是不是很爽。
当然啦,我们的数据怎么可能有一个呢,当然有很多行x和y啦,那就这样:
,有问题吗?可能不太好理解这里的xj(i)。这里x(i)是第i行数据的意思,其中这行数据中有x1,x2..xn个特征。第j个特征,就是xj(i)。ok啦?那为啥theta(j)不是thetaj(i)呢?让我们来看看thetaj是什么,theta是特征值的权重,就是通过很多数据来训练一个theta,使得这个theta尽可能满足所有训练数据的需求,让整体的误差最小。
我们可以看到,决定theta大小的主要有两个因素。一个是步长alpha,一个是误差。当误差越来越小的时候,梯度(偏微分,或者叫斜率)就越来越小,这样需要往下踩油门的深度也就越来越小,所带来的速度改变也越来越小,几乎达到我们心里的速度。这样,我们就叫算法收敛了,即达到了我们想要的速度,也就是说误差最小,我们的模型训练成功了。
这种梯度下降叫做批梯度下降Batch Gradient Descend,批的意思就是所有数据。
不知道有没有发现一个问题,就是我们用BSD时,需要遍历全部的数据,才能得到一组theta值。这样的结果当然是最准的,但是效率很低,当训练数据特别大时,可能好久也出不来结果。所以我们又给出了一个改进算法,叫随机梯度下降Stochastic gradient descent。
这是什么意思呢,我们可以看出,循环内是单个(x,y)的公式,这个过程进行了m次。也就是说,每一次迭代,都会产生一组theta,而不像BGD那样,便利完所有的数据,才能有一组theta。这样的好处是如果发现算法收敛了,就可以退出了,大大节省了时间。但是精度可能会稍微差一些,但从实际效果来看,效果也蛮好的。
OK总结一下。我今天先是理了理机器学习的任务:算法、挖掘和预测;以及机器学习的步骤:找参数、做预测;然后就是如何去评估一个算法的好坏:LMS与误差;以及如何改进一个模型:梯度方法。
还是有必要写出来的,像写梯度的时候,那个油门的例子是我现想的,觉得挺有意思。写完之后我也纠正了自己许多认识,比如我也没想过theta(j)为啥不是thetaj(i),自己再想一下,嗯是呀,那是权重嘛,要学的就是这个嘛,只不过通过大量数据去学这一组参数就是了。一天有点成果,总是很开心的。面包加油喽~~