嗨,好久没写东西,罪过罪过。因为发了工资后,一顿疯狂输出(消费)没时间写东西,现在又破产了,等着下周发工资。 ^.&
今天是打算把之前学习的关于Linear Regression(线性回归)的内容进行一个大致的总结。
首先,Linear Regression是什么呢? (已经理解含义的可以忽略这段)
这个问题我们要回到对于机器学习的问题归类进行解释。
Supervised & Unsupervised Learning(监督学习和非监督学习)
机器学习分为两种模式,一是supervised learning, 另一种是unsupervised learning。从英文字面猜测已经很明显,那就是一个是有人监督的(supervised), 另一种是没有人监督的咯(unsupervised)。 这解释是不是很无力,没错,我也这么认为的。
那么好,我来介绍一下supervised learning。
supervised learning,中文叫做监督学习,这里的监督实际上是指用来训练的数据是有输出的,也就是说,当x为输入,y为输出值的时候,那么用来训练的数据的结构就应该是类似(x1, y1; x2, y2; x3, y3; ... ...)每一组数据都必须包涵输入x和所对应的输出y。这是我个人感觉最直观的一个特征了。
那么unsupervised learning,非监督学习,很直接,那么就是在没有输出y,只有输入x。
再学术一点呢,就是说supervised的训练数据的例子是被标签过的(labeled),unsupervised是没有的。具体的例子呢,我给个比较经典的。
收到的邮件作为一个例子(ng在linear regression多次以邮件为例,连到了第四周的神经网络,他还在拿邮件举例子 -。-),那么x就是邮件的特征,y就是是否邮件属于骚扰邮件。这里的y就是"是否属于骚扰邮件"这个陈述了。那么对于这么一组数据进行训练,那就是supervised learning。如果只是给一堆邮件,而没有一个y来表示这个邮件是不是垃圾邮件,要让机器通过算法去甄别,比如cluster,这就是unsupervised,至于具体的,怎么做到的,我还没学到那里,无法解答。
好吧。以上就是supervised和unsupervised的解释。
什么是linear Regression呢?
Linear Regression呢就是supervised learning的一种训练算法,另一种是classification(分类),这一种以后我也会写一篇总结,一步一步来哈。
Regression的中文叫做回归,虽然我也还是不太清楚为什么是回归这个词,相当抽象的一个词吧。regression是有return的含义,但是这里更多是指它在统计学里的含义。那段解释也很抽象,总体来说就是通过一组xy的队列来预测一个新的x它所产生的y的位置并且找出他们之间的关系。这句话我也是我自己的理解了,也很抽象。举个例子呢。
比如,我过去一个月30天里,每天早上出门都踩到了狗屎,这里就有30组(x,y); x是我早上出门,y是踩到狗屎。那么我可以预测,今天早上也会踩到狗屎。并且这里的关系就是早上出门=踩到狗屎。
线性回归能做什么?
作用就是预测咯,笨蛋。
好吧,容我调皮一下。
线性回归是一个通过训练找出一组theta(Θ)值的过程。
然后用这组theta(Θ)值的矩阵的transpose乘以需要预测的输入x特征的矩阵,得到的一个值,就是预测的值。
wait wait ... ...
什么是theta值的矩阵的transpose,还有x特征的矩阵是什么?
好吧,这就可以展示我这几周数学学习的成果了!
我呸。自己去翻书去。 不然越扯越远了。
其实上述是我对linear regression对于多特征算法的一个总结,当然这也适用于单特征,也就是只有一个x的情况。多特征,我们以后会提到, 一步一步来,今天先说单特征。
首先我列出线性回归预测时需要用到的公式。
y = Θ0 * x0 + Θ1 * x1 (这里的0, 1 是substitute)
这么简单? 是的,就是这么简单,但是吧。。。(我知道凡是句子后边接但是,读者都会虎躯一震,但是吧我喜欢。)
但是吧,这里的Θ0和Θ1可是需要一个繁琐的过程求出来的,其实也不繁琐,几行代码就搞定了,呵呵。
Hypothesis Function(假设函数)
上面那个就是假设函数了。
比较官方的公式是这个。
当然x0永远是1,所以这里是可以省略的。
至于为什么,方便计算吧。
那么好,怎么计算Θ0和Θ1呢?
好了,我们开始dive in了,抱好你的氧气瓶,别淹死了。
这个函数叫做cost function,中文叫损耗函数,消耗函数,反正很多种叫法。
为什么叫cost function呢,那了,那么我们来解释一下这个"b"是干嘛的,以后我们还会遇到n多次这个"b"。请允许我爆个粗口,因为曾被他折腾了半死,我相信,你们也会的。屏住呼吸。
Cost Function(消耗函数)
从数学的公式上看,从那个sum后边的一串里,我们可以发现,hΘ就是我们上面提到的假设函数,假设函数是啥?就是Θ0 + Θ1*x,这里的x是训练数据中的x,superstitude就是那个i代表的就是index,读过微积分的应该都看得懂。看不懂的,抱好你的氧气瓶,然后飘回去翻书,谢谢。这里的假设函数的输出代表的是什么?他是一个带入初始Θ0和Θ1和x(这里的x是已知,存在于训练数据中)计算后得到的值。你没听错,刚开始我们需要拿出一对预设的Θ0和Θ1,当然这不是我们最终需要的那对。为什么? 来不及解释,水流太急了。之后你会明白的,总之需要预设就对了。
假设函数与对应的y的差是什么鬼?
好的,我无法直接用言语表达,因为。。。你也看不懂。
上个图。
该图来自ng的机器学习课,第一周的mode and cost function的第二节。好对了,还没介绍ng,他是... 自行google谢谢。不想google的,那么,我告诉你,他是一个很牛的人,在这个领域,嗯,很牛的。
从图上,我们可以看到,当预设的Θ0和Θ1的值为上述分别情况时,所对应的直线。但是,每个x对应的y的真实结果并不是一定在线上的呀。 没错。所以,我们训练的任务就是要通过一个算法来找出一条直线,一个最合适的直线,一条,每个真实y到这条直线上的距离的总和是最小的,因为要照顾到每组数据啊,是吧,你总不能差别对待吧,不然会有xy闹情绪吧。
这里的所谓"这条直线上的x对应的y的值",也就是我们的假设函数的解(不是后边个y哦,那个是真实的y,存在于训练数据里),到真实的y的值就是这个距离。平方是什么意思呢? 意思很简单,距离啊,不能出现负数吧,给他个平方再开根呗。那为什么它不开根? 不需要啊,因为找最小的总和,我们是来找这条线的,又不是求距离的,所以没必要。你不平方或者开平方根回去,这个值是所有里最小的,你平方, 它还是最小的呀。还是不理解的,慢慢捉摸,也许到后边你就理解了。
好,那么sum是什么鬼,这就是所有距离的平方的总和,我们就是需要找到这个值得最小值。很清楚吧。
m是什么?m就是训练数据的队列长度。除以m就是算出平均值。看不懂的,问问你读小学的儿子,或者邻居表哥家上小学的女儿。
那那个2呢? 好的,那个2是方便之后求导的计算,就是derivative,因为它后边有个平方。这里先不管他,因为它跟上面讨论开不开平方根的情况一样,并不影响我们跟Θ们玩躲猫猫的小游戏。
那么。我们怎么去找到Θ们呢?
我需要引出一个算法,叫做gradient descent,梯度下降。
啥意思?
就是那个躲猫猫游戏的公式了。
Gradient Descent(梯度下降)
图来自ng的第一周的课parameter learning的第一节。
这是一个三维坐标图。没见过吧,炫不炫,吊不吊?第一次见他我也吓尿了。
那么好,Θ0和Θ1就是我们需要找到的一对双胞胎(虽然他们长得很丑,远没有1 和 2那么整洁干净,但至少他们都有Θ)。
红圈圈住的就是我们预设的Θ0和Θ1所构成的二维图的坐标位置,运用你的想象力,从图的上方往下看看。当然,它也可以出现在那个五颜六色的凹凸物的任何位置,也可能是最低点,就是红色箭头的位置(虽然这里有两个红色箭头,这里是关于局部最优解和全局最优解的问题,不在这偏文章的讨论范围中。我们假设所有的J(Θ0,Θ1)都是抛物线,也就是局部最优解即是全局最优解的情况)。但是你要有那么有好的判断力和运气,随便就选到最低点,那么你就不需要这一些列的过程了,请把你的氧气瓶给别人,因为你不需要,你已经成仙了。
所以,大多数情况,你是不会一次就选中最低点,而且你也需要这个训练过程去证明你的初始Θ就是你要找的那个。是吧。
言归正传,让你的这个点,通过那条黑色的线,一点点挪到最低点的位置。这个过程我们称为梯度下降。
这个图也来自ng的paramerter learning,但是是最后一节。
这两个公式怎么来的?额,这里面有一个推导的过程,具体步骤我也po一张图。上面两条公式其实可以归纳为一条。这我感觉是一个很关键的点,如果你不在乎这些推导的过程个,那你可以忽略,记住这一条公式即可,记不住也可以google。但是如果你是一个跟我一样想追根究底的人,那么follow me。
这里的j代表Θ队列里的值的index。所以,得到的是这么一个表达式。而这个表达式就是我们的消耗函数里sum后边的东西的导数。
因为,我们之前在解释假设函数就说过,x0是永远等于1的。所以,在我们计算的过程中,必须先给x队列前插入一个1. 所以在上面Θ0更新的函数中后边应该再加一个x0才完整。
求导结果就是上图的解
这个推导的结果实际上给了我们一条对于那个五颜六色的凹凸物的图的从侧看的弧线的一个切线。不理解的,翻翻你大学的微积分关于求导的内容。
我给张图
只看图,右边的内容不要理会先。这个切线就是我们求导后的表达式。Θ0和Θ1的图都一样的。
到最低点是个什么情况呢? 这个导数的值会是0,会是0,会是0。 重要的事情说三遍。
所以,我们的任务就是,让这个点不停得梯度下降,下降,直到导数的值是0.所以,我们需要这个导数。
好,我们回到梯度下降的公式。
下面是归纳后的函数。
这里的α是什么? 这个叫做learning rate,学习率。这是一个自己设定的值,一般是0.01,你也可以设成0.1.它的作用,回到那个五颜六色的三维凹凸物的图,α的作用就是控制你的点下降所挪动的距离的大小。α太大不行,太小也不好。为什么呢?那能不能大家定一个恒定呢?也不行,它的选择是根据你训练数据的长度和内容决定的。那么我就来解释下,太大和太小会造成的影响。
先抛张图,该图来自第一周parameter learning的第二节
首先α太小了,看得懂英文的,可以读上面的,也就是说,这个挪的过程,会很缓慢。大家都知道,机器学习为什么几十年前就有的研究,直到现在又被挖出来啃吗? 因为摩斯定理,硬件的发展得到了质的飞跃,从前太慢了。就算如此,要想训练的速度达到理想状态,也需要用昂贵的显卡来进行计算。所以,之前Geforce因为私自修改使用协议,不再允许云服务商使用该系列的显卡,就仗着他们有开发最全面的API,这个话题才在reddit上被吵翻天了吧,NVidia的做法也被业界嗤之以鼻,机器学习的工业发展或许也会短时间抑制,而那些用amazon cloud作为部署工具的教程和书籍都要重修了吧。容我说一句mmp。
所以,太小了,不行,因为太慢,如果你发现这个训练的过程太久了,那么请注意,也许你选了个过小的α,是时候换个大的来一发回车,满足它吧!!!
那么太大了呢? 如上图的下方图所示,它就会跑过头。然后就跑出去了。这肯定不是你想要的结果。所以,不是大就是好的,合适才最重要,那寻找合适的α的过程就需要不断地尝试和实践了。
哈哈哈哈哈
好了。回到梯度下降公式。:=是什么意思? 其实就是=的意思,编程里就是定义赋值的意思。
Θj = Θj - α*乱七八糟的后边一串。这里就是旧的Θ减去你算出的需要挪的距离,得到的新的值赋予Θ。
最终得到最小的那个点,也就是那个五颜六色的凹凸物的图中的最小的凹点的位置。所对应的Θ0和Θ1就是你需要的结果了。
piece of cake? 是的,就是这么easy。
那么,单特征的线性回归就先总结到这。
运用上面的一系列公式,你已经可以实现线性回归来完成这一类的工作的理论基础。
但是我们还有一些技巧来辅助找到这条线,比如feature scaling。
还有另一种便捷了n个维度的函数解决上述问题,但是它不是万能的(至少gradient descent是万能的),叫做normal equation。
之后还会总结多特征。复杂度会上升一个维度。
不要丢了你的氧气瓶,我们还要下潜。
Later
网友评论