回家之后读了两篇文章,第一篇是以前老师推荐的《A Few Useful Things to Know About Machine Learning》,里面介强调了几个机器学习领域一些书上学不到的重要常识,还有一些需要特别注意的地方。

  • Learning = Representation + Evaluation + Optimization
学习 = 表示 + 评价 + 优化,这没什么可说的了。
  • 表示方法确定了你能表示的空间是哪些,取决于你的问题是什么。
  • 而评价函数为你的优化过程提供方向,其实就是一种衡量,衡量你现在的状况:好,有多好;坏,有多坏,而且通常都用你的失真程度来衡量(J(theta) = 预测值 - 实际值)。
  • 优化算法进行优化,目前我还只知道梯度下降还有求导这两种手段,当然优化方法的好坏直接决定了你训练模型的效率,如果你的损失函数J(theta)不是凸的,那么他也将决定你能不能取到最值或者取哪个极值,例如梯度下降就取不到最值,只能取极值。
作者最后还列了张表格,举了常见的表示方法,评价方法,优化方法。
  • It is Generalization that Counts
泛 化才是目标,作者这么说其实就是想地提醒我们别用训练样例做测试,除非特殊情况。因为我们要做的是泛化,也就是想从训练样例中学习到普遍规律,然后使模型 可以用于所有非测试样例。可你要是用训练样例做测试那还能叫测试了吗?这就要求我们在做训练的时候别一下子把语料都用来训练,一定要保留一部分语料用来测 试,而且这部分用来测试的语料不要以任何方式参与到训练过程当中,严格隔离。如果你的数据实在有困难,那你可以交叉测试,就是说把你的数据分成10份并且 标号,首先用第一份留做测试其余用来训练,然后用第二份留做测试用其余用来训练,然后第三份留着做测试其余用来训练,以此类推,等十次测试结束之后在将十 次的测试结果取平均作为最终的测试结果。除此之外他还说,我们训练模型无非就是自动或半自动地调节好那几个参数,就好象调节收音机上那几个旋钮一样,想要 听到清楚的节目就需要尽量调到超平面的那个最优点,我觉得这话说得很有道理。
  • Data Alone is Not Enough
作 者说光有数据还不足已。因为机器学习类似于杠杆效应,输入少量的知识,然后获得大量的知识,如果你杠杆选得好,也就是支点越靠前,就可以用更少的知识,翘 得更多的知识。所以,针对不同的领域,不同种类的知识,就需要选取合适的模型,原则是易于表示这个领域的知识。比如你的知识是依赖于概率的,那么图模型也 许是最好的选择。比如你的知识是基于前提的,也就是说每个分类都是有一个前提的,那么你就可以用"if...then..."这种方式。
  • Overfitting Has Many Faces
如果你对你数据量不足,就容易出现过拟合,过拟合往往是因为你的数据量太少或者说你的模型太复杂了。
      跟光电效应一个道理,模型建立需要基本的溢出功。我是这样理解过拟合的:我们把训练数据看作是能量。那对于一个10次多项式的模型来说,在训练的过程中可 以看做其中有10个数据的能量是用来搭建模型的,然后剩余的数据能量是用来调整这个模型使之优良,也就是使之对训练样例全体的误差合最小。然而如果你所拥 有的能量小于十个独立点的能量,也就是没有达到建立模型的那个临界。那么你训练出来的根本就不是一个模型,用这个东西进行预测得出的结果也许就效果是随机 的。
如果你的数据针对训练样例100%准确,而对于测试样例只有50%准确,那么你的学习器很有可能过拟合了。正常情况至少应该是对于训练样例和测试样例准确率都75%才对。如果把过拟合的结果画出来,看上去就好像分界面鼓起了好多气泡一样。
      总的来说模型太复杂,容易过拟合,即使可以达到过拟合临界,那么数据不足也会使得偏执比较高,但是如果数据足够的话,足够把偏执降下来的话,大模型精度是 很高的,他的方差小。如果你数据不足,你就不敢使用复杂模型,不得不使用简单模型,而简单的模型确实不容易过拟合,但他的准确度(精度)就是硬伤,偏执再 底,方差是硬伤。
      解决过拟合的办法很多,其中最长用的就是在J函数后面再加一项专门用来控制参数的“正则项”。
我的理解就是避免你的某个参数或某些参数太大,因为过拟合常常最后的形状是弯折特别多,如果遏制住参数的大小就可以避免他拐太多弯折,把你的多维曲面铺平,就好象把气泡挤了出去一样。把过拟合的程度压制在一个我们可以接受的范围内。
      但我也担心一个问题,就是添加正则项也就降低了模型本身的灵活性,所以我自己的建议是如果你很确定不会发生过拟合,或者你对你的数据非常有信心,那么去掉正则项的话你的模型会拟合的更好,当然这只是个建议。
  • Intuition Fails in High Dimensions
