AdaBoost
1. 主要思想
AdaBoost 属于集成学习,集成学习的思想是用很多个基学习器(弱学习器)来组合成一个强学习器,通俗一点解释就是“三个臭皮匠,顶个诸葛亮”。集成学习一般要求各个学习器之间要有差异,这样才有互补的效果。取极端情况来看,假设每个学习器都一模一样,那训练 100 个学习器能达到的准确率和只用一个就毫无区别。并且要求每个基学习器应该达到一定的准确率,至少要好于随机猜测。例如,在二分类任务上,基学习器的准确率至少应当大于50%。这两点,用一个词概括就是,基学习器应该“好而不同”。
集成学习可以分为两个类别,一类是各个学习器之间没有依赖关系,可以同时生成的并行化方法,比如 Bagging 和随机森林;另一类是各个学习器之间有依赖关系,需要串行生成的序列化方法,比如 Boosting 方法。而 AdaBoost 便属于 Boosting 的一种。
Boosting 的本意是“提升”,是将弱学习器提升为强学习器的一类算法。而 ada 是“自适应”(adaptive) 的缩写,结合起来就是“自适应提升”,主要体现在以下两点:
- 自动调节每个样本在每一轮训练中的权重,使得上一轮分错的样本能在后续中受到重视;
- 自动调节每个分类器在最后投票表决时的权重,使得正确率高的分类器在表决时拥有更大的话语权。
2. 算法流程
训练集 D = { { x 1 , y 1 } , … , { x N , y N } } , y i ∈ { + 1 , − 1 } D=\{\{\boldsymbol x_1,y_1\}, \dots, \{\boldsymbol x_N,y_N\}\}, y_i\in \{+1,-1\} D={{x1,y1},…,{xN,yN}},yi∈{+1,−1}
- 1 初始化每个样本的权重 w = ( w 1 , w 2 , … , w N ) \boldsymbol w=(w_1, w_2, \dots, w_N) w=(w1,w2,…,wN)
- 2 迭代
t
t
t 从
1
1
1 到
m
m
m
- 使用带有权重分布 w \boldsymbol w w 的样本 D 进行训练,得到一个弱分类器 f t ( x ) f_t(\boldsymbol x) ft(x)
- 计算此弱分类器的误差率 e t = ∑ i = 1 N w i I ( f t ( x i ) ≠ y i ) e_t=\sum_{i=1}^N w_i I(f_t(\boldsymbol x_i)\ne y_i) et=i=1∑NwiI(ft(xi)̸=yi)
- 若 e t > 0.5 e_t>0.5 et>0.5,退出循环
- 计算此分类器的权重 α t = 1 2 log 1 − e t e t \alpha_t=\frac{1}{2}\log \frac{1-e_t}{e_t} αt=21loget1−et
- 更新样本的权重 w i = w i × e − α t y i f t ( x i ) w_i=w_i\times e^{-\alpha_t y_i f_t(\boldsymbol x_i)} wi=wi×e−αtyift(xi),再对 w \boldsymbol w w 进行归一化
- 3 输出最终分类器:
F ( x ) = s i g n ( ∑ t = 1 m α t f t ( x ) ) F(\boldsymbol x)=sign(\sum_{t=1}^m \alpha_t f_t(\boldsymbol x)) F(x)=sign(t=1∑mαtft(x))
3 算法解析
从最终分类器的形式,我们可以看出,AdaBoost 是结合了 m 个学习器来做最终的预测,每个学习器 f t f_t ft 的话语权(即权重) α t \alpha_t αt 不一样。
3.1 好而不同
前面说过,集成学习需要各个基学习器好而不同,这在 AdaBoost 里是怎么体现的呢?
- “好”:要求每个学习器的准确率需要大于 0.5,因此当误差率 e t > 0.5 e_t>0.5 et>0.5 时,当前训练的基学习器不要,退出循环
- “不同”:各个学习器训练的样本都是一样的,但是各个样本的权重在每次迭代中都不一样,这个使得训练得到的学习器具有多样性
3.2 权重更新
AdaBoost 主要涉及两处权重更新
-
分类器权重更新
α t = 1 2 log 1 − e t e t = 1 2 log ( 1 e t − 1 ) \alpha_t=\frac{1}{2}\log \frac{1-e_t}{e_t}=\frac{1}{2}\log (\frac{1}{e_t}-1) αt=21loget1−et=21log(et1−1)- 因为错误率 e t < 0.5 e_t<0.5 et<0.5,所以 1 / e t − 1 > 1 , α t > 0 1/e_t-1>1, \alpha_t > 0 1/et−1>1,αt>0
- e t e_t et 越小,权重 α t \alpha_t αt 越大,即误差越小的分类器最后的话语权越大
-
样本权重更新
w i = w i × e − α t y i f t ( x i ) w_i=w_i\times e^{-\alpha_t y_i f_t(\boldsymbol x_i)} wi=wi×e−αtyift(xi)- 对于分类正确的样本: w i = w i × e − α t , α t > 0 , e − α t < 1 w_i=w_i\times e^{-\alpha_t}, \alpha_t>0, e^{-\alpha_t}<1 wi=wi×e−αt,αt>0,e−αt<1,所以 w i w_i wi 变小
- 对于分类错误的样本: w i = w i × e α t , α t > 0 , e α t > 1 w_i=w_i\times e^{\alpha_t}, \alpha_t>0, e^{\alpha_t}>1 wi=wi×eαt,αt>0,eαt>1,所以 w i w_i wi 变大
- 上一轮分错的样本会在下一轮受到更大的重视,增加分类器多样性,防止全体犯错
4. 公式推导
4.1 加法模型
加法模型是指集成的时候,为每个学习器分配一个权重,用这些学习器的加权求和来作为最终结果。
F
(
x
)
=
∑
t
=
1
m
α
t
f
t
(
x
;
Θ
t
)
F(x)=\sum_{t=1}^m \alpha_t f_t(x;\Theta_t)
F(x)=t=1∑mαtft(x;Θt) 其中
m
m
m 是学习器的个数,
Θ
t
\Theta_t
Θt 是学习器
f
t
f_t
ft 的参数。给定损失函数
L
(
y
i
,
F
(
x
i
)
)
L(y_i,F(x_i))
L(yi,F(xi)),得到训练加法模型的损失函数:
min
α
t
,
Θ
t
∑
i
=
1
N
L
(
y
i
,
∑
t
=
1
m
α
t
f
t
(
x
i
;
Θ
t
)
)
\min_{\alpha_t, \Theta_t}\sum_{i=1}^N L(y_i,\sum_{t=1}^m \alpha_t f_t(x_i;\Theta_t))
αt,Θtmini=1∑NL(yi,t=1∑mαtft(xi;Θt)) 这个模型的求解比较复杂,需要同时求
m
m
m 个学习器的参数
Θ
t
\Theta_t
Θt 和其系数
α
t
\alpha_t
αt。
4.2 前向分步算法
前向分步算法(forward stagewise algorithm)的思想是:从前往后,每一步只学习一个学习器及其系数,逐渐逼近加法模型的优化目标。首先初始化
f
0
(
x
)
=
0
,
α
0
=
0
f_0(x)=0, \alpha_0=0
f0(x)=0,α0=0,之后每一步的求解目标如下:
min
α
t
,
Θ
t
∑
i
=
1
N
L
(
y
i
,
F
t
−
1
(
x
)
+
α
t
f
t
(
x
i
;
Θ
t
)
)
\min_{\alpha_t, \Theta_t}\sum_{i=1}^N L(y_i,F_{t-1}(x)+ \alpha_t f_t(x_i;\Theta_t))
αt,Θtmini=1∑NL(yi,Ft−1(x)+αtft(xi;Θt)) 其中
F
t
−
1
(
x
)
F_{t-1}(x)
Ft−1(x) 表示前
t
−
1
t-1
t−1 个学习器的加权求和:
F
t
−
1
(
x
)
=
∑
k
=
0
t
−
1
α
k
f
k
(
x
)
F_{t-1}(x)=\sum_{k=0}^{t-1}\alpha_k f_k(x)
Ft−1(x)=k=0∑t−1αkfk(x) 这样每一步只需要求解一个学习器的参数和系数,大大降低了求解的难度和复杂度。
4.3 AdaBoost 的公式推导
当前向分布算法的损失函数取指数损失函数时,即:
L
(
y
,
f
(
x
)
)
=
e
−
y
f
(
x
)
L(y,f(x))=e^{-yf(x)}
L(y,f(x))=e−yf(x) 便是前面提到的 AdaBoost 算法。可以证明,此时用前向分步算法得到的
α
t
,
Θ
t
\alpha_t, \Theta_t
αt,Θt 的更新公式与前面 AdaBoost 的算法流程一样。把指数损失函数代入前向分步算法里,得到
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ & \min_{\alpha…
- 固定
α
t
>
0
\alpha_t>0
αt>0,优化
Θ
t
\Theta_t
Θt,等价于:
min Θ t ∑ i = 1 N w i ⋅ I ( y i ≠ f t ( x i ; Θ t ) ) \min_{\Theta_t}\sum_{i=1}^N w_i\cdot I(y_i \ne f_t(x_i; \Theta_t)) Θtmini=1∑Nwi⋅I(yi̸=ft(xi;Θt)) 这个更新公式和 AdaBoost 算法流程里的 “使用带有权重分布 w \boldsymbol w w 的样本 D 进行训练,得到一个弱分类器 f t ( x ) f_t(\boldsymbol x) ft(x)” 描述的一致。 - 固定
Θ
t
\Theta_t
Θt,更新
α
t
\alpha_t
αt
min α t ∑ i = 1 N w i ⋅ e − y i α t f t ( x i ; Θ t ) = min α t ∑ y i ≠ f t ( x i ; Θ t ) w i e α t + ∑ y i = f t ( x i ; Θ t ) w i e − α t = min α t ∑ y i ≠ f t ( x i ; Θ t ) w i e α t + ∑ y i = f t ( x i ; Θ t ) w i e − α t + ∑ y i ≠ f t ( x i ; Θ t ) w i e − α t − ∑ y i ≠ f t ( x i ; Θ t ) w i e − α t = min α t ( e α t − e − α t ) ∑ i = 1 N w i ⋅ I ( y i ≠ f t ( x i ; Θ t ) + e − α t ∑ i = 1 N w i = min α t ( e α t − e − α t ) e t + e − α t ( 除 以 ∑ i = 1 N w i ) \begin{aligned} & \min_{\alpha_t}\sum_{i=1}^N w_i\cdot e^{-y_i \alpha_t f_t(x_i;\Theta_t)} \\ =& \min_{\alpha_t} \sum_{y_i \ne f_t(x_i;\Theta_t)} w_i e^{\alpha_t}+\sum_{y_i = f_t(x_i;\Theta_t)} w_i e^{-\alpha_t} \\ =& \min_{\alpha_t} \sum_{y_i \ne f_t(x_i;\Theta_t)} w_i e^{\alpha_t}+\sum_{y_i = f_t(x_i;\Theta_t)} w_i e^{-\alpha_t}+\sum_{y_i \ne f_t(x_i;\Theta_t)} w_i e^{-\alpha_t} - \sum_{y_i \ne f_t(x_i;\Theta_t)} w_i e^{-\alpha_t}\\ =& \min_{\alpha_t} (e^{\alpha_t}-e^{-\alpha_t})\sum_{i=1}^N w_i \cdot I(y_i \ne f_t(x_i; \Theta_t) + e^{-\alpha_t}\sum_{i=1}^N w_i \\ =& \min_{\alpha_t} (e^{\alpha_t}-e^{-\alpha_t})e_t + e^{-\alpha_t} \quad (除以 \sum_{i=1}^N w_i) \end{aligned} ====αtmini=1∑Nwi⋅e−yiαtft(xi;Θt)αtminyi̸=ft(xi;Θt)∑wieαt+yi=ft(xi;Θt)∑wie−αtαtminyi̸=ft(xi;Θt)∑wieαt+yi=ft(xi;Θt)∑wie−αt+yi̸=ft(xi;Θt)∑wie−αt−yi̸=ft(xi;Θt)∑wie−αtαtmin(eαt−e−αt)i=1∑Nwi⋅I(yi̸=ft(xi;Θt)+e−αti=1∑Nwiαtmin(eαt−e−αt)et+e−αt(除以i=1∑Nwi) 其中 e t e_t et 是第 t t t 个学习器的分类误差率:
e t = ∑ i = 1 N w i ⋅ I ( y i ≠ f t ( x i ; Θ t ) ∑ i = 1 N w i e_t=\frac{\sum_{i=1}^N w_i \cdot I(y_i \ne f_t(x_i; \Theta_t)}{\sum_{i=1}^N w_i} et=∑i=1Nwi∑i=1Nwi⋅I(yi̸=ft(xi;Θt) 对 α t \alpha_t αt 求导,令导数为 0,得到:
( e α t + e − α t ) e t − e − α t = 0 (e^{\alpha_t}+e^{-\alpha_t})e_t-e^{-\alpha_t}=0 (eαt+e−αt)et−e−αt=0 乘以 e α t e^{\alpha_t} eαt,得到:
( e 2 α t + 1 ) e t − 1 = 0 (e^{2\alpha_t}+1)e_t-1=0 (e2αt+1)et−1=0 因此
α t = 1 2 log 1 − e t e t \alpha_t=\frac{1}{2}\log \frac{1-e_t}{e_t} αt=21loget1−et 此更新公式也与 AdaBoost 一致 - 样本权重
w
i
w_i
wi 的更新
前面定义了:
w i = e − y i F t − 1 ( x ) w_i=e^{-y_i F_{t-1}(x)} wi=e−yiFt−1(x) 在第 t t t 轮时, F t ( x ) = F t − 1 ( x ) + α t f t ( x i ; Θ t ) F_t(x)=F_{t-1}(x)+ \alpha_t f_t(x_i;\Theta_t) Ft(x)=Ft−1(x)+αtft(xi;Θt),因此下一轮的 w i ′ w_i' wi′ 为:
w i ′ = e − y i F t ( x ) = e − y i ( F t − 1 ( x ) + α t f t ( x i ; Θ t ) ) = w i ⋅ e − y i α t f t ( x i ; Θ t ) w_i'=e^{-y_i F_{t}(x)}=e^{-y_i(F_{t-1}(x)+ \alpha_t f_t(x_i;\Theta_t))}=w_i \cdot e^{-y_i \alpha_t f_t(x_i;\Theta_t)} wi′=e−yiFt(x)=e−yi(Ft−1(x)+αtft(xi;Θt))=wi⋅e−yiαtft(xi;Θt) 除了归一化之外,此更新公式也与 AdaBoost 一致。