集成学习系列:

Adaptive Boosting

1 - Motivation of Boosting

1.1 - 回顾

上一篇介绍了aggregation model,就是通过一定的方法将很多的g进行融合变成一个G。首先我们介绍了blending,如果我们已经有了很多的g,可以让它们uniform的投票,或者线性的投票,或者非线性的将它们进行组合; 如果没有现成可用的g,那么可以通过bootstrap的机制来得到不同的资料,通过这些不同的资料来得到不一样的g,我们称这样的学习算法为bagging(bootstrap aggregation)。根据各个弱分类器之间是否存在依赖关系,可以将基于bootstrap机制的算法分为两类:一种是弱学习器之间存在强依赖关系,一系列的个体学习器基本都需要串行生成,其中代表算法有boosting系列;一种是弱学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是随机森林random forest系列。

1.2 - Apple Recognition Problem

通过以下20个样本,其中前十个是苹果,后十个不是苹果,老师想要教会小孩子们如何识别苹果。


机器学习笔记-Adaptive Boosting

老师:Michael,前十张图片是苹果,下面的十张不是,通过观测,你觉得苹果长什么样子呢?
Michael:我觉得苹果是圆的

如果根据Michael所说的规则, 所有的小孩子们都会觉得圆形的就是苹果,在这种简单的规则下有一些苹果被正确的识别出来,自然也会有一些犯错的判断,如图中蓝色的部分所示。


机器学习笔记-Adaptive Boosting

这时候老师做了一件非常棒的事情, 让小孩子们将更多的注意力放在他们判断错误的样本上,在图中我们将这些犯错的样本放大,将已经判断正确的样本适当的缩小来达到这个目的。这样所有的样本就变成了下图的这个样子。


机器学习笔记-Adaptive Boosting

老师:的确, 苹果大部分都是圆的, 但是只靠这个特征的话我们可能会犯一些错误,那么从这些放错误的样本上, 你觉得苹果还有什么特征呢?
Tina:苹果是红色的

又会有一些样本点被判断错误,同样我们将这些错误的点高亮出来。


机器学习笔记-Adaptive Boosting

同样老师将犯错误的样本点放大, 其他的缩小。新的样本如下图:


机器学习笔记-Adaptive Boosting

老师:根据现在的观察,还有什么规则吗?
Joey:苹果可能是绿色的。

把在这条规则下犯错误的点高亮出来,我们发现,有很多的样本都被划分错了, 但是那些犯错的样本点并不是Joey集中注意力关注的, 都是一些比较小的错误。


机器学习笔记-Adaptive Boosting

将犯错误的样本点放大, 其他的缩小。


机器学习笔记-Adaptive Boosting

Jessica:苹果看起来是有梗的


机器学习笔记-Adaptive Boosting

所以在经过了这么多轮的交互之后,小孩子们学到了一个关于判定苹果的比较复杂的规则,例如苹果是圆的,可能是红的,绿的并且是有梗的。这样的想法可能会比原来每一个人的单一的想法能更好的帮助他们来识别苹果。这个过程就是我们接下来要学习的一个算法。这些小孩子代表一些很简单的hypothesis,或者说gt;整个班级有很多的小孩子,将他们的判断融合起来就得到了一个比较复杂的判定准则G;这其中有一个很关键的角色就是老师, 老师扮演的就是我们将要学习的算法的作用,他的主要功能就是让小孩子专注在犯错的样本上。

2 - Diversity by Re-weighting

根据上一篇的介绍,bagging的核心是bootstrap,我们从原来的D经过bootstrap抽样得到D~t

(24)D={(x1,y1),(x2,y2),(x3,y3),(x4,y4)}(25)bootstrap(26)D~t={(x1,y1),(x1,y1),(x2,y2),(x4,y4)}

在这个例子中第一个样本被抽样了两次,第二个和第四个样本分别被抽样了一次,第三个样本没有被抽到。接下来base algorithm将会想办法在这样的数据上最小化Ein0/1

Ein0/1(h)=14(x,y)D~t|[yh(x)]|D~t={(x1,y1),(x1,y1),(x2,y2),(x4,y4)}

|[]|=1,如果成立;|[]|=0,如果不成立;

