Boosting,黄荆棍下出好人

作为这个年代成长起来的中国青年,相信不少人都有被父母练习“男子单打,女子单打,男女混合双打”的经历。中国有句老话,“黄荆棍下出好人”。每当我们犯了错事,说了错话,往往会遭遇父母的批评,甚至棍棒,乃至引申出“打是亲,骂是爱”等等奇谈怪论。一顿言语棍棒下来,孩子往往记忆深刻,下次遇事自然会想起以前的批评教育,行为有所改变。

这种做法是否真的能出好人,我们暂且不论。今天要讲的故事与学习有关,因为在机器学习领域,有一个非常著名的算法,与中国父母亲教育孩子有着异曲同工之妙。

在计算视觉以及机器学习领域中,有一个重要的算法,叫做Boosting,或者AdaBoosting(Adaptive Boosting的缩写)。这个词的中文意思有很多,但是我觉得最贴切的应该是“强化”。其实称它为一种算法有些牵强,我觉得更准确的应该是一种思想。

在机器学习领域,最重要的玩意应该算分类器了(Classifier)。这是一个函数,它能根据输入样本的特性决定其属于某个类别。为了解释分类器的定义,以及说明Boosting算法,我们假设有这样一位小朋友,名叫小明,他正在读小学二年级,现在他面临一个问题:是否应该用石块砸碎隔壁家的玻璃。当然小明不是一个小坏蛋,这只是因为隔壁家的同学王二丫昨天值日的时候批评了小明的桌面不整洁。

我们假设小明已经,这时,小明有两个选择:1.砸,2.不砸。这就相当于小明的脑海中设计了一个分类器,根据当下的情况——”王二丫昨天批评了我”,来判断“砸坏王二丫家的玻璃”是否是正确的。

接着,我们假设小明同学有一点是非观念不强的毛病。他觉得王二丫批评他是非常严重的挑衅行为,砸了她家玻璃也没什么大不了的。这也就是说小明同学的分类器分类正确率不高,只具有比丢硬币(Random Guess)更高一些的正确率(比如小明不会把王二丫家的房子一把火烧了)。于是小明就扔出了石头,砸坏了二丫家的玻璃。

当然,这事情被小明的父母知道了。他们非常生气,决定对小明的错误做出惩罚,此处略去二百字……小明痛苦流涕,对自己的错误进行了深刻反省,一场风波就此过去。

但是福无双至,祸不单行,两天后王二丫又一次在带队做早操时批评了小明。放学后,倔强的小明怒火中烧,又一次手持石块来到了二丫家的窗前(玻璃君躺枪)。小明再次面临抉择。但是考虑到上次砸了玻璃之后惨遭痛打,小明退缩了。屁股的痛苦回忆战胜了报复的快乐,小明老老实实的回到了家。

在这个故事里,小明的思想历程展示了Boosting算法的基本思路。它的核心就是通过顺序地训练一些分类器,通过这些分类器的组合,来得到最终的高正确率的分类器。对于分类器的训练,主要的方式是对于错误分类的惩罚进行估计,然后得到惩罚期望最小的分类标准。在第一个分类器时,小明得到了错误的分类结果(砸了玻璃),然后被痛打(错误分类的惩罚)。在训练第二个分类器时,小明调整了对“砸玻璃是正确的”这个分类结果对应的错误分类惩罚的估计值。这样训练得到的分类器终于得出了正确结果。

这就是Boosting算法的简单例子。当然,实际中的Boosting算法比这个例子要复杂得多,但是其基本思想是一样的,那就是:对于上一个分类器分错的了样本,提高其权重,使得对其错误分类的代价估计提高,从而使得下一个分类器倾向于将这些样本进行正确分类。从这个角度来看,一个复杂的算法,和小明父母的“棍棒教育”,颇有些相似之处。

也许看起来的挺无聊的,但是这个算法确实应用广泛。在近几年,正是基于这个算法,Viola等人第一次开发出了可以实时工作的人脸检测系统,基本解决了困扰工业界多年的人脸检测问题,其实用的例子,就是我们在iphone以及其他照相系统中看到的人脸检测技术。如此看来,黄荆棍下虽然不一定出好人,但还是可能出好事的:)