Adaboost 详解
来源:互联网 发布:专业生物英语软件 编辑:程序博客网 时间:2024/05/22 12:13
Adaboost 详解
本文会详细介绍 Adaboost (Adaptive Boosting) 这一 ensemble 模型(属于 boosting)。
1. 算法简介
boosting
这属于集成(ensemble)算法中的提升(boosting)方法,是迭代算法。我们每一轮迭代寻找一个合适的 weak learner 集成到模型中(本质上是梯度下降),通过 T 轮的迭代来集成出一个强分类器,这是一个 boosting 提升过程。
adaptive
这涉及实现提升的细节。所有的样本都有自己的 weight,初始化时一致。training 时每一轮迭代,我们要更新所有样本的 weight,模型正确判别的样本 weight 减小,而错误判别的样本 weight 增加。这就是 Adaboost 的核心了,这非常像一个我们依据错误经验持续学习的过程。
steepest decent with approximate functional gradient
本算法数学上可以解释为类似在函数空间上做最速梯度下降。每次迭代中,选择的 weak classifier 函数其实是当前负梯度方向,而对应的权值则是在此方向使 loss 减少最多的步长(greedy~)。这里使用的 loss function 是 exponential function,而 GBDT(gradient boost decision tree)推广到了其他 error function,也可以说 AdaBoost 是一种 GBDT。
2. 训练流程详解
实际上不同 Adaboost 版本的细节策略略有不同,这里讲解的是Viola-Jones 的 Real-Time Face Detection 论文(AdaBoost 的一个著名的成功应用)中使用的版本。
2.1 initialization
假设我们有 N 个样本
我们要迭代训练 T 轮,样本集 weight 向量
(这是正例负例等比例的情况,不等比例时,可以假设正例 M 个而负例 L 个则初始化为
2.2 training iteration
(对于第
选取 weak classifier 并计算 error:
根据当前样本权重ut 获取一个当前最好的 weak classifierht(x) 函数(训练一个 decision tree 或者 decision stump),函数输出 0/1 结果,其相关 error 为ϵt=1N∑Ni=1uti|ht(xi)−yi| 。这里应该有0≤ϵt<0.5 ,因为我们要求 weak classifier 至少优于乱猜。更新训练集样本权重:
针对ϵt ,我们设置一个核心变量 scaling factorst=1−ϵtϵt (1<st<∞ ),并更新样本集 weight :ut+1i={utiuti/stht(xi)≠yi, incorrect caseht(xi)=yi, correct case
除了上述公式,之后还会对ut+1i 重新 normalizeut+1i=ut+1i∑Nj=1ut+1j ,保证和为 1。
可以注意到这里的 adaptive 的机制:本轮迭代ht(x) 错误分类的样本的 weight 会增大(scale up incorrect),正确分类样本的 weight 相应减小(scale down correct)确认此 weak classifer 权重:
会根据本轮ht(x) 的表现给予它一个权重αt=ln st (0<αt<∞ );当ϵt=0 时,αt=∞ 即对于完美的 classifier 我们可以给到无穷大的权重;而当ϵt=0.5 时,αt=0 即对于乱猜的 classifier 直接不予集成。可见 error 越小的分类器权重越大。
2.3 aggregation
历经 T 轮训练后,将 T 个
3. Weak Classifier
这里把训练流程中的 weak classifier 单独拿出来详细说明。
3.1 Compare to Random Forest
Random Forest 也是 ensemble 集成算法,属于 bagging 类别,通过 bootstrap 来 uniformly aggregate 了一组等权重的 decision tree,然后通过投票给出整体结果。这是使用 classification(输出 0/1 结果) 或者 regression decision tree 都可以。
这个也是 weak classifier 集成为 strong classifier 的过程,但是集成思想和 Adaboost 不一致(bagging vs. boosting)。Adaboost 也可以使用 classification decision tree 作为 weak classifier,但更常用的是更 weaker 的 decision stump。这里还可以想象一下,我们如果给 Adaboost 一个 fully grown 的 decision tree,那么可能会有
3.2 Decision Stump
这个是一个弱弱的 weak classifier,类似只有 1 层的树,只剩一个树桩了。具体公式如下:
3.3 Adaboost 中使用 Decision Stump
Adaboost 常用 decision stump 作 weak classifier,即训练流程中寻找的
具体应用时还有 2 个性能上的考量:
- 时间复杂度
为了优化训练时间,在迭代之前要对M个维度依次排序并 cache 结果,复杂度O(M⋅N∗logN) 。之后每次迭代只需要O(M⋅N) 就可以找到当前轮t 最优ht(x) 。 - 空间复杂度
cache 住的结果如果存在硬盘的话会极大降低搜索速度,我们希望全部放在内存,这里空间复杂度为O(M⋅N) 。对于 VJ 原论文中 N=1万、M=16万,考虑 int 存储 feature value 则cost=4×16×108B=6.4GB 。考虑到扩充特征集、扩充数据集、存储结构效能等问题,其实内存要求是很严峻的。
4. 理论支持
(本节参考了 Hsuan-Tien Lin 机器学习技法课程)
Adaboost 凭什么能完成 weak classifiers to strong classifier?凭什么可以收敛?可以越来越好?我们可以从数学层面(steepest decent with approximate functional gradient)找到充分解释,本节详细阐述。
4.1 公式及符号重新定义
之前“2. 训练流程详解”使用的是 VJ 论文中原版公式。这里为了更清晰解释数学理论,会改动一些公式定义:
- 定义数据 label y 与 classifier
h(x) 输出为 -1/+1 而非之前的 0/1,这可以简化很多公式yiht(xi)=1 即表明判定正确- 弱分类的 error rate 写作:
ϵt=∑Ni=1uti [yi≠ht(xi)]∑Ni=1uti ,这里是标准的 rate 了 - strong classifier 判别公式写作:
C(xi)=sign(∑Ttαtht(xi)) (使用符号函数 sign 直接处理正负向加权投票之和,非常简洁),依然有αt=ln st - 这里将上式中弱分类器加权投票和记作
vote score=∑Ttαtht(xi) ,后续数学推导使用
改变 scaling factor
s 公式为st=1−ϵtϵt‾‾‾‾‾‾‾√ ,比之前版本多了一个 square root,取值范围不变,这是为了方便后续数学推导样本权重
u 公式更改为下述,这个改动也不大,也是为了方便后续数学推导(原公式只考虑 scale up,然后 normalize;现在加入 scale down 而去掉了麻烦的 normalize):ut+1i={utistuti/stht(xi)≠yi, incorrect caseht(xi)=yi, correct case
然后这里最妙的一步是直接把上式简化为:ut+1i=utis−yiht(xi)t
4.2 loss function of AdaBoost
根据
进而可以对样本权值公式进一步变换:
我们假设所有样本权值训练前初始化为
可以看到任意样本
上式右侧实际上就是 exponential error:
- 整体 strong classifer 可以写作
C(xi)=sign(vote score on xi) ,所以yi(vote score on xi) 的正负表示判定正确或错误 yi(vote score on xi) 越大,表示判定越正确,对应的负指数值就越小yi(vote score on xi) 越小,表示判定越错误,对应的负指数值就越大
这实际上就是 Adaboost 的目标就是 exponential error 越来越小(最优化问题),也可以说是让所有样本的权值越来越小;最终 error/loss function 为所有样本的 exponential error 之和:
4.3 loss function 内在意涵
上述的 exponential error 实际上可以找到直观解释。先变化 strong classifier 判别公式如下:
我们可以把
比对上式,其实 AdaBoost 包含带符号的非正规化 margin:
AdaBoost 的目标是让这个 margin 尽量为正数且最大化,也就是让其负指数尽量小于1且最小化,也就是我们之前得到的 error/loss function。
另外,因为使用了 exponential,分类错误的 penalty 呈指数增长
4.4 Gradient Descent
标准套路
Gradient Descent 标准套路是我要从当前位置(模型状态)走一小步,让 loss 最快的下降(减少):
wt 表示第 t 轮迭代时,当前的 weight vectorv 表示走的方向(向量,有 length 约束)η 表示走的步长(标量,一般是一个较小的正数)
目标其实是找到一个让 loss 函数下降最快的方向
AdaBoost 的 Gradient Boost 套路
AdaBoost 的套路很类似,核心是其通过新加入函数来完成梯度下降,这个函数对应最速下降的方向,而函数的权重对应了下降的步长。AdaBoost 在第 t 轮迭代时,优化目标如下:
我们在原始 loss function 中新加入一项
然后我们把上式看作:
这里注意,在当前第 t 轮,上式左侧的
发现一个方向
这里特别重要的一点是,
对上述目标进一步变化:
经过变换后,上式除了
Recap 一下,我们想找到一个方向
4.5 Steepest Descent
我们在上一小节中已经确认了让 AdaBoost loss function
对于 Gradient Descent 的标准套路,
- 不能直接计算出负梯度方向,而是通过一个子过程寻找一个近似最优函数方向,耗费时间
- 需要在最终模型上多集成一个函数,这直接影响最终模型使用性能
所以,我们希望每走一步,都尽可能走最大的一步,尽量减少走的步数。上一小节,我们固定
由于上式只有一个未知数
上式即标准的 AdaBoost 计算 weak classifier 相关权重的公式
现在可以完整地说:AdaBoost 每一次迭代,会选取一个函数
- Adaboost详解
- Adaboost详解
- Adaboost 详解
- Adaboost ,gbdt 原理详解
- Adaboost 训练详解
- AdaBoost算法详解
- AdaBoost算法详解
- 【机器学习】AdaBoost算法详解
- Adaboost训练过程的详解
- adaboost训练 之 参数详解
- Adaboost
- adaBoost
- adaboost
- Adaboost
- Adaboost
- AdaBoost
- AdaBoost
- AdaBoost
- G
- Power方法的实现
- *p和**p的区别
- 程序直接运行和用gdb单步执行结果不同
- 贝叶斯实战
- Adaboost 详解
- 迭代器模式
- 【BZOJ 2038】小Z的袜子 (莫队算法)
- 在Nuget管理器上安装MvvmLight框架,有时候会有如下提示: “MvvmLightLibs”已拥有为“CommonServiceLocator”定义的依赖项。
- Python-OpenCV图像阈值
- 异或
- 单通道子空间降噪法
- codeforces 808D Array Division(二分+思维)
- 暑假集训日记--8.17--树状数组+练习赛