机器学习是现在在风口上。其包括一系列的具体算法,学习这些算法需要一定的数学基础(线性代数、概率论),网上有大量的资料可以参考学习;对于工程来说门槛就更低了,有许多优秀的现成框架可以使用。虽然我们调用一些api、调调参数就能完成很多工作,但是理解这背后的“为什么”还需要下一番功夫。机器学习理论是该领域的分析框架,这方面的内容比较抽象,且“实用性不强”,所以常常被人忽略。这篇博客就来通俗地讲讲这些理论。
1.什么是机器学习
计算机编程算法是用来解决各种实际问题的。在传统的算法中,面对一个实际问题,程序员靠个人的智慧推导出了问题准确的解决方法,然后通过编写程序解决问题。如果把寻找解决方案的过程比喻成寻宝,把具体解决问题的方案比作宝藏的话,那么传统的编程就是靠人的推理的推导出了宝藏的具体位置。但现实中有大量的问题很难由人推测出精确的解决方案,尤其是那些涉及变量很多(高维)的问题。面对这类问题虽然难于给出一个确切的解决方案,但我们总觉得可以找到一个“大概”或者说“模糊”的解决方案(有统计规律)。
机器学习正是为了解决这种问题的,它是对“确切推导出宝藏位置”这一条件的软化,虽然我们不能推出宝藏的准确位置,但是我们可以给出这一宝藏的大致范围(对应着hypothesis set)然后利用算法通过大量的数据从这个范围中筛选出“宝藏”。例如在预测房价这种机器学习的典型任务中,影响因素可能上千个,我们不太可能推导出一个包含这些影响因素的确切方程。但是我们可以给出一个范围,即一个相对模糊的解决方案,例如:“这些影响因素与房价呈线性关系”,这么一来我们划定的宝藏范围就是“所有的线性方程的集合”,然后机器学习要做的是从这些候选集中通过与大量数据进行“比对”找出一个合适的具体方程当做我们要找的“宝藏”。这就是机器学习算法的寻宝过程。
一个机器学习算法要成功,首先这个定的范围需要能框住正在的“宝藏”,其次这个找宝藏的过程也得合理高效,并且还得有足够的数据进行比对筛选。下面我们来说说这么判定我们挖出了真正的宝藏。
2.怎么判断机器学习“学”到了东西
前文我们说机器学习是在一堆算法的候选集中,通过大量数据的“比对”选出一个表现好的算法。这部分用于“比对”的数据就叫“训练集”。通过训练集“选出来”的算法往往在训练集上表现很好。但这样的效果并不仅仅是我们想要的,机器学习算法的输出是一个“解决方案”,靠这个“解决方案”去应对所有的输入情况,而训练集仅仅包括了输入可能性的一小部分,我们希望以这一小部分的数据训练模型,能让模型处理它没有见过的数据(泛化)。打个比方,你通过一些例题去教一个孩子线性方程组的解法,教完过后这些孩子对于例题应该都能熟练解答,但是评价这个孩子是否“学会了”不应该拿这些例题去考他,而应该用他没见过的线性方程组去考他,即看他是否有举一反三(泛化)的能力。
机器学习中有一套理论去保证泛化能力。为了体现我不是民科,我还是搬几个公式吧:) 。首先一个理论基础是霍夫丁不等式Hoeffding Inequality :
$P(\left | \nu -\mu \right |> \varepsilon )< 2exp(-2\varepsilon ^{2}N)......(1)$
这篇文章不打算详细推导数学,所以这里我只讲公式背后的故事。这个不等式告诉我们的是:我们通过有限数据得到的参数$\nu$(算法在训练集上的误差)与理想中的参数$\mu$(算法在所有数据上的误差)之间的关系:$\nu$与$\mu$之间的误差大于 $\varepsilon$的概率小于不等式的右边的指数表达式的结果。不等式右边N是计算出用到的数据量(训练集大小), $\varepsilon$是允许的误差。
这个公式告诉我们只要使用的数据量足够大,单个算法在训练集的表现能够代表这个算法在所有数据上的真实表现。这个公式只是告诉我们一个算法的情况,但是我们说过机器学习的过程是在所有候选集上挑一个最好的算法。候选集一多,出现小概率事件的概率会变大。例如买彩票,对于我一个人而言中大奖的概率是微乎其微的,但对于一个集合来说,比如全北京买彩票的中有人中大奖的概率还是很高的。数学上我们用union bound 来代表这类问题:
$P( A_{1}\cup A_{2} ...\cup A_{k} )< P ( A_{1} )+ P ( A_{2} )+...+P( A_{k} )......(2)$
在(1)中考虑union bound后可以得到:
$P\left ( \exists h_{i}\in H ,\left | \nu (h_{i})-\mu (h_{i}) \right | >\varepsilon \right ) \leqslant 2kexp(-2\varepsilon^{2}N )......(3)$
与(1)式不同的是(3)式中k是模型候选集的大小,其余参数基本相同,这个式子告诉我们即使训练数据足够大,如果我们的候选集中包含的候选算法太多(k太大)也可能得到错误的结果。这也应了那句谚语“林子大了什么鸟都有”:)。因此在机器学习中模型复杂度的选择是一个需要折中考虑的量,一方面模型越复杂即我们划的“范围”越大,则这个范围内包含“宝藏”的概率就越大,另一方面林子变大了出现“坏鸟”的概率也变大了。理想的情况是我们模型的范围取得“准且小”,这当然需要我们对要解决的这类问题有比较多的先验知识,一种极端的情况是当我们的先验知识足够充分了,就可以把我们的范围缩小成一个“点”,即直接找到一个具体算法,这本质上就退化到了传统编程解决问题的方法了。实际上(3)式的刻画是比较粗糙的,大多数情况下k是无穷大的。在机器学习中为了解决无穷问题又有“打散”、VC维等概念,这些概念的补充对(3)式右边所代表的上界进行了更精确地刻画。但是在这里(3)式足够表达上述思想了,那些“更精确”的理论这里就不讲了,如果感兴趣可以参考相关教材。
机器学习算法对应着两类误差即偏差和方差,在实际工作中,判断模型的主要误差是哪一种是后续进一步优化模型才有正确的方向。你可以在网上查到大量方差和偏差的“正统”定义,在本文里我就讲一讲我的偏门理解:偏差度量的是由于圈的地太小了,没有圈住“宝藏”引起的误差;方差是指圈的地太大了,林子里出现了“坏鸟”产生的误差。当机器学习的误差由偏差主导时,这时候就可以考虑增大模型的复杂度,即圈更大的范围。当模型的误差由方差主导时,这时就需要降低模型的复杂度,加更多的数据(筛选更严)或者采用一些正则化的方法。说道正则化,我理解的就是对模型做出一些限制,让模型选择的范围缩小,正则化有效地前提是这样的范围缩小是合理的,而要满足这个要的还是先验知识。以上就是对机器学习理论的一些理解,下面用一个例子进行说明。
3一个实例
现在以公司招聘为例子对机器学习进行类比。公司招人的目的是找一个合适的员工到公司,对应着机器学习里面是“训练”出一个合适的算法供以后使用。现在假设公司招人的办法就是出一些题让候选者解答,从中选出得分最高的人,把这个人招进来;这对应着机器学习里面通过大量的数据挑选出合适的算法,此处“题”和“数据”相对应,“候选人”和“候选算法”相对应。假设公司的题都是选择题的类型,现在公司有20道这样的题(数据量),那么对于一个应聘者来说如果他能全部做对这些题,那么他大概率是合格的,因为这些题他全部能蒙对的概率很小(0.25^20)。
现在公司定了个算法:去外面大街拉50个人来做题,如果能全部做对就认为他是合格的候选者。这个算法的缺点是很可能这50个人里面没一个人做得好,所以招不到合适的人,这对应着机器学习里的欠拟合:由于模型不够强(候选集太小)导致的效果不好;而且这个例子中是“去大街上拉50个人”,这个模型的选取没有利用好先验知识,这在机器学习中属于模型选取不当,比如本来应该用gmm模型而实际用成了hmm模型。
由于上面的方法没招到人,于是老板说:“既然候选人太少了,那咱多拉点人来,反正咱们国家最不缺的就是人”,然后拉了1亿人来做题。这种情况下有候选人拿了满分,那么这个人就是合格的吗?在上一个50个候选人的情况下如果有人全做对我们可以认为他大概率很优秀,但是现在这个基数变成了1亿人,一个人要全部蒙对的概率很小,但是1亿人中出一个全蒙对的概率还是很大。所以这对应着机器学习里面的“过拟合”问题,算法在训练集上表现很好,但实际应用时却效果却很差(这个凭运气进入公司的人并不能胜任工作)。面对这种问题可以出更有难度的试题(更好的数据)或这增加题量(加数据)来让蒙对的概率变低。另外也可以换候选者范围(对应着换算法或加正则化),让候选者的范围合理地变小一点。
例如在这个例子中更理性一点的算法是将候选者范围换成大学本科毕业相关专业的几百个人,再让他们来答题,这样的话大概率能选出我们的要的人。机器学习里面有个定理叫“没有免费午餐定律”说的就是不能抛开具体的任务,去评价算法。因为一个机器学习算法对应着一个候选的范围,当我们问题的答案落在了这个范围内,有足够的数据就能训练出合适的答案。另一方面如果一个算法非常强大,但它的范围没包含我们的答案,那么有再多的数据也白搭,其效果可能还不如那些不那么“强大”的算法。这就是我对于机器学习理论的一些理解,希望能够对你有点启发,如果想要全面、严谨、数学化的理解机器学习的理论我推荐林轩田的《机器学习基石》的公开课。
4人工智能“智能”吗
人工智能很火,但现在的人工智能真的智能吗?让我们从之前的分析中看一下在机器学习中有多少是人的“智能”,又有多少是机器的“智能”。还是以寻找宝藏为例,首先判断有没有宝藏可寻,即判断一个问题是否有统计规律可循,这是人的“智能”做出的判断;其次划定宝藏的范围也是人做的决定(选模型及模型的规模);最后划定范围后确定怎么去找宝藏(优化函数、优化算法)也是由人指定的。因此纵观整个机器学习的过程,基本还是靠人类的智慧在解决问题,机器只是按部就班地服从人的指挥,在一定的范围中执行优化算法去找宝藏,这个过程中并没有展现出机器“智能”。
虽然目前的人工智能还根本谈不上“智能”,但是我们也不必沮丧。机器学习的算法让计算机能解决更多的问题,从以前的“确定性”问题到现在的“范围”问题。而“能够解决更多的问题”这本身就是一个巨大的进步。
这几年机器学习里面成功的技术是深度学习。这类算法也并未跳出上述机器学习的理论框架。但是其在计算机视觉、自然语言处理等领域表现出了最好的效果、在某些子领域中其效果甚至能超过人类。我们对深度学习为什么有效或者说深度学习模型圈下的是怎样一块地还不甚清楚,期待后续这方面的研究能够揭示出“智能”的一些边边角角。