一个问题
今天跟超哥讨论了一下AdaBoost,结果发现自己有老多东西不懂啊~
其中有个问题:样本的权重W如何在弱分类器中使用?现在好好地梳理一下AdaBoost,细节也好好地想一想。
看博客得知:样本权重W不会在训练弱分类器中使用,只是在求弱分类器的误差时使用。
上面的回答正确与否呢?答案是让人失望的,有的博客并不尽人意,还是自己去查阅论文吧。
现在看论文《AdaBoost and the Super Bowl of Classifiers A Tutorial Introduction to Adaptive Boosting》,其中4页介绍到,只需要m轮迭代时,只需要找到分类器Km,该分类器使得We最小即可,We是之前的满足本次Km!=label 的样本权重之和。权重是累计之前的。
原作者 Yoav.Freund and Robert.Shapire《A decision-theoretic generalization of on-line learning and an application to boosting》里,是如何解释的呢?在其伪代码中,步骤2中,”Call weak learning algorithm, providing it with the distribution p; get back a hypothesis h”,此处的p相当于样本权重W,说明也是在弱学习器的训练时,是基于样本的分布W的.
所以,样本权重W是在训练新的弱分类器时,构造代价函数使用。
“We call the algorithm AdaBoost because, unlike previous algorithm, it adjusts adaptively to the errors of the weak hypotheses returned by weak learn algorithm“—解释为什么叫AdaBoost。
下面详细介绍一下AdaBoost的推导过程,此过程了解后,Adaboost的基本也就没问题了。Adaboost (adaptive boosting)利用的是boosting的思想,将多个弱分类器集成为一个强分类器。\
http://private.codecogs.com/latex/eqneditor.php(公式编辑及转换为Latex)
AdaBoost算法原理推导
AdaBoost的分类器由多个弱分类器组成.
C
m
(
X
i
)
=
C
(
m
−
1
)
(
X
i
)
+
α
m
∗
K
m
(
X
i
)
C_{m}(X_{i})=C_{(m-1)}(X_{i})+\alpha_{m}*K_{m}(X_{i})
Cm(Xi)=C(m−1)(Xi)+αm∗Km(Xi)
α
m
\alpha_{m}
αm 是当前分类器
K
m
K_{m}
Km的权重。
C
m
(
X
i
)
C_{m}(X_{i})
Cm(Xi)是m个弱分类器集成后的分类器。
假设是二分类问题,选择指数loss function, 错判的代价为
e
β
e^{\beta}
eβ,对判的代价为
e
−
β
e^{-\beta}
e−β。其中
β
>
0
\beta>0
β>0。
总代价: 训练本次弱分类器,总体模型的代价都计算在内。
E
=
∑
w
i
e
−
y
i
∗
C
m
(
X
i
)
E = \sum w_ie^{-y_{i}*C_{m}(X_{i})}
E=∑wie−yi∗Cm(Xi)每条样本的权重都计算在内
=
∑
w
i
e
−
y
i
∗
[
C
m
−
1
(
X
i
)
+
α
m
∗
K
m
(
X
i
)
]
=\sum w_ie^{-y_{i}*[C_{m-1}(X_{i}) + \alpha_{m} * K_{m}(X_{i})]}
=∑wie−yi∗[Cm−1(Xi)+αm∗Km(Xi)]
令
W
i
m
=
w
i
e
−
y
i
∗
C
m
−
1
(
X
i
)
W_{i}^{m}=w_ie^{ -y_{i}*C_{m-1}(X_{i}) }
Wim=wie−yi∗Cm−1(Xi)
=
∑
W
i
m
∗
e
−
y
i
∗
α
m
∗
K
m
(
X
i
)
=\sum W_{i}^{m} * e^{-y_{i}*\alpha_{m} * K_{m}(X_{i})}
=∑Wim∗e−yi∗αm∗Km(Xi)
=
∑
i
=
1
N
W
i
m
∗
e
−
y
i
∗
α
m
∗
K
m
(
X
i
)
=\sum_{i=1}^{N}W_{i}^{m} * e^{-y_{i}*\alpha_{m} * K_{m}(X_{i})}
=∑i=1NWim∗e−yi∗αm∗Km(Xi)
=
∑
y
i
=
K
m
W
i
m
∗
e
−
α
m
+
∑
y
i
≠
K
m
W
i
m
∗
e
+
α
m
=\sum_{y_{i}=K_{m}} W_{i}^{m}*e^{-\alpha_{m}} + \sum_{y_{i} \neq K_{m}}W_{i}^{m}*e^{+\alpha_{m}}
=∑yi=KmWim∗e−αm+∑yi̸=KmWim∗e+αm
令
∑
y
i
=
K
m
W
i
m
=
W
c
\sum_{y_{i}=K_{m}} W_{i}^{m} = W_{c}
∑yi=KmWim=Wc
令
∑
y
i
≠
K
m
W
i
m
=
W
e
\sum_{y_{i} \neq K_{m}} W_{i}^{m} = W_{e}
∑yi̸=KmWim=We
=
W
c
∗
e
−
α
m
+
W
e
∗
e
α
m
=W_{c}*e^{-\alpha_{m}} +W_{e}* e^{\alpha_{m}}
=Wc∗e−αm+We∗eαm
进一步推导,得出如何用总体的代价,得到当前迭代弱分类器的代价。
e
α
m
∗
E
=
W
c
+
W
e
∗
e
2
∗
α
m
e^{\alpha_m}*E = W_{c}+W_{e}*e^{2*\alpha_{m}}
eαm∗E=Wc+We∗e2∗αm
e
α
m
∗
E
=
(
W
c
+
W
e
)
+
W
e
∗
(
e
2
∗
α
−
1
)
e^{\alpha_m}*E =( W_{c}+W_{e})+W_{e}*(e^{2*\alpha}-1)
eαm∗E=(Wc+We)+We∗(e2∗α−1)
上式中,在本轮迭代中
W
c
+
W
e
=
W
W_{c}+W_{e}=W
Wc+We=W是固定值,只需要减少
W
e
W_{e}
We即可。(这里给出了单个弱学习器的目标代价函数
W
e
W_{e}
We)
==========================================================
解释下,为什么在伪代码中单个弱学习器为什么只需要降低
∑
y
i
≠
K
m
w
i
\sum_{y_i\neq K_m}w_i
∑yi̸=Kmwi即可。
已知:
W
c
+
W
e
=
W
=
∑
W
i
m
=
∑
w
i
e
−
y
i
∗
C
m
−
1
W_c+W_e=W=\sum W_i^m=\sum w_i e^{-y_i*C_{m-1}}
Wc+We=W=∑Wim=∑wie−yi∗Cm−1是固定值;
则
W
e
↓
⟶
{
e
α
m
E
}
↓
W_e \downarrow \longrightarrow \{ e^{\alpha_m}E\} \downarrow
We↓⟶{eαmE}↓;
其中
W
e
=
∑
y
i
≠
K
m
W
i
m
=
∑
y
i
≠
K
m
w
i
e
−
y
i
C
m
−
1
⩽
上
限
值
∑
y
i
≠
K
m
w
i
e
W_e=\sum_{y_i\neq K_m}W_i^m=\sum_{y_i \neq K_m}w_ie^{-y_iC_{m-1}} \leqslant 上限值 \sum_{y_i\neq K_m}w_i e
We=∑yi̸=KmWim=∑yi̸=Kmwie−yiCm−1⩽上限值∑yi̸=Kmwie;
单个弱学习器的优化,只需要降低
W
e
W_e
We的上限值
∑
y
i
≠
K
m
w
i
e
\sum_{y_i\neq K_m}w_i e
∑yi̸=Kmwie即可;
同时上限值
∑
y
i
≠
K
m
w
i
e
∝
∑
y
i
≠
K
m
w
i
\sum_{y_i\neq K_m}w_i e\propto \sum_{y_i\neq K_m}w_i
∑yi̸=Kmwie∝∑yi̸=Kmwi,优化目标又可化为
m
i
n
∑
y
i
≠
K
m
w
i
min \sum_{y_i\neq K_m}w_i
min∑yi̸=Kmwi。
==========================================================
如何确定本轮迭代的
α
m
\alpha_{m}
αm值呢?
对总代价函数的
α
m
\alpha_{m}
αm求导
d
E
d
α
m
=
−
W
c
∗
e
−
α
m
+
W
e
∗
e
α
m
\frac{dE}{d\alpha_{m}}=-W_{c}*e^{-\alpha_{m}}+W_{e}*e^{\alpha_{m}}
dαmdE=−Wc∗e−αm+We∗eαm
令上式等于0,则有
α
m
=
1
2
∗
ln
W
c
W
e
⟶
=
1
2
∗
ln
W
−
W
e
W
e
⟶
=
1
2
∗
ln
1
−
W
e
W
W
e
W
\alpha_{m} = \frac{1}{2}* \ln{\frac{W_{c}}{W_{e}}} \longrightarrow =\frac{1}{2}* \ln{ \frac{W-W_{e}}{W_{e}} } \longrightarrow =\frac{1}{2}* \ln{ \frac{ 1-\frac{W_{e}}{W} }{\frac{W_{e}}{W}} }
αm=21∗lnWeWc⟶=21∗lnWeW−We⟶=21∗lnWWe1−WWe
其中,
W
e
W
\frac{W_{e}}{W}
WWe是本轮迭代中
y
i
≠
K
m
y_{i}\neq K_{m}
yi̸=Km的样本权重之和在总权重之和的比例。注意这里不是误差率。
对判对和判错的样本的权重进行调整,以便之后的模型更关注那些判错的样本(对其误判之后代价更大)。
判错的样本权重增加
W
e
=
W
i
m
+
1
=
W
i
m
∗
e
α
m
W_{e} = W_{i}^{m+1} = W_{i}^{m}*e^{\alpha_m}
We=Wim+1=Wim∗eαm
判对的样本权重降低
W
c
=
W
i
m
+
1
=
W
i
m
∗
e
−
α
m
W_{c} = W_{i}^{m+1} = W_{i}^{m}*e^{-\alpha_m}
Wc=Wim+1=Wim∗e−αm
截止到目前为止,AdaBoost的推导大体也就完成了,对其数学理论了解也够深入了。
AdaBoost伪代码(二分类问题)
1. 初始化样本权重Wi=1/N i=1,2,3...N.
2. 训练弱学习器Km,使得We最小
We = ∑ Wi ,其中条件为当前Km != y
3. 弱学习器的系数a
em = We/W ,其中W = ∑ Wi
a = 1/2 * ln[(1-em)/em]
4. 更新样本权重
Wi = Wi * e^(a), 判错的样本
Wi = Wi * e^(-a), 判对的样本
5. 重复步骤2到步骤4,直到达到迭代次数M(或者是em小于某个值)。其中M意味着有M个弱学习器集成最后的强学习器。
每次迭代更新的是样本分布(re weight),不是重采样。那么,我也弄明白了样本权重是怎么回事,是怎么用的。对AdaBoost又有了进一步的了解。
总结:
多个分类器加到一起,怎么加呢,每个分类器有个分类器权重 α \alpha α,这样通过总分类器 C m ( X i ) C_{m}(X_{i}) Cm(Xi),构造一个指数代价函数 E = ∑ i = 1 N e − y i ∗ C m ( X i ) E=\sum_{i=1}^{N}{e^{-y_{i}*C_{m}(X_{i})}} E=∑i=1Ne−yi∗Cm(Xi)。代价函数 E E E,同时给出了弱学习器的训练约束条件: W e W_{e} We最小即可。对 E E E的 α \alpha α求导,可以推导出 α \alpha α的计算公式。还要记得更新样本权重 W i W_{i} Wi,使得当前弱分类器下分错的样本权重更大,分对的更小。AdaBoost的全部核心东西就这几句话。