我们可以得到这个问题的另一种表述:用一个参数un来表示每一个样本被选到的次数(每一个样本的权重),那么第一个样本被抽样了两次,所以u1=2;第二个和第四个样本分别被抽样了一次, 所以u2=u4=1;第三个样本没有被抽到,所以u3=0。那么在进行了bootstrap之后我们可以使用base algorithm最小化如下的问题:

Einu(h)=14n=14unt|[ynh(xn)]|

其中unt的上角标 t 表示是在bagging的第 t 轮中的权重un
所以bagging可以看成是使用bootstrap的方式产生un,然后使用base learner来最小化使用u作为权重的Ein(称为u(t) weighted-0/1 error),最后来得到(不一样)的gt。所以我们希望base learner可以处理这些带有权重的最小化问题,我们称这样的算法为weighted base algorithm,其要解决的问题的形式如下:

Einu(h)=1Nn=1Nunerr(yn,h(xn))

  • 我们来分析如果base learnerlogistic regression的话,怎么解决有权重un的情况。当logistic regression使用SGD方法来进行最优化的时候,每一次要随机的选择一个样本点求解梯度得到权重需要更新的方向。那么当errorun有关的时候,un比较大就说明对于error的影响比较大,所以应该有比较大的几率来沿着这个点的梯度方向进行更新。所以在SGDlogistic regression中,我们可以将un作为SGD抽样的比例来使得weighted-error最小(weighted-error就是指带有权重u(t)Ein)。

  • 如果base learnerSVM的话,怎么解决有权重un的情况呢?因为un的本质是样本被抽样到了几次或者有几份,那么在SVM中将un加入errsvm就可以实现这一考虑,EinCn=1Nunerr^svm,可以看到Cun就是(xn,yn)犯错需要惩罚的大小。经过对偶问题可以得到0αnCun

如果我们的base algorithm会根据unun其实决定了样本是长什么样子的)来选择gt的话,那么我们怎么设置un的取值,可以让gt非常的多样性呢?之所以要求多样性是因为对于aggregation来说,gt越多样性的话,最后的结果会越好。所以我们要怎么得到不同的gt呢?

2.1 - Optimal re-weighting

gt是通过从数据{un(t)}上学习得到的, 即:

gt argminhH(n=1Nun(t)|[ynh(xn)]|)

gt+1是通过从数据{un(t+1)}上学习得到的, 即:

gt+1 argminhH(n=1Nun(t+1)|[ynh(xn)]|)

现在我们的目的是要产生一个不同于gtgt+1。试想一下,如果gt在使用某个权重un(t+1)的时候表现非常的不好,那么把这组权重应用在t+1轮的时候,不仅仅gt不会被选择出来,和gt相似的那些hypothesis也不会被选择到。gt是固定的, 所以我们要做的就是构造一个权重un(t+1)(其实也就是构造新的训练集,不过不用再通过bootstrap了,只需要变变权重un就好),构造的准则就是让gt的表现变得很差。对于二元分类来说,表现很差的意思就是gt在一半的数据上都划分错误:即划分错误的样本点数与总的样本点数的比值为1/2

n=1Nun(t+1) |[yngt(xn)]|n=1Nun(t+1)=12

为了便于理解和分析做一些简单的记号:

n=1Nun(t+1) |[yngt(xn)]|n=1Nun(t+1)=t+1t+1+t+1=12

其中:t+1表示的是判断错误的点的权重的和;表示的是判断正确的点的权重的和。现在我们的目的就是想要t+1=t+1

例如现在的情况是所有判断错误的点的权重和是1126,所有判断正确的点的权重的和是6211,这是一个合理的假设,因为gt在当前权重ut,或者直接理解为在当前数据集上的表现应该是判断正确的数据点比误判的数据点要多,我们想要做的就是更换数据集,也就是更新权重让gt的表现变差,那么其中一种更新的方式是:

  • 对于错误的点:un(t+1)un(t)6211,
  • 对于正确的点:un(t+1)unt1126

或者另一种方式,首先计算分类错误率:判断错误的点的权重的占比 ϵ=11267337,那么判断正确的点的权重的占比为 1ϵ=62117377
那么构造tn(t+1)的方法是:每一个正确的点的权重乘以ϵ ,每一个错误的点的权重乘以1ϵ
通过这样的计算我们就完成了t+1=t+1,在这样的权重un(t+1)下,gt的表现就会很差,那么在t+1轮中就会选到和gt很不一样的gt+1。其实可以理解为是应用了在bagging学习方法中的bootstrap的思想,只不过在这里并没有真正的去进行有放回的的多次采样,而是通过更新权重值来达到这个目的。

