A Few Useful Things to Know about Machine Learning

  最近读了一篇机器学习的入门读物,还是挺有意思的,本来想自己写点感想,后来发现网上有同学写过,还不错,就引过来了

  • Learning = Representation + Evaluation + Optimization

  Representation:表示方法确定了你能表示的空间是哪些,取决于你的问题是什么。

  Evaluation:评价函数为你的参数优化过程提供方向,其实就是用来衡量当前模型的好坏程度,而且通常都用失真程度来衡量(J(theta) = 预测值 – 实际值)。

  Optimization:优化方法的好坏直接决定了模型训练的效率,如果损失函数J(theta)不是凸的,那么它也将决定你能不能取到最值或者取哪个极值,例如梯度下降就取不到最值,只能取极值。

  作者还列了一张表格,列举了常见的表示方法,评价方法和优化方法。

  • It is Generalization that Counts

  泛化才是目标,作者这么说其实就是想地提醒我们别用训练样例做测试,除非特殊情况。因为我们要做的是泛化,也就是想从训练样例中学习到普遍规律,然后使模型可以用于所有非测试样例。可你要是用训练样例做测试那还能叫测试了吗?这就要求我们在做训练的时候别一下子把语料都用来训练,一定要保留一部分语料用来测试,而且这部分用来测试的语料不要以任何方式参与到训练过程当中,严格隔离。如果你的数据实在有困难,那你可以交叉测试,就是说把你的数据分成例如10份并且标号,首先用第一份留做测试其余用来训练,然后用第二份留做测试用其余用来训练,以此类推,等十次测试结束之后在将十次的测试结果取平均作为最终的测试结果。除此之外他,我们训练模型无非就是自动或半自动地调节好那几个参数,就好象调节收音机上那几个旋钮一样,想要听到清楚的节目就需要尽量调到超平面的那个最优点,我觉得这话说得很有道理,也很形象。

  • Data Alone is Not Enough

  只光有数据还不足够。因为机器学习类似于杠杆效应,输入少量的知识,然后获得大量的知识,如果你杠杆选得好,也就是支点越靠前,就可以用更少的知识,获得得更多的知识。所以,针对不同的领域和知识,就需要选取最易于表示这个领域知识的模型。比如你的知识是依赖于概率的,那么图模型也许是最好的选择。比如你的知识是基于前提的,也就是说每个分类都是有一个前提的,那么你就可以用”if…then…”这种方式。

  • Overfitting Has Many Faces

  过拟合往往是因为数据量太少或者模型太复杂了。

  如果模型针对训练样例100%准确,而对于测试样例只有50%准确,那么你的模型很有可能过拟合了。正常情况至少应该是对于训练样例和测试样例准确率都75%才对。如果把过拟合的结果画出来,看上去就好像分界面鼓起了好多气泡一样。

  总的来说模型太复杂,容易过拟合,即使可以达到过拟合临界,那么数据不足也会使得bias比较高,但是如果数据足够的话,足够把bias降下来的话,大模型精度是很高的,variance就会小。如果数据不足,就不应该使用复杂的模型,不得不使用简单模型,而简单的模型确实不容易过拟合,但其准确度就是硬伤,bias再低,variance是硬伤。

  Bias是指真正的均值和预测值之间的差值;而Variance是指这个预测值作为随机变量的方差。举个例子,k-NN的方差随着 k 的上升而下降。这表示了k-NN估计的”稳定性”随着 k 的上升而提高;而k越高,取的邻域就越大,用这个大邻域中的均值去估计,偏差就会增大。

  Bias 度量了某种学习算法的平均估计结果所能逼近学习目标的程度;独立于训练样本的误差,刻画了匹配的准确性和质量:一个高的偏差意味着一个坏的匹配。Variance 则度量了在面对同样规模的不同训练集时,学习算法的估计结果发生变动的程度。相关于观测样本的误差,刻画了一个学习算法的精确性和稳定性:一个高的方差意味着一个弱的匹配。

  下边是一个经典的关于Bias-Variance的曲线图。model complexity可以理解成这个分类器输入的维度,k-NN中,k越大,复杂度就越低,即分类越粗糙;k越小,复杂度越高,即分类越细腻。

  解决过拟合的办法很多,其中最常用的就是在损失函数后面再加一项专门用来控制拟合的惩罚项,从而避免某些参数太大,因为过拟合常常最后的形状是弯折特别多,如果遏制参数的大小就可以避免曲线过分弯折,从而摊平多维曲面,就好像把气泡挤了出去一样。把过拟合的程度控制在一个我们可以接受的范围内。

  • Feature Engineering is the Key

  机器学习的很多模型和算法是否成功往往取决于特征的选择。但是对于不同的领域,往往需要特定的模型选择,因此模型选择是一个非常难的任务,通常,一些不相关的特征通过组合行程的特征会发挥较好的判别作用和相关性。另外,虽然可以通过一些自动的方法进行特征组合选择,减少花在特征选择上面的时间,但是人工选择特征仍然是必不可少的。

  • Intuition Fails in High Dimensions

  理论上说,特征是越多越好的,但是每增加一个特征,其表示的空间便以指数方式递增的,这时候训练数据就会以指数速度变得越来越不够用。因为你能掌握的训练数据是恒定的,而在需求以指数递增的同时,你所掌握的少量数据,在与需求的比值以指数方式变小。

  当然,计算也是个问题。不过最严重的还是高维度下的数据分布问题,在高维度下,多元高斯分布的质心离分布的均值通常很远。所以即便你的数据足够,结果也不一定对。因此采用一些降维算法可以很好地较好地解决维度灾难的问题。

  算法和数据哪个更重要,研究人员当然会说算法更重要,但事实上,在实际问题面前,通常积累更多的数据比选择更优的算法能更快解决问题。更令你不可接受的是,一个简单的算法如果有足够多的数据,其效果也要比复杂算法好。

  时代不同了,80年代的时候缺的是数据,现在缺的是时间,如今我们更在乎算法效率,这本来对复杂模型来讲是好事,因为数据足够就意味着可以选用高级的模型,但事实上,采用简单模型效果往往比复杂模型要好。复杂的模型和简单的模型,本质上都在做相同的事,就是把类似的数据分为一类,只不过他们对类似的定义不同,但对于不是很苛刻的测试数据,无论哪种定义都能表现得正常。因为如果测试数据并不苛刻的情况下,分类界面本身的形状并不重要,重要的是分界面能不能位于恰当的地方。而如果想让复杂模型体现出优势,需要的不是大量的数据而是苛刻的数据,需要的是那些贴近分界面的数据,这样才能塑造好分界本身的形状,使模型本身的形状成为优势。总的来说,先用小模型测试,然后慢慢尝试复杂模型的方法比较合适。

  • Learn Many Models, Not Just One

  以往,我们总认为在可以选择的模型中总有一个是最好的,对于任何问题都会采用自己喜欢的算法,然后标榜自己的那个算法是最好的。

  再后来,人们开始发现,与其选最好的那个模型,不如把不同的模型组合起来,因为这样的效果会比独立的模型效果更好。模型之间的集成的有很多方法,例如bagging,boosting和stacking等等。在我们的领域,系统融合的方法往往都会来1-2 bleu值的提升,很多文章也是在系统融合这个方面努力。

  • Representable Dose Not Imply Learnable

  一个函数可以进行表示数据分布,并不意味着可以对数据学习到这个函数。比如标准决策树就不能学习出比样例多的节点。即使最简单的函数也许要无数的项来表示。而且数据,时间和内存都是有限的,大多数可用来表示数据分布的函数都不能进行学习。 所以对于一个函数,应该考虑的不只是它能不能精确地表示数据的分布,还有它能不能进行通过高效的学习算法活动的。多尝试一些不同的模型总是好的。

  • Correlation Does Not Imply Causation

  相关性不是因果关系,确实如此,机器学习学到的往往是相关性,而非因果关系。但是有时候我们自己却很难分辨哪些现象是因果,哪些现象是相关。我们需要在相关中分析因果。也许相关和因果两者并没有本质的区别,因为在物理世界对他们都没有良好的定义,这是哲学的领域了。但我们要做的是预测什么样的行为会导致什么样的后果,这就是我们所在乎的“因果”。

参考链接:

  http://www.cnblogs.com/SnakeHunt2012/archive/2013/02/18/2916232.html

  http://zktang8.com/note-of-A-few-useful-things-to-know-about-machine-learning

发表评论

电子邮件地址不会被公开。 必填项已用*标注