AdaBoost分类器概述
—— 才疏学浅, 难免有错误和遗漏, 欢迎补充和勘误.
-
AdaBoost算法在1995年由Freund和Shapired提出,它是机器学习领域中一种重要的特征分类方法,其可以训练一系列的弱分类器 G k ( x ) G_k(x) Gk(x)来获得最终的一个强分类器 F ( x ) F(x) F(x)。但是因为其计算量太大,所以迟迟未能应用在人脸检测领域。直到2001年Jones与Viola两位教授把Haar-like特征以及积分图的概念引入到Adaboost中,才将用Haar级联分类器来检测人脸的方法推入了历史舞台。
-
下面以二分类人脸检测为例通过把 m m m个样本数据 T T T通过 k k k个弱分类器 G k ( x ) G_k(x) Gk(x)训练成强分类器 F ( x ) F(x) F(x)的过程对Adaboost迭代算法进行概述, k k k为进行到第 m m m轮的弱分类器训练, G k ( x ) G_k(x) Gk(x)为第 k k k个弱分类器:
- 假定有
m
m
m个样本构成一个样本集合
T
T
T:
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x i , y i ) , . . . , ( x m , y m ) } ; i = 1 , 2... m T = \left\{ {\left( {x_1,y_1} \right),\left( {x_2,y_2} \right),...,\left( {x_i,y_i} \right),{\rm{ }}...{\rm{ }},\left( {x_m,y_m} \right)} \right\}{\rm{ }};i = 1,2...m T={(x1,y1),(x2,y2),...,(xi,yi),...,(xm,ym)};i=1,2...m - 其中 x i x_i xi为样本的描述, y i ∈ ( 1 , − 1 ) y_i \in (1, - 1) yi∈(1,−1)为样本的标识。在人脸检测中 x i x_i xi可以是每张图片的序号,该图片为正样本时 y i = 1 y_i = 1 yi=1时,即为人脸图像;该图片为负样本时 y i = − 1 y_i = -1 yi=−1,即为非人脸图像。下面对该样本进行分类训练:
- 参数初始化
- 在第一轮训练中样本的权重系数分布
D
(
1
)
D(1)
D(1)都设置为
1
m
\frac{1}{m}
m1,其中
ω
k
i
\omega _{ki}
ωki代表第
k
k
k轮第
i
i
i个样本的权重。
D ( 1 ) = { ω 11 , ω 12 , . . . ω 1 m } ; ω 1 i = 1 m ; i = 1 , 2... m D(1) = \left\{ {\omega _{11},\omega _{12},...\omega _{1m}} \right\};\omega _{1i} = \frac{1}{m};i = 1,2...m D(1)={ω11,ω12,...ω1m};ω1i=m1;i=1,2...m - 在第一轮中把每一个样本点的权重都初始化为 D ( 1 ) = 1 m D(1) = \frac{1}{m} D(1)=m1,这样能够保证在训练第一个弱分类器 G 1 ( x ) G1(x) G1(x)时每个样本点起的作用是一样的。
- 计算分类误差率 e k e_k ek
- 遍历样本集中
x
x
x的阈值分界点
v
v
v,对于每一个弱分类器
G
k
(
x
)
G_k(x)
Gk(x),计算该轮分类的误差率
e
k
e_k
ek,选取使样本序号
x
x
x在以
v
v
v为分界点时分类误差率
e
k
e_k
ek最低时的阈值
v
v
v ,并最终确定该轮下的弱分类器:
G k ( x ) = { 1 p i x < p i v 0 otherwise G_{k}(x)= \begin{cases}1 & p_{i} x<p_{i} v \\ 0 & \text { otherwise }\end{cases} Gk(x)={10pix<piv otherwise
弱分类器 G k ( x ) G_k(x) Gk(x)的值为1说明该图片是人脸图像,值为0时说明该图片是非人脸图像; p i p_i pi的作用是确定不等号的方向。分类误差率计算公式为: e k = P ( G k ( x i ) ≠ y i ) = ∑ i = 1 m ω k i I ( G k ( x i ) ≠ y i ) e_k = P(G_k(x_i) \ne y_i) = \sum\limits_{i = 1}^m {\omega _{ki}I} (G_k(x_i) \ne y_i) ek=P(Gk(xi)=yi)=i=1∑mωkiI(Gk(xi)=yi) - 其中 I ( G k ( x i ) ≠ y i ) = { 1 G k ( x i ) ≠ y i 0 G k ( x i ) = y i I\left(G_{k}\left(x_{i}\right) \neq y_{i}\right)= \begin{cases}1 & G_{k}\left(x_{i}\right) \neq y_{i} \\ 0 & G_{k}\left(x_{i}\right)=y_{i}\end{cases} I(Gk(xi)=yi)={10Gk(xi)=yiGk(xi)=yi,即让第 k k k轮第 i i i个样本的权重 ω k i \omega_{ki} ωki乘以0或1再求和,其中当分类器的判断是正确时( G k ( x i ) = y i G_k(x_i) = y_i Gk(xi)=yi)为0,错误时( G k ( x i ) ≠ y i G_k(x_i) \ne y_i Gk(xi)=yi)为1。即经此计算后可以得到该轮分类的误差。
- 计算弱分类器的权重系数 α k \alpha _k αk
- 因为Adaboost是加法模型、前向分步学习算法,又通过对Adaboost算法中指数型的损失函数进行优化,对损失函数Loss求偏导( ∂ L o s s ∂ α \frac{{\partial Loss}}{{\partial \alpha }} ∂α∂Loss)令其等于0,计算出 α k \alpha _k αk和 e k e_k ek的关系: α k = 1 2 log 1 − e k e k \alpha _k = \frac{1}{2}\log \frac{{1 - e_k}}{{e_k}} αk=21logek1−ek
- 经此计算后,达到分类误差 e k e_k ek越高的弱分类器 G k ( x ) G_k(x) Gk(x)其权重系数 α k \alpha _k αk越小的目的,这样可以提高检测准确率。
- 更新下一轮每个样本点的权重系数: ω k + 1 , i = ω k i Z k exp ( − α k y i G k ( x i ) ) \omega _{k + 1,i} = \frac{{\omega _{ki}}}{{Z_k}}\exp ( - \alpha _ky_iG_k(x_i)) ωk+1,i=Zkωkiexp(−αkyiGk(xi))
- 其中 Z k Z_k Zk是规范化因子, Z k = ∑ i = 1 m ω k i exp ( − α k y i G k ( x i ) ) Z_{k}=\sum_{i=1}^{m} \omega_{k i} \exp \left(-\alpha_{k} y_{i} G_{k}\left(x_{i}\right)\right) Zk=∑i=1mωkiexp(−αkyiGk(xi)),作用是将样本权重归一化。如果某个样本被错误分类,会导致 y i G k ( x i ) < 0 y_iG_k(x_i) < 0 yiGk(xi)<0,导致在下一轮的分类中权重 ω \omega ω变大进而影响样本描述 x x x的分类阈值 v v v,从而达到了更重视错误样本分类工作的目的。
- 经过该计算后得到了该轮所有的样本权重:
D ( k + 1 ) = { ω ( k + 1 ) 1 , ω ( k + 1 ) 2 , … ω ( k + 1 ) m } ; ∑ 1 m ω ( k + 1 ) i = 1 D(k+1)=\{\omega_{(k+1) 1}, \omega_{(k+1) 2}, \ldots \omega_{(k+1) m}\} ; \sum_{1}^{m} \omega_{(k+1) i}=1 D(k+1)={ω(k+1)1,ω(k+1)2,…ω(k+1)m};∑1mω(k+1)i=1 - 再去重复步骤2.-4.,直至所有的弱分类器训练完毕。
- 生成最终的强分类器 F ( x ) F(x) F(x)
- Adaboost生成最终强分类器采用的方法是弱分类器的加权求和法,将每一级弱分类器乘以一个权重后再相加形成最终的强分类器:
F ( x ) = sign ( ∑ k = 1 K α k G k ( x ) ) = { 1 ∑ k = 1 K α k G k ( x ) > 0 0 ∑ k = 1 K α k G k ( x ) = 0 − 1 ∑ k = 1 K α k G k ( x ) < 0 F(x)=\operatorname{sign}\left(\sum_{\mathrm{k}=1}^{K} \alpha_{k} G_{k}(x)\right)=\left\{\begin{array}{cl}1 & \sum_{\mathrm{k}=1}^{K} \alpha_{k} G_{k}(x)>0 \\ 0 & \sum_{\mathrm{k}=1}^{K} \alpha_{k} G_{k}(x)=0 \\ -1 & \sum_{\mathrm{k}=1}^{K} \alpha_{k} G_{k}(x)<0\end{array}\right. F(x)=sign(∑k=1KαkGk(x))=⎩⎪⎨⎪⎧10−1∑k=1KαkGk(x)>0∑k=1KαkGk(x)=0∑k=1KαkGk(x)<0 - 其中 K K K为弱学习器的迭代次数, F ( x ) = 1 F(x) = 1 F(x)=1代表通过, F ( x ) = − 1 F(x) = -1 F(x)=−1 代表不通过, F ( x ) = 0 F(x) = 0 F(x)=0 代表不操作。至此,一个由一系列弱分类器通过训练而获得的强分类器形成了。
最后将各个强分类器
F
i
(
x
)
F_i(x)
Fi(x)按一定的策略级联得到级联分类器: