Boosting之Adaboost原理

Boosting之Adaboost原理

1 Boosting框架

  Boosting可以看成多个不同的基分类器的线性加权和的形式,那么自然需要知道每个基分类器及其对应的权重,具体的算法逻辑见下图。

Boosting之Adaboost原理

  如上图所示,在boosting算法中每一个基分类器都依赖于前面已经生成的基分类器,所以Boosting是一种迭代的算法。根据基分类器迭代方式和权重的不同,Boosting可以分为Adaboost、GBDT、XGBoost三种方式。本文就Adaboost做原理部分的介绍,主要侧重于直观上的理解,比如权重计算的合理性等等。
Boosting算法需要解决下面两个问题:
1. 样本权重或概率分布D的计算
2. 基分类器权重α的计算

2 Adaboost算法逻辑

  以二分类为例,介绍Adaboost算法

2.1 符号标记

  • 训练集样本: T={(x1,y1),(x2,y2),...,(xn,yn)}
  • m个分类器or第m次迭代: Gm
  • 迭代次数or基分类器个数: M
  • m次迭代第i个样本的权值,即抽样概率:wmi
  • m次迭代样本的权值分布:Dm,即为wm1,wm2,...,wmn,且i=1nwmi=1
  • m个分类器的权重: αm
  • 最终的分类器: G(x)

2.2 算法流程

输入:训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)},弱学习算法;
输出:最终分类器G(x)
1. 初始化训练样本的权值分布
Dm=w11,w12,...,w1n,且w1i=1n
即第一次迭代时,所有样本的权值相同
2. 对m=1,2,...,M即每一轮的迭代
(a)使用具有权值分布Dm的训练数据集学习,得到基本分类器
  Gm(x):X{1,+1}
  样本权重怎么具体影响基分类器,稍后再提。
(b)计算Gm(x)在训练集上的分类误差率
  em=P(Gm(xi)yi)=i=1nwmiI(Gm(xi)yi)
  这个误差率相当于对错误样本的加权求和,符合我们的直觉。
(c)计算Gm(x)的系数,即基分类器的权重
  αm=12log(1emem)
(d)更新训练样本的权值分布
  Dm+1=(wm+1,1,wm+1,2,...,wm+1,n)
  wm+1,i=wmiZmexp(αmyiGm(xi))
其中Zm是规范化因子,使得更新后的权值的和为1
  Zm=i=1nwmiexp(αmyiGm(xi))
  (b)(c)(d)三个公式稍后给出直观上面的解释
3. 构建基本分类器的线性组合
  f(x)=m=1MαmGm(x)
  G(x)=sign(f(x))=sign(m=1MαmGm(x))

(1)样本权重更新的在分类器中的应用
  之前提到每一次迭代都要更新样本权重,那么样本权重怎么影响基分类器呢?有两种方式:
