1 回顾AdaBoost算法流程
Adaboost基本原理是将多个弱分类器加权组合,最终形成一个强分类器。算法中有两个重要的权重:样本权重和分类器权重。算法每一次迭代中只投入一个弱分类器进行训练,当前加权样本上计算得到误差,并通过误差来计算此分类器的权重,并更新样本的权重
1.1 模型参数
样本:
{(x1,y1),(x2,y2)...(xn,yn)},其中
yi∈{−1,1}
分类器:
{k1,k2...kl},其中
kj(xi)∈{−1,1}
样本初始权重:
w(1)=(w1(1),w2(1)...wn(1))=(1,1,...,1)
1.2 算法流程
假设我们进行T次迭代(注:迭代次数不一定要等于分类器数量),则
对于 t = 1,2…,T
- 选择使得误差
Et 最小的分类器 k,并设其为
Ct
Et=i=1∑nj=1∑nwj(t)wi(t)I{yi̸=Ct(xi)}
- 通过误差可以计算该分类器的权重
at=21ln(Et1−Et)
- 接下来更新样本权重
wi(t+1)=j=1∑nwj(t)wi(t)exp{2atI{yi̸=Ct(xi)}}
end
1.3 算法结果
最终得到弱分类器的加权和
f(xi)=t=1∑TatCt(xi)
2 从优化角度推导Adaboost
2.1 推导过程
2.1.1 第一次迭代
首先我们考虑Adaboost第一次迭代,对于分类器的选择和权重的确定,可以化为一个简单的优化问题:
y∈{−1,1},设分类器f(xi)=a1C1(xi),其中C1(xi)∈{−1,1}
损失函数:L(yi,f(xi))=e−yif(xi)
总误差为:L(a1,C1)=i=1∑ne−yif(xi)=i=1∑ne−yia1C1(xi)
则我们目标是求解优化问题:
(a1^,C1^)=argmina1,C1L(a1,C1)
证明:
L(a1,C1)=i=1∑ne−yia1C1(xi)
=i=1∑ne−a1I{yi=C1(xi)}+i=1∑nea1I{yi̸=C1(xi)} (∗)
=i=1∑ne−a1I{yi=C1(xi)}+i=1∑ne−a1I{yi̸=C1(xi)}
−i=1∑ne−a1I{yi̸=C1(xi)}+i=1∑nea1I{yi̸=C1(xi)} (∗∗)
=i=1∑ne−a1+i=1∑n(ea1−e−a1)I{yi̸=C1(xi)}
=ne−a1+(ea1−e−a1)i=1∑nI{yi̸=C1(xi)}
所以
C1^=argminC1i=1∑nI{yi̸=C1(xi)}
此时分类器在样本上的误判率为
E1=n1i=1∑nI{yi̸=C1(xi)}
从式子中可以看到,为了使得总体误差最小化,我们需要选择一个使得误判率
E1最小的分类器。
确定了
C1^ 后,下面来求
a1^,对
L(a1,C1) 求一阶导
L(a1,C1)=n[e−a1+(ea1−e−a1)E1]
∂a1∂L(a1,C1)=n[−e−a1+(ea1+e−a1)E1]=0
⇒−1+(e2a1+1)E1=0
⇒a1^=21lnE11−E1
观察
a1^,我们发现当误判率
E1 越大时,
a1^ 越小,这很符合我们的直观理解:当这个弱分类器分类效果较差时,我们就给予它较小的权重,以减小对正确结果的影响
2.1.2 第二次迭代
下面我们在第一个分类器的基础上,再加入一个弱分类器,对于这个分类器的选择和权重确定,同样是一个优化问题:
y∈{−1,1},设分类器f(xi)=a1^C1^(xi)+a2C2(xi),其中C2(xi)∈{−1,1}
损失函数(没变):L(yi,f(xi))=e−yif(xi)
总误差为:L(a2,C2)=i=1∑ne−yif(xi)=i=1∑ne−yi[a1^C1^(xi)+a2C2(xi)]
则我们目标是求解优化问题:
(a2^,C2^)=argmina2,C2L(a2,C2)
(注:此时分类器中
a1^和
C1^是确定的,因为我们在2.1.1的第一步优化中已经把其解出了)
证明:
L(a2,C2)=i=1∑ne−yi[a1^C1^(xi)+a2C2(xi)]
=i=1∑ne−yia1^C1^(xi)e−yia2C2(xi)
(设
wi=e−yia1^C1^(xi))
=i=1∑nwie−yia2C2(xi)
(对等式做2.1.1中
(∗)(∗∗)中相同处理,这里只是多了一个
mi)
=i=1∑nwie−a2+i=1∑nwi(ea2−e−a2)I{yi̸=C2(xi)}}
=e−a2i=1∑nwi+(ea2−e−a2)i=1∑nwiI{yi̸=C2(xi)}}
所以
C2^=argminC2i=1∑nwiI{yi̸=C2(xi)}
此时分类器在样本上的误判率为
E2=j=1∑nwji=1∑nwiI{yi̸=C1(xi)}
(j=1∑nwj为归一化常数,这里去掉该常数定义E2也是可以的)
从式子中可以看到,在这一步优化中,为了使得总体误差最小化,我们需要选择一个使得加权误判率
E2最小的分类器。
注意这里的加权二字,我们可以把
wi 看作样本权重,其中
wi=e−yia1^C1^(xi)={e−a1^ yi=C1^(xi)ea1^ yi̸=C1^(xi)
(其实在第一次迭代中
wi 也是存在的,不过我们默认其初始值为
{1,1,...1},所以没有特意写出)
我们可以看到,
mi 实际上是由第一个分类器决定的,它和大小
C1^ 的分类效果有关:
1. 当
C1^(xi)分类正确时,如果
C1^ 对所有样本的分类越准确,
ai^就越大,从而使得
wi 越小。
如果
C1^ 对所有样本的分类越差,
ai^就越小,从而使得
wi 越大。
2. 当
C1^(xi)分类错误时,如果
C1^ 对所有样本的分类越准确,
ai^就越大,从而使得
wi 越大。
如果
C1^ 对所有样本的分类越差,
ai^就越小,从而使得
wi 越小。
可以这样理解,好的分类器分错样本时,说明该样本容易分错,应增加权重,加强对其的训练。而差的分类器分类结果本来就很随意,分正确一个样本并没有太多意义,所以仍然要增强训练。
确定了
C2^ 后,下面来求
a2^,对
L(a2,C2) 求一阶导
L(a2,C2)=i=1∑nwi[e−a2+(ea2−e−a2)E2]
∂a2∂L(a2,C2)=i=1∑nwi[−e−a2+(ea2+e−a2)E2]=0
⇒−1+(e2a2+1)E2=0
⇒a2^=21lnE21−E2
有了前两个分类器的参数,我们可以计算一下第三次迭代的样本权重
wi3=e−yi[a1^C1^(xi)+a2^C2^(xi)]=wi2e−yia2^C2^(xi)
根据式子的规律,第k次迭代的样本权重就为
wik=wik−1e−yiak−1^Ck−1^(xi)
2.1.2 第k次迭代
到了第k次迭代,我们已经得到了k-1个弱分类器加权组成的分类器,下面就要计算第k个分类器的各个参数
分类器为f(xi)=t=1∑k−1at^Ct^(xi)+akCk(xi)
-
此次迭代的样本权重为(由前k-1个分类器决定)
wik=wik−1e−yiak−1^Ck−1^(xi)
-
选择的分类器为
Ck^=argminCki=1∑nwikI{yi̸=Ck(xi)}
其中误判率为
Ek=j=1∑nwjki=1∑nwikI{yi̸=Ck(xi)}
(也就是选择使得加权误判率最小的分类器,可以回顾一下文章开始,adaboost算法的确是这么做的)
-
计算该分类器的权重
ak=21ln(Ek1−Ek)
-
更新下一次迭代的样本权重
(步骤1实际上是k-1次迭代的步骤4,这里为了方便说明就都写上了)
wik+1=wike−yiak^Ck^(xi)
可以看到步骤2、3的公式都和文章开始的算法中的一致了,更新样本权重的公式有差别,但实际上是一样的,下面给出推导:
算法中的公式为
wi(k+1)=j=1∑nwj(k)wi(k)exp{2ak^I{yi̸=Ck^(xi)}}
我们推出的公式为
wik+1=wike−yiak^Ck^(xi)=wike−ak^eak^[1−yiCk^(xi)]
而 1−yiCk^(xi)={0 yi=Ck^(xi)2 yi̸=Ck^(xi)=2I{yi̸=Ck^(xi)}
所以 wik+1=wike−ak^e2ak^I{yi̸=Ck^(xi)}
∝j=1∑nwj(k)wi(k)exp{2ak^I{yi̸=Ck^(xi)}}
(j=1∑nwj(k)为归一化常数)
2.2 总结
Adaboost 算法最终的的分类器是
f(xi)=t=1∑TatCt(xi)
所以实际上Adaboost想优化的问题是
i=1∑nL(yi,f(xi))
但由于参数过多,直接优化容易导致过拟合问题,所以考虑加入惩罚项
i=1∑nL(yi,f(xi))+λ1∣∣a∣∣+λ1∣∣C∣∣
此优化问题非常复杂,难以求解,所以我们采用上面这种每次优化一个分类器的优化算法。该算法不仅解决了复杂性的问题,而且达到的结果是和上式是一致的。