最近在学习目标检测和追踪方面的东西,看了一些论文,其中有很多涉及到AdaBoost算法及其变种。本人刚刚接触机器学习,所以查阅了一些这方面的资料,现在将自己的一些理解记录如下。
注:文中的多处图表和文字引用自周志华教授的著作《机器学习》
集成学习
首先看一下周志华的《机器学习》中对集成学习的定义:
集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system) 、基于委员会的学习(committee-based learning) 等。
也就是说,我们需要先产生一组“个体学习器”(又叫“基学习器”),然后通过某种组合策略(比如说所有“个体学习器”的输出结果进行投票或者取平均值)将其组合起来,形成一个“组合学习器”,如下图所示:
其中,“个体学习器”一般是用结构简单的学习器。其学习效果有限,一般只比随即猜测好一点,所以,我们称之为弱学习器(week learner)。对应到分类问题,就叫做弱分类器。众多弱学习器可以是同一类型的,也可以是不同类型的。“组合学习器”一般具有很好的学习效果,我们称之为强学习器(strong learner)。对应到分类问题,就叫做强分类器。
正所谓“三个臭皮匠,顶个诸葛亮”,弱学习器通过组合之后的效果要好于每一个弱学习器的效果。但想要实现这样的效果,各个弱学习器需要满足两个要求:
- 单个弱学习器的性能要够好(要比随即猜测好,即正确率>50%)
- 不同的弱学习器要具有多样性(直观想象一下:如果所有的弱分类器都一样,那跟一个弱分类器就没有区别,就起不到“集中智慧,集体决策”的效果了)。
至于为什么要满足这两个要求,可以参见《机器学习》的集成学习章节,里面有一个例子可以帮助理解。
Boosting
既然集成学习是将多个“个体学习器”组合起来从而产生效果的,那么问题来了:我们如何选取这一系列的“个体学习器”呢?这些“个体学习器”之间究竟按照什么规则组合起来呢?对于这些问题,人们提出了很多的解决方案,这些解决方案一般被划分为两大类,下面是《机器学习》中的表述:
根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类?即个体学习器问存在强依赖关系、必须串行生成的序列化方法?以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表是Boosting ,后者的代表是Bagging 和”随机森林” (Random Forest).
下面我们一起来了解一下Boosting方法。同样,先看一下《机器学习》中的表述:
先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值T , 最终将这T 个基学习器进行加权结合。
从上面的表述可以看出,Boosting其实一种算法思想,而不是具体的实现。而且从以上的表述可以看出,在根据Boosting的思想设计一种具体算法时有这么几个具体的问题需要解决:
- 如何根据前一个弱学习器的分类结果调整样本的分布,使得分类错误的样本得到更多的关注
- 如何确定各个弱分类器的权值
- 选用什么类型的弱学习器
- 如何使用样本训练每一个弱学习器(依赖于3)
- 迭代次数T(弱分类器个数T)如何选择
对这几个问题的不同解决方案,往往就代表着不同的具体算法。而在目前众多的基于Boosting思想的算法当中,最为著名的莫过于AdaBoost算法了。
AdaBoost
AdaBoost算法是Boosting思想的一种具体实现。AdaBoost算法规定了在学习过程中如何重新调整样本分布以及如何确定各弱分类器权值,即解决了上述的第1、2个问题。
先看一下AdaBoost的伪代码:
简单的解释一下伪代码:
- 输入:
- 训练样本DD
- 弱分类器学习算法(未指定)
- 训练轮数