机器学习基石笔记(一)
台大林轩田老师在coursera上的两门machine learning的课非常的赞,之前入门的时候看了一遍,最近又把基石拿出来回顾了一遍,顺便写点笔记,有些东西确实不记下来就会忘。
基石和技法这两门课程是前后应承的关系,我个人觉得他们都很对得起课程的名字,基石偏重于学习理论的讲解,PAC 正则之类的,它不是告诉你怎么做,而是告诉你为什么能这么做,机器学习为什么能work,我觉得这是每个做ML的人都应该取了解和知道的。
整个课程分为四个部分:1、什么时候机器可以学习 2、为什么机器可以学习
3、机器怎么去学习 4、机器如何去做到更好的学习
一、When Can Machines Learn?
Machine learning这几年很火,但我觉得很多人还是太过注重应用,这样可能最后也就是个调包侠,没什么意思,所以我们至少得要知道,什么是机器学习?
这里给的定义是:improving some performance measure with experience computed from data,我觉得这句话说的很好的,翻译起来反而味道变了(翻译能力太渣!),那为什么我们需要用机器学习去做东西而不是直接编程呢?因为有些东西不是说你编程就能实现的,例如图像识别,一只猫有很多姿势,很多颜色,很多种类,这不是if else就能解决的事情,你只有把握到最核心的东西,才能让机器告诉你,这是不是一只猫,如何定义特征以及如何用特征建模,都是我们通过machine learning做的工作。
上面是机器学习的简单的模型架构,这个后面还会有一些改进。这里有一个假设我们的数据D是由一个我们不知道的目标函数f生成的,然后我们通过学习算法A在htpotheses H中学习到一个新的函数g,这个新的函数g近似等于f。解释一下:
1、为什么要假设数据是由f生成的?因为如果不是这样,就没有学习的必要了,如果数据本身就是杂乱无章没有意义的,有什么可以学习的呢?
2、g和f的关系? 首先明确一点,f是一个我们永远都不会见到的东西,因为如果你有了f,那么就上面都不用做了,就好像你已经得到了每天彩票的走势图一样,所以我们通过算法A获得g来近似f,他们能有多相似,取决于数据集D也取决于算法A。
3、H是什么? H是A中能学习到的所有函数集合,一般就叫hypothesis set,直观上的理解就是,如果你的算法A是线性的算法(说法不准确),那么你的H就是所有超平面的集合(2维中的线,3维中的面),你不可能去学习到一个曲线或者曲面的函数。
4、X,Y是什么? X是数据的输入,Y是每个数据对应的标签,还是用图像来理解,X就是你输入的每张图,Y是每张图的label,说明它们属于哪一类。
接下里介绍一个历史久远,但是历久弥香的一个算法:PLA,perceptron learning algorithm(感知机算法),这是一个非常非常简单的算法,如下图所示:
详细解释太麻烦了,看懂hx就行了,其实在二维平面就是一条直线,上面的是一类,下面的是一类。这种一般被称为linear classifiers,线性分类器。
PLA算法的具体步骤如下所示:
直观解释:1、首先是从所有的w都为零开始运行程序
2、用现有的w去运算得到每个点的y,如果发生错误,就把w更新
3、循环2直到所有的点都分类正确了
注意点: 1、显然我们发现PLA只能在linear separability(线性可分)的数据集上跑,一旦数据集不是线性可分的......
2、PLA最后一定能跑出结果么?这个待会会证明的,PLA算法是收敛的
3、
本来准备证明一下PLA的收敛性的,后来想想没必要,我觉得清楚为什么要这么证可能更重要吧。这里他用到两个关键的东西:
最后得到收敛次数的上界是R2/p2。整个证明的核心是因为每次w的更新都会有一些变换,通过累计把它们放在一起就会得到关于次数k的一个不等式,接下来的工作就是一个数学问题了。
残留问题:万一数据真的不可分怎么办(噪声影响或者确实不可分)?
最好的解决方法当然就是不用PLA了...如果一定有用就是用POCKET 算法,就是每次我们跑一下PLA跑一段时间得到一个结果,算出它的准确率,然后再重新初始化重新跑,和之前的结果比较,留下好的那个,这样就会最终得到还不错的解,但这个方法很tricky,我觉得....
下面稍微跑一下题,讲一下每个machine learning 算法的区别在哪里:
1、输出空间y的不同,可能是binary classification,multiclass classification,regression或者 structured learning(自己按需要设计的输出结构)等等
2、label y的不同,分为监督学习,非监督学习,半监督学习,半监督学习,增强学习
3、输入X的不同,分为batch,online和active,就是批量的输入数据,在线的拿数据,以及主动的要数据..
4、特征的选择,这个是特征工程方面的话题,就是选择特征的问题..比如一幅图片的话我们既可以用原始的特征,把所有的像素点输入进去,也可以做一些变化,输入一些边缘啊颜色之类的特征
接下来引入一个关键的话题,机器学习真的work么?
答案应该是NO,当然这样说也不准确,我们知道一个有名的结论“没有免费的午餐”,就是其实你怎么做都没区别...但实际上呢,你的数据集本身是有偏好的,所以,实际上我们的工作还是有意义的。
我们先明确一下我们做了什么,我们从数据集D中学习,这个数据集D其实是来源于一个更大的甚至于无限的数据集Q中,我们通过在D中学习的函数去预测更大的数据集Q中的事情,这事顶起来确实有点不靠谱,所以我们有了Hoeffding不等式来作为理论保证,下面的v和u可以理解为算法A运行后在D和Q中的正确率。
后面的问题,林老师就说的有些复杂了,简单的说最后对我们有用的就是下图:
很好理解,如果我们的数据集D里面的数据很多,也就是N很大,我们最终在训练集上得到的误差就近似于原数据集Q中的误差,这样就可以很好的度量你算法的好坏。
当然Ein=Eout只是我们需要的一个目标,如果Ein过大,这说明我们的算法很差..所以最终我们想要的是Ein接近于Eout,且Ein很小。
然而上面的只是针对一个h而言的,我们的算法大多是在假设空间H中的,所以我们需要对自己的假设进行衍生,这里先假设H空间是有限的,就得到了下图:
有了上面的公式,我们大概就可以得到一个结论:如果H是有限的,N足够大,那么我们的Eout是近似等于Ein的,如果算法A正好知道一个Ein约等于0,那么PAC理论就会为我们保证,你的算法work了!
总结
ok,第一部分写完了,讲真照着PPT写笔记感觉不太好,下面希望有所改善吧..