1. 通过修改基本分类器源码,对于树模型修改信息增益或者基尼系数的公式引入权值,这里有点像代价敏感学习
2. 对训练样本进行bootstrao抽样,抽样概率等于样本权值
上述解释来自知乎高票答主萧瑟的回答
在Sklearn中是通过resample实现的,源码[见此]1010行(https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/ensemble/weight_boosting.py#L297)
(2)样本权重更新的计算逻辑
  只看wm+1,i=wmiZmexp(αmyiGm(xi)),如果第i个样本,在第m次的迭代中判断错误,那么wmiZmexp(αm),即该样本的权重会增大;反之,在第m次的迭代中判断正确,那么wmiZmexp(αm),即该样本的权重会减小。
  基分类器误差率em越小,该分类器Gm的投票权重越大。在实际操作中,如果误差率em>0.5,迭代会从等权重重新开始。

具体流程如下(符号有些许不同)
Boosting之Adaboost原理

3 Adaboost算法的解释

  都说Boosting更关注偏差,前面Adaboost的流程只能从直观上讲,怎么从损失函数的角度思考这一问题呢?

  Adaboost算法可以看成加法模型,损失函数为指数函数、学习算法为前向分布算法。下面围绕这三个方面谈一谈。

3.1 加法模型

  给出加法模型的形式定义:
  f(x)=m=1Mβmb(x;γm)
其中,b(x;γm)是基函数,γm为基函数的参数,βm是基函数的系数
显然Adaboost模型是一个加法模型,基函数—基分类器,基函数的参数—基分类器的参数,基函数的系数—基分类器的权重

3.2 损失函数

  在给定训练样本和损失函数L(y,f(x))的条件下,学习加法模型f(x)的需要解决的问题变为损失函数极小化问题:

minβm,γmi=1nL(yi,f(xi))

求解最优化问题需要明确两点:
1. 损失函数怎么定义
在Adaboost算法中,可以把损失函数理解为指数损失函数。后面再谈
2. 如何求解
上面的优化问题比较复杂,一般采用前向分步算法,该算法的逻辑为:从前向后每一步只学习一个基函数及其系数,逐步优化目标函数

3.3 前向分步算法

输入:训练样本T={(x1,y1),(x2,y2),...,(xn,yn)};损失函数L(y,f(x));基函数集{b(x;γ)}
输出:加法模型f(x)
(1)初始化f0(x)=0
(2)对m=1,2,...,M
 (a)极小化损失函数
  (βm,γm)=argminβ,γi=1nL(yi,fm1(xi)+βb(x;γ))
  得到参数βm,γm
 (b)更新
  fm(x)=fm1(x)+βmb(x;γm)
(3)得到加法模型
  f(x)=fM(x)=m=1Mβmb(x;γm)

这样,前向分步算法将同时求解从m=1M所有参数βm,γm的优化问题简化为逐次求解各个βm,γm的优化问题。
从(a)步可以看出,每一轮迭代的新分类器,都是在找一个使得损失函数最低的分类器。所以,Adaboost算法的关注点是逐步降低偏差。那么Adaboost的逻辑和前向分步算法有什么关系呢?

3.4 前向分步算法和Adaboost

  前向分步算法和Adaboost是否是一致的,那么关注点显然是每一次迭代时,Adaboost中的表达式αm,Gm,是不是损失函数最小化的参数βm,γm
  下面证明当损失函数为指数损失函数,基函数为基分类器时,Adaboost是加法模型的前向分步算法的特例。
加法模型
  Adaboost最终的分类器f(x)=m=1MαmGm(x)
形式和加法模型一致,那么需证迭代方式与前向分步算法一致
损失函数
  损失函数采用指数损失函数:
  

L(y,f(x))=exp[yf(x)]

损失函数定义有多种,在逻辑上要能讲的通,对于二分类问题而言,预测准确,且|f(x)|越大(参照SVM的几何间隔,说明预测的更好),指数部分为负,所以L越小。反之,预测错误,且|f(x)|越大(预测错误更加离谱),指数部分为正,所以L越大。至此,可以从直观上体现指数损失函数的合理性。
  如果基分类器or基函数返回的结果是{1+1},那么损失函数为:
L={ef(x)y1ef(x)=y(1)

Why指数损失函数
1. 方便计算,指数损失函数有比较好的数学性质,连续可微
2. 使得样本权重的更新更加简洁
3. 此时目标函数最小化等价于后验概率最大化(贝叶斯分类器)
迭代方式
  这里是关键的地方,即证明Adaboost中的表达式αm,Gm和前向分步算法迭代时损失函数最小化的参数βm,γm的一致性。
假设经过m1次迭代前向分步算法已经得到fm1(x):
fm1(x)=fm2(x)+αm1Gm1(x)=α1G1(x)++αm1Gm1(x)

在第m次迭代时,得到αm,Gm(x),fm(x)
fm(x)=fm1(x)+αmGm(x)

按照前向分步算法的逻辑,求解αm,Gm(x)即求下面目标函数最小化时的参数值:
(αm,Gm)=argminα,Gi=1nL(yi,f(x))=argminα,Gi=1nexp[yif(x)]=argminα,Gi=1nexp[yi(fm1(xi)+αG(x))]=argminα,Gi=1nexp[yifm1(xi)]exp[yiαG(x)]=argminα,Gi=1nw¯miexp[yiαG(x)]

其中w¯mi=exp[yifm1(xi)],注意这里下标出现了点变化。w¯mi只和fm1(x),y有关,且fm1(x)每一轮迭代之后都产生变化。但是与α,G无关,所以不影响最小化求解。换言之,如果目标函数除以i=1nw¯mi也不影响最终求解,为什么要插一句,后面见分晓。
下面证明最小化求解的参数就是Adaboost中所得到的αm,Gm(x)
求解可以分两步:
1. 求Gm(x)
 对于任意α>0(实际算法流程中可以设置如果分类器误差率大于0.5,会初始化再迭代,也就是说保证α>0),最小化可以由下式得到:
Gm(x)=argminGi=1nw¯miI(yiG(xi))

这里有两点需要明确:
(1)极小化指数损失函数为什么等价于最小化加权分类误差
  如果基函数or基分类器返回的是{1,+1},那么损失函数为式(1),原始最小化公式可以化简为:
Loss=i=1nw¯miexp[yiαGm(x)]=yi=G(xi)eαw¯mi+yiG(xi)eαw¯mi=yi=G(xi)eαw¯mi+yiG(xi)(eαeα+eα)w¯mi=yi=G(xi)eαw¯mi+yiG(xi)eαw¯mi+yiG(xi)(eαeα)w¯mi=i=1neαw¯mi+yiG(xi)(eαeα)w¯mi=i=1neαw¯mi+(eαeα)i=1nw¯miI(yiGm(xi))

就本次优化问题而言,α,w¯mi都是固定不变的,化简的时候可以去掉,因此由上面的推导就可以得到指数损失函数等价于最小化加权分类误差。

(2)样本权重怎么影响目标函数
  后面会讲到w¯mi和Adaboost中的wmi只相差一个规范化因子Zm,所以其本身不影响损失函数的最小化,那么样本权重是可以直接影响到最小化的求解过程,至于具体的求解,李航书里的例子只用一层的决策树桩,所以相当于是直接求解,至于更复杂的分类器可能就是上面提到的改变基分类器损失函数和进行重抽样来实现的[这里需要再确认下]。
2. 求αm

Gm(x)=argminGi=1nw¯miexp[yiαG(x)]=argminGyi=G(xi)eαw¯mi+yiG(xi)eαw¯mi=argminGyi=G(xi)eαw¯mi+yiG(xi)(eαeα+eα)w¯mi=argminGyi=G(xi)eαw¯mi+yiG(xi)eαw¯mi+yiG(xi)(eαeα)w¯mi=argminGi=1neαw¯mi+yiG(xi)(eαeα)w¯mi=argminGi=1neαw¯mi+(eαeα)yiG(xi)w¯miI(yiG(xi))

将已求得的Gm(x)代入上式,并对α求导,令其为0,即可得αm:
对loss做化简:
Loss=i=1nw¯miexp[yiαGm(x)]=yi=G(xi)eαw¯mi+yiG(xi)eαw¯mi=yi=G(xi)eαw¯mi+yiG(xi)(eαeα+eα)w¯mi=yi=G(xi)eαw¯mi+yiG(xi)eαw¯mi+yiG(xi)(eαeα)w¯mi=i=1neαw¯mi+yiG(xi)(eαeα)w¯mi=i=1neαw¯mi+(eαeα)i=1nw¯miI(yiGm(xi))

α求导:
Lossα=i=1neαw¯mi+(eα+eα)i=1nw¯miI(yiGm(xi))=0eαi=1nw¯mi=(eα+eα)i=1nw¯miI(yiGm(xi))eαeα+eα=i=1nw¯miI(yiGm(xi))i=1nw¯misetem=i=1nw¯miI(yiGm(xi))i=1nw¯misoeα+eαeα=1eme2α+1=1emlog(e2α)=log(1em1)αm=12log(1emem)

观察每一轮样本权值的更新。由
{fm(x)=fm1(x)+αmGm(xi)w¯mi=exp[yifm1(xi)]w¯m+1,i=exp[yifm(xi)]=exp[yi(fm1(x)+αmGm(xi))]=exp[yifm1(x)]exp[yiαmGm(xi)]=w¯miexp[yiαmGm(xi)]

这与Adaboost算法第2(d)步的权值更新,只差规范因子,因而等价。等价的原因是:对于前面第m轮最小化求解问题,w¯mi是固定的,所以目标函数同时除以i=1nw¯mi并不影响求解,我们可以在前面修改目标函数的表达式,从而形式上和Adaboost保持一致。
前面还有一个遗留问题:
αm与Ada中形式上一致,那么em是否一致呢?
在Adaboost中:
em=P(Gm(xi)yi)=i=1nwmiI(Gm(xi)yi)

在前向分步算法中:
em=i=1nw¯miI(yiGm(xi))i=1nw¯mi

若两者等价,则需证明
w¯mii=1nw¯mi=wmi

从前面样本权重的迭代公式可以看出,前向分步算法和Adaboost的样本权重迭代是一致的,也就是说,只要去相同的初始值w0,后面迭代的结果也是一致的。
w¯mii=1nw¯mi=w¯m1,iexp[yiαm1Gm1(xi)]i=1nw¯m1,iexp[yiαm1Gm1(xi)]wmi=wm1,iexp[yiαm1Gm1(xi)]Zm1=wm1,iexp[yiαm1Gm1(xi)]i=1nwm1,iexp[yiαm1Gm1(xi)]

  至此,所有证明结束,从损失函数角度理解Adaboost算法逻辑性更强。

4 Adaboost的正则化

  这部分内容了解的不多,先占个坑。有资料写正则主要是在迭代时对基分类器加了步长v进行调整,0<v<1

fm(x)=fm1(x)+vαmGm(x)

也许步长和迭代次数是两个比较重要的参数,下次去看sklearn的文档再回来补。

5 Summary

  周一看到周四,磨磨蹭蹭,写了两篇笔记,对Adaboost的逻辑还算比较清楚。后面争取写下GBDT和XGBoost以及python调参。对这篇笔记做一点总结。
1. Adaboost损失函数—指数损失函数
2. 为什么可以减少偏差—更关注错分的样本,并且体现在目标函数中
3. 样本权重和基分类器权重如何影响算法—样本权重影响损失函数,分类器权重影响最终投票权重
还有一些问题不太清楚:
1. Adaboost是否存在过拟合问题,怎么处理
2. Adaboost的基分类器是否可以用其他的分类器,强弱分类器做基分类器有什么不同

6 Ref

[1] 李航《统计学习方法》
[2] 刘建平Pinard博客

                2018-04-26 于杭州