3 - Adaptive Boosting Algorithm

3.1 - 缩放因子

我们刚刚描述了如何做最优的权重设置(optimal re-weighting), 这个方法的目的是让gt+1gt很不同, 具体的做法是先gt的错误率ϵt通过公式(1)计算出来,然后正确数据点的权重放缩ϵt倍;错误的数据点的权重放缩1ϵt倍。

(1)ϵt=n=1Nun(t)|[ynh(xn)]|n=1Nun(t)

(其中1=|[]|, 如果成立;0=|[]|, 如果不成立)

这里我们定义一个新的变量,称为放缩因子t

t=1ϵtϵt

这样得到optimal re-weight的过程可以简单的表示为:正确数据点的权重除以t;错误的数据点的权重乘以t为什么可以这么做呢?通常gt的错误率ϵt1/2,所以就有t1。这样的话,错误就被放大了, 正确的就被缩小了, 正如在第一节中老师所做的事情那样, 让学生可以focus在错误上, 这其实有点像perceptron learning algorithmPLA做的事情一样, 将注意力放在划分错误的点, 并将其修正。

现在我们通过构造u(t)来得到不同的gt,这里的un(t+1)n个样本的权重un(t+1)的更新规则就是根据t,目的是使得当前的gt变得很差以至于下一轮可以选出不同于gtgt+1。现在还剩两个问题没有解决:

  • 初始的un(1)应该如何赋值
  • 在得到了很多的gt之后,如何融合为一个G

对于第一个问题,通常的做法是每一个un(1)都取值为1N,可以理解为就是在原始的数据上来最小化Ein,所以得到的第一个g1应该是对Ein来说还不错的。
对于第二个问题,或许我们可以使用类似于bagging的方法,将这些g通过uniform的形式融合起来, 但是考虑刚刚说过的一个问题,g1Ein来说是很好的, 那么理论上说g2Ein来说就应该是不好的, 因为根据我们前面讨论的机制g2g1是很不相同的。所以如果做uniform的话,可能不是一个很好的选择。 在这里我们介绍一个可以在决定了gt之后就能确定以什么样的权重αt将其融合到G的方法。

基本的思路是,如果gt的表现很好, 那么αt就大一点,反之就小一点。那么怎么判断一个gt的表现呢?我们可以通过已经计算出来的ϵt来决定,好点的gtϵt应该是很小的,t就会比较大, 反之t就比较小。所以αtt应该有一个单调的关系。这里取:

αt=ln(t)

分析下这样的取法的物理意义是什么:

  • ϵ=12的时候,表明gt表现的很差,这时t=1 αt=0,因为gt表现很差, 所以权重αt=0
  • ϵ=0的时候,表明gt的表现很好,这时t= αt=, 因为gt的表现很好,所有可以只由它来决定最后的分类。

3.2 - Adaptive Boosting算法

上面所有的这些综合起来就得到了Adaptive Boosting算法。该算法主要包括3个元素:比较弱的base learning algorithm A(学生)用来得到gt;能够调整样本权重得到optimal weightt(老师);最后对gt进行融合的linear aggregatino(整个班级对苹果的认识)。


Adaptive boosting(AdaBoost)

u(1)=[1N,1N,,1N]
for t=1,2,,T

  1. obtain gt by A(D,u(t)) ,where A tries to minimize u(t)-weighted 0/1 error
  2. update u(t) to u(t+1) by
    • |[yngt(xn)]|: un(t+1)un(t)t
    • |[yn=gt(xn)]|: un(t+1)un(t)/t
      where t=1ϵtϵt and ϵt=n=1Nun(t)|[ynh(xn)]|n=1Nun(t)
  3. compute αt=ln(t)

return G(x)=sign(t=1Tαtgt(x))


算法描述:刚开始的时候,所有的点的权重都是相同的,u(1)=[1N,1N,,1N]。在 t 轮的时候,使用base learner得到一个gt, 计算这个gtD~t 的错误率ϵt, 进而可以计算相应的t,然后就可以对所有样本点的权重un(t)做更新得到un(t+1)用于下一轮的gt+1的计算,(具体的更新的规则是,如果对于第 n 笔资料资料(xn,yn)来说gt(xn)yn那么un(t+1)un(t)t ; 如果gt(xn)=yn那么un(t+1)un(t)t直观上来说,就是要把被预测准确样本点的权重缩小;把被预测错误的样本点的权重增大),t也可以用于gt的权重值αt的计算,用来对gt进行融合得到G。这就是Adaptive boosting算法。简称AdaBoost

