目录
一.Machine Learning概念
简单在知乎上搜了一下机器学习的学习方法,然后就开始看吴恩达老师的课程了。
机器学习基于学习方式可以分为三类:
- 有监督学习
监督学习就是有标签的,监督学习主要做两类工作,分别是回归和分类,回归的例子,比如房价预测,最后从大量散点里回归出一条函数曲线,然后再有输入就可以用这个函数来给出一个预测输出,回归问题的输出可能是无限的;而分类就比较符合字眼的意思,比如把猫狗的图片分成两类,再比如检测乳腺癌片子,是良性还是恶性,分类问题的输出是有限的。学习结果为函数。 - 无监督学习
有监督学习有输入x和标签y,而无监督学习有输入x但是没有标签y,学习结果为类别。主要有以下几类:
聚类算法:没有标签的数据并尝试将它们自动分组到集群中,即算法在没有标签的前提下自己去发现数据中的不同的结构,自己进行分类。比如新闻网站每天的热点新闻中的一些关键词可能每天都有变化,这就能用到无监督学习,比如很多条新闻中都有“大熊猫跳舞”这个字眼,那么算法可能就会将这些新闻分为一类。又如根据客户一些个人信息将客户分为不同类别。除了聚类算法之外,还有异常检测和降维这两大类的工作。 - 强化学习
强化学习就是学习”做什么才能使得数值化的收益信号最大化”.学习者不会被告知应该采取什么动作,而是必须自己通过尝试去发现哪些动作会产生最丰厚的收益.试错和延迟收益是强化学习两个最重要最显著的特征。强化学习与有监督学习不同: 有监督学习是从外部监督者提供的带标注训练集中进行学习.每一个样本都是情境和标注的描述, 而强化学习是从交互中学习。
强化学习也与无监督学习不同:无监督学习是一个典型的寻找未标注数据中隐含结构的过程, 强化学习的目标是最大化收益信号而不是找出数据的隐含结构。
二.单(双)变量线性回归模型
1.代价函数
这意味着将一条直线拟合到您的数据中。
以预测房价的例子说一下,上图左侧是房屋大小对应的房屋价格表,右边是定义的一些常用术语,注意右下角那个x和y的右上角的(i)不是次幂,i是几就代表是第几组输入数据。
y-hat是一个估计值,他可能是一个真实值,也可能不是一个真实值;而y是一个训练集中的真实值。
这个模型训练的目的就是确定w和b的值,在此之前,我们先来看看如何衡量这条线(得到的目标函数)与如练数据的拟合程度
需要用到下面的平均误差成本函数(注意除2只是为了让结果更简洁,因为等学到梯度哪里求个偏导正好和分母下来的2约去,不除2这个函数也是平均误差成本函数),这个函数通常用于线性回归
误差当然越小越好,所以咱们现在就想找最小的J
为了找最小的J,咱们为了方便讲解,简化一下模型,暂且扔掉b,使发f(x)=wx
上图左侧是f关于x的函数,右侧是平均误差函数J关于w的函数,因为我们现在想找到使J最小的w是多少。咱们设一组(x,y)是(1,1),(2,2),(3,3),注意是y不是y-hat,即这三组数据是真实值(正确的,显而易见当w=1的时候误差函数最小,即0),训练样例的数量是3,比如现在w=1,那么现在这次训练的误差函数计算就是[(1-1)^2+(2-2)^2+(3-3)^2]/(2*3)=0/6=0,即此时J(w=1)=0,然后下次w=0.5,w=0,w还可以等于其他值(每取一个w都是一次训练,每次都是用x=1,2,3这三个点计算此次训练的误差函数),依次试出对应的J(w)是多少,就可以画出右侧对应的误差函数的图像了,然后找到这个误差函数的最低点对应的w值即为我们要找的w值。
那么如果我们这次不把b置为0,我们现在的平均误差函数对应两个变量w和b的话,那么我们再来看看函数J(w,b)的形状,如下,类似于一个碗状,x和y轴对应于w和b,z轴对应于J。
如果咱们用刀水平切上很多刀,每一刀都可以得到一个椭圆,然后我们就能得到等高线图了。
等高线图上的每一个椭圆上的点对应的J值都相同,即便这些点的w和b的值都不一样。
等高线图越接近中心的椭圆上的点就就越是我们想要的w和b的值。
2.梯度下降
梯度下降背后的思想是:开始时我们随机选择一个参数的组合,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。因为我们的多参数函数可能不是碗状的,所以可能有多个凹点。
想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
梯度下降的实现
上式中的α是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。偏导就不用说了,高数的知识,虽然已经考完研快11个月了,但是还是记得的。
还以咱们之前的房价预测为例,平均误差函数J有两个变量w和b,即左上角那俩公式,注意梯度下降时同时更新,即用旧值更新,看下面的Correct和Incorrect即可明白。
让我们来看看如果太小或太大会出现什么情况:
如果太小了,即我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。
如果太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果太大,它会导致无法收敛,甚至发散。
如果你的参数已经处于局部最低点,那么梯度下降法更新其实什么都没做,它不会改变参数的值,因为局部最低点的倒数为0,所以代入公式之后,更新之后就是新值=旧值-α*0=旧值。这也解释了为什么即使学习速率保持不变时,梯度下降也可以收敛到局部最低点。
看到上图梯度下降的这个过程,从粉色点一直到最后的红点,斜率(导数)是越来越小的,看看公式可以知道w的变化也是越来越小的,因为α*偏导数,α是个固定值,所以后面每一步长其实都是越来越小(但就这个图分析而言)。
梯度下降算法公式中的偏导数推导如下:
通常w和b会被初始化为0。
我们刚刚讲过的算法,有时也称为批量梯度下降。实际上,在机器学习中,通常不太会给算法起名字,但这个名字”批量梯度下降”,指的是在梯度下降的每一步中,我们都用到了所有的训练样本,在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以,在每一个单独的梯度下降中,我们最终都要计算这样一个东西,这个项需要对所有个训练样本求和。因此,批量梯度下降法这个名字说明了我们需要考虑所有这一"批"训练样本,而事实上,有时也有其他类型的梯度下降法,不是这种"批量"型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。
三.搭建实验环境(jupyter notebook)
现在咱们来搭建一个和吴恩达老师的课程一样的实验环境
启动jupyter notebook,下载anaconda时,里面已经集成了,所以咱们直接左键点击,打开即可,至于anaconda和jupyter notebook怎么用,这个直接百度吧,一搜一大堆,我就不细说了。
打开jupyter notebook之后,参考这篇文章,把咱们在github上下载的吴恩达老师课程里的课后实验代码等文件上传到jupyter notebook中,然后直接在jupyter notebook里就可以坐跑跑他给的代码了,至此,实验环境就算搭建完了吧。当然,如果不想把文件放到C盘,也可以先打开anaconda的powershell,然后切到文件所在的路径,再输入jupyter notebook就可以了。
等待jupyter notebook打开之后就可以看到文件了。
我的机器学习进程可能得放缓一段时间了,得先去做服务计算的大作业了(一个微服务系统,呜呜呜,等过一段时间回来再继续更,此系列文章)
对了,吴恩达老师的课件里的代码是用的jupyter notebook写的,但是因为jupyter notebook的每个单元格是独立的,所以在一个单元格里定义的东西,另一个单元格里用不了,所以我们需要把每小块的代码按照从上到下的顺序关系把它们复制到到一个单元格里,这样我们就能运行代码了,很舒服!