理论上说,特征是越多越好的,但是你没增加一个特征,其表示的空间可是以指数方式递增的,这时候你所拥有的数据量就会以指数速度变得越来越不够用。因为你所掌握的数据是恒定的,而在需求以指数递增的同时,你说掌握的那点数据,在与需求的比值以指数方式变小。
      当然,计算也是个问题。不过最严重的还是高维度下的分布问题,在高维度下,物体的的多元高斯分布的质心离物体的均值通常很远。看来我还需要补一补代数方面的知识。所以即便你的数据足够,结果也不一定对。
  • More Data Beats a Cleverer Algorithm
算法和数据哪个更重要,研究人员当然会说算法更重要,但事实上,在实际问题面前,通常找数据比选算法更快解决问题。更令你不可接受的是,一个很差的算法如果有很多的数据,优势要比高级的算法好。
      时代不同了,80年代的时候缺的是数据,现在缺的是时间,如今我们更在乎算法的速度如何,这本来对复杂模型来讲是好事,因为数据足够就意味着可以选用高级的模型,这是原则上讲,但事实上你用低级模型效果却比高级模型要好。
      我自己的理解很浅显,就是高级模型使用了更多的数据来用于“溢出功”。这就是个追击问题,跑得快的后跑,跑得慢的先跑,即使你拥有的时间足够让跑得快的开始跑,但也不一定能保证结束的时候跑得快的比跑得慢的更远。
      而文章中给出的解释更有道理一些,他给出了一副图,他说复杂的模型和简单的模型,本质上都在做相同的事,就是把类似的数据分为一类,只不过他们对类似的定 义不同,但对于不是很苛刻的测试数据,无论哪种定义都能表现得正常。因为如果测试数据并不苛刻的情况下,分界面本身的形状并不重要,重要的是他能不能位于 恰当的地方。而如果想让高级模型体现出高级性,需要的不是大量的数据而是苛刻的数据,需要的是那些贴近分界的数据,这样才能塑造好分界本身的形状,使模型 本身的形状成为优势。我记得唐都钰师兄有一次说一个比赛,他们给的标注数据特别苛刻,人都不能标注成那个样子。为什么数据给的那么苛刻,不就是为了考你用 什么模型么。如果数据不苛刻,什么样的模型都很不错。
      总的来说,如果你的数据仅仅是多,那么明智的选择还是低级模型。如果你的数据非常丰富,那么选择高级模型还是有一定的道理。文章的建议是先用小模型,然后慢慢尝试大的模型。
  • Learn Many Models, Not Just One
以前,人们普遍认为这些学习算法,还有模型都是可以比较的,相信总有一个最好的。所以当时就进行了许多尝试,想找到最好的那个。但是后来很快发现,不同应用都有不同的最合适的模型。
      所以再后来,人们就开是选择自己喜欢的算法,然后标榜自己的那个算法是最好的。这有点像今天你用Vim还是Emacs一样。
      但再再后来,人们开始发现,与其选更好的那个,不如把不同的学习器组合起来,因为这样的效果会比独立的几个学习器效果更好。
      他们发现学习器之间是可以进行集成的,集成的方法最简单的有装带法[fn:5]其他的还有堆叠法(stacking)等等。话说在一次比赛[fn:6] 中,最终获胜的两个团队的学习器都是组合出来的,他们都合并了100多个学习器,而且如果他们两个再进行合并的话,效果会更好。
  • Simplicity Dose Not Imply Accuracy
本 来,按照奥坎姆剃刀原理,两个分类器如果训练误差相同的话,那么往往简单的那个分类器测试误差更小,而且还有好多文献证明这个说法。但事实上这种说法误解 了奥坎姆剃刀原理,奥坎姆剃刀原理说简单好,只是处于“道德和伦理”。如果你想看反例,刚才那个学习器集成就是个反例。
  • Representable Dose Not Imply Learnable
一个函数可以进行表示,并不意味着他就可以进行学习。比如标准决策树就不能学习出比样例多的节点。即使最简单的函数也许要无数的项来表示它。而且我们的数据不是无穷的,我们的时间不是无穷的,我们的内存也不是无穷的,大多数可表示的函数都不能进行学习。
      所以对于一个函数,你应该考虑的不只是他能不能表示出来,还有他能不能进行学习。多尝试一些学习器总是好的。
  • Correlation Does Not Imply Causation
相关性不是因果关系,确实如此,我们的机器学习学到的往往是相关性,而非因果关系。但是有时候我们自己却很难分辨哪些现象是因果,哪些现象是相关。我们需要在相关中分析因果。
      也许相关和因果两者并没有本质的区别,因为在物理世界对他们都没有良好的定义,这是哲学的领域了。但我们要做的是预测什么样的行为会导致什么样的后果,这就是我们所在乎的“因果”。