关于AdaBoost,如果base linear的表现很弱,但至少比乱猜要好的话, 即ϵtϵ<12,就可以通过AdaBoost使得A越变越强,强到Ein=0,并且Eout也很小。理论分析得到在T=O(logN)轮之后可以得到Ein(G)=0

4 - Adaptive Boosting in Action

4.1 - Decision Stump

从刚刚的分析中我们知道AdaBoost只要搭配上一个在weighted-error上比乱猜做得好的base learner就可以有很好的效果。这样看来decision stump就是一个不错的选择。
decision stump这个算法有三个参数,(feature i,threshold θ,direction s)feature指定我们使用哪个特征用于划分数据;threshold给出在feature上进行划分的边界值;direction决定划分之后哪一边是取正值,哪一边取负值。我们可以搜索所有的三种参数的组合,来选择使得Ein最小的decision stump。对于在AdaBoost中的weighted Ein我们也可以搜索所有的组合, 来得到最好的划分的方式decision stump的时间复杂度为O(dNlogN), 其中d为特征的维度,N为样本的个数。
从物理意义上来看, 其实就是在一个二维的平面上通过垂直的线或者水平的线来对数据进行二分类。所以decision stump的能力是十分有限的。但是AdaBoost只需要一个弱弱的算法就可以。

4.2 - 一个简单的例子

以下看一个例子,即AdaBoost+decision stump来做资料的分类:
原始的数据如下:


机器学习笔记-Adaptive Boosting

所有的数据的权重都是相同的, 使用decision stump划分一次得到如下图的结果。


机器学习笔记-Adaptive Boosting
图1

三个蓝色的 被划分错误,将其放大。其余判别正确的样本缩小然后再使用decision stump进行划分。


机器学习笔记-Adaptive Boosting
图2

由于在图1上decision stump更多关注的是三个被放大的蓝色的 ,所以这次在图2的划分中这三个点划分正确了,但是另外的4个红色的 × 被划分错误了。同样错误的放大, 正确的缩小。再做一次decision stump


机器学习笔记-Adaptive Boosting
图3

如果把这样的三个分界线通过AdaBoost的机制融合起来的话,就得到了一个非线性的分界线G。重复上面的操作在进行一次decision stump


机器学习笔记-Adaptive Boosting
图4

进行第五次decision stump。所有的样本都已经被G完美的划分正确了。


机器学习笔记-Adaptive Boosting
图5

4.3 - 一个更复杂的例子

原始的数据是这样的。


机器学习笔记-Adaptive Boosting

经过100次的decision stump之后,融合的G如下图所示:


机器学习笔记-Adaptive Boosting

可以看到效果已经很好了。这样通过简单的decision stump的融合,我们最终得到了一个非线性的模型。相比于我们做kernelSVM,这个非线性的模型非常的高效, 不需要转换到一个高维甚至是无穷维度的空间中去求解一个复杂的二次规划的问题。

5 - 总结

本篇主要讲解了Adaptive Boosting算法。第一小节通过一个例子引出了该算法的基本思想,通过将一个个比较简单的,弱弱的学生的想法融合起来,最终可以得到一个比较复杂的模型。这个算法中一个很关键的步骤是每一轮中给所有的样本重新分配不一样权重,具体的做法是提高错误样本的权重;降低正确样本的权重,以此来得到不同的gt, 最后将这些gt整合起来就得到了一个很好的非线性的分类器。最后给出了AdaBoost配合Decision Stump的实际效果。
之前讲解了Bagging,这是uniformaggregation;讲解了AdaBoost,这是linearaggregation, 下一篇我们将介绍一个conditionalaggregation的方法Decision Tree

相关文章:

  • 2021-12-18
  • 2021-11-22
  • 2022-12-23
  • 2021-06-08
  • 2021-10-12
  • 2021-12-08
  • 2022-02-12
  • 2021-12-12
猜你喜欢
  • 2022-12-23
  • 2021-05-14
  • 2021-12-07
  • 2021-04-13
  • 2021-08-01
  • 2021-05-18
  • 2021-04-21
相关资源
相似解决方案