SVM(Support Vector Machine,支持向量机)是一个十分传统且好用的分类器,在二分类问题上有十分良好的表现。
拉格朗日乘子法是SVM参数优化的核心,它能够解决多个等式或不等式约束下的最优化问题。
例1,给定 x 1 − x 2 = 2 x_1-x_2=2 x1−x2=2,如何寻找 x 1 2 + x 2 2 x_1^2+x_2^2 x12+x22的最大值,此时 x 1 , x 2 x_1,x_2 x1,x2是多少?
拉格朗日乘子法的核心在于设立一个拉格朗日方程,将目标函数与约束函数的信息融合在一起,然后找寻该函数的最值。以上述情况为例,定义目标函数 f ( x 1 , x 2 ) = x 1 2 + x 2 2 f(x_1,x_2)=x_1^2+x_2^2 f(x1,x2)=x12+x22,约束函数 g ( x 1 , x 2 ) = x 1 − x 2 − 2 g(x_1,x_2)=x_1-x_2-2 g(x1,x2)=x1−x2−2。拉格朗日乘子法顾名思义,就是新设立一个变量乘在约束函数上,然后和目标函数相加。则可定义拉格朗日函数 L ( x 1 , x 2 , λ ) L(x_1,x_2,\lambda) L(x1,x2,λ)为:
L ( x 1 , x 2 , λ ) = f ( x 1 , x 2 ) + λ g ( x 1 , x 2 ) = x 1 2 + x 2 2 + λ ( x 1 − x 2 − 2 ) L(x_1,x_2,\lambda)=f(x_1,x_2)+\lambda g(x_1,x_2)=x_1^2+x_2^2+\lambda(x_1-x_2-2) L(x1,x2,λ)=f(x1,x2)+λg(x1,x2)=x12+x22+λ(x1−x2−2)
要求得上式的最值,需要各个变量的偏导数为零,所以必须满足:
∂ L ∂ x 1 = ∂ L ∂ x 2 = ∂ L ∂ λ = 0 \frac{\partial L}{\partial x_1}=\frac{\partial L}{\partial x_2}=\frac{\partial L}{\partial \lambda}=0 ∂x1∂L=∂x2∂L=∂λ∂L=0
将上式转换为等式组,有:
2 x 1 + λ = 0 2 x 2 − λ = 0 x 1 − x 2 − 2 = 0 2x_1+\lambda=0\\2x_2-\lambda=0\\x_1-x_2-2=0 2x1+λ=02x2−λ=0x1−x2−2=0
求解可得当 x 1 = 1 , x 2 = − 1 , λ = − 2 x_1=1,x_2=-1,\lambda=-2 x1=1,x2=−1,λ=−2时, x 1 2 + x 2 2 x_1^2+x_2^2 x12+x22可取到最大值2。
上例是最基本的拉格朗日乘子法的应用场景,下面描述扩展场景。
例2,给定 x 1 − x 2 = 2 , x 1 + x 2 ≥ 1 x_1-x_2=2,x_1+x_2\geq1 x1−x2=2,x1+x2≥1,如何寻找 x 1 2 + x 2 2 x_1^2+x_2^2 x12+x22的最大值?
已知约束中除了一个等式约束,还引入了一个不等式约束。和等式约束不同,不等式约束需要分情况讨论:
1. 全局最值在约束范围内
由例1可知,在该例中如果撇开不等式约束,最值在 x 1 = 1 , x 2 = − 1 x_1=1,x_2=-1 x1=1,x2=−1时成立。所以倘若不等式函数 h ( x 1 , x 2 ) > 0 h(x_1,x_2)>0 h(x1,x2)>0在最值情况下成立(比如 x 1 + x 2 > − 1 x_1+x_2>-1 x1+x2>−1),那么这个约束就等于没有。
2.全局最值在约束范围外
这种情况是例2场景下的情况了,此时不等式约束生效,成为等式约束。即最后的最值点会落在约束条件上(此例为 x 1 + x 2 ≥ 1 x_1+x_2\geq 1 x1+x2≥1)。
除了不等式总共有两项约束,因此依然要建立一个方程,将这些信息融合在一起。定义 f ( x 1 , x 2 ) = x 1 2 + x 2 2 f(x_1,x_2)=x_1^2+x_2^2 f(x1,x2)=x12+x22, g ( x 1 , x 2 ) = x 1 − x 2 − 2 g(x_1,x_2)=x_1-x_2-2 g(x1,x2)=x1−x2−2, h ( x 1 , x 2 ) = x 1 + x 2 − 1 h(x_1,x_2)=x_1+x_2-1 h(x1,x2)=x1+x2−1,由于约束比例1多了一个,所以拉格朗日乘子也要多一个。所以该例下拉格朗日函数 L ( x 1 , x 2 , λ , γ ) L(x_1,x_2,\lambda,\gamma) L(x1,x2,λ,γ)为:
L ( x 1 , x 2 , λ , γ ) = f ( x 1 , x 2 ) + λ g ( x 1 , x 2 ) − γ h ( x 1 , x 2 ) = x 1 2 + x 2 2 + λ ( x 1 − x 2 − 2 ) + γ ( x 1 + x 2 − 1 ) L(x_1,x_2,\lambda,\gamma)=f(x_1,x_2)+\lambda g(x_1,x_2) -\gamma h(x_1,x_2)\\=x_1^2+x_2^2+\lambda(x_1-x_2-2)+\gamma(x_1+x_2-1) L(x1,x2,λ,γ)=f(x1,x2)+λg(x1,x2)−γh(x1,x2)=x12+x22+λ(x1−x2−2)+γ(x1+x2−1)
首先,需要前三个变量的偏导数为零,可以得到下列等式组:
2 x 1 + λ + γ = 0 2 x 2 − λ + γ = 0 x 1 − x 2 − 2 = 0 2x_1+\lambda+\gamma=0\\2x_2-\lambda+\gamma=0\\x_1-x_2-2=0 2x1+λ+γ=02x2−λ+γ=0x1−x2−2=0
然后,针对不等式约束,此处引出KKT条件,即对每一个不等式约束所需要满足的条件。在本例中可如下表示:
γ ≥ 0 h ( x 1 , x 2 ) ≥ 0 γ h ( x 1 , x 2 ) = 0 \gamma\geq0\\h(x_1,x_2)\geq0\\\gamma h(x_1,x_2)=0 γ≥0h(x1,x2)≥0γh(x1,x2)=0
下面具体描述其原理。
注:为了便于描述,有些表达会将 h ( x 1 , x 2 ) h(x_1,x_2) h(x1,x2)等表述为 h ( x ‾ ) h(\underline x) h(x),因为大多数情况往往不止两个变量,所以通过下划线的表达方式更泛用。
γ ≥ 0 o r γ ≤ 0 \gamma \geq0\ or\ \gamma \leq0 γ≥0 or γ≤0?
在例2的已知条件中,由于 f ( x ‾ ) f(\underline x) f(x)要求最大值,所以我们需要找到各个变量的值来使得拉格朗日函数 L L L达到最大值。现在,给定了 h ( x ‾ ) h(\underline x) h(x)的大于等于0的约束,将这个约束放在拉格朗日函数中,可以看到它对最后的结果有正面的贡献,换句话说, h ( x ‾ ) h(\underline x) h(x)和 f ( x ‾ ) f(\underline x) f(x)一条心,都有利于拉格朗日函数 L L L达到最大值,所以 h ( x ‾ ) h(\underline x) h(x)的乘子 γ \gamma γ为正。反之,如果 h ( x ‾ ) h(\underline x) h(x)给出的约束是小于等于0的约束,乘子 γ \gamma γ就必须满足 γ ≤ 0 \gamma \leq 0 γ≤0。
h ( x 1 , x 2 ) ≥ 0 h(x_1,x_2) \geq 0 h(x1,x2)≥0
这个约束很浅显,是已知条件给出的。
γ h ( x 1 , x 2 ) = 0 \gamma h(x_1,x_2)=0 γh(x1,x2)=0
这一条其实可以换一种写法: γ = 0 o r h ( x 1 , x 2 ) = 0 \gamma=0\ or\ h(x_1,x_2)=0 γ=0 or h(x1,x2)=0。这其实就刚好贴合了先前提到的不等式约束的两种情况:极值点在不等式约束范围内 o r or or 极值点在不等式约束范围外。可以看到当 γ = 0 \gamma=0 γ=0时,拉格朗日函数里的不等式约束等同于不存在,而当 h ( x 1 , x 2 ) = 0 h(x_1,x_2)=0 h(x1,x2)=0时,不等式约束就等同于等式约束,意思是目标点在不等式约束的边界。以上就是KKT条件的描述。
回到例2,归并所有条件为:
γ ≥ 0 x 1 + x 2 − 1 ≥ 0 γ ( x 1 + x 2 − 1 ) = 0 2 x 1 + λ + γ = 0 2 x 2 − λ + γ = 0 x 1 − x 2 − 2 = 0 \gamma \ge 0 \\ x_1+x_2-1\ge0\\ \gamma(x_1+x_2-1)=0\\2x_1+\lambda+\gamma=0\\2x_2-\lambda+\gamma=0\\x_1-x_2-2=0 γ≥0x1+x2−1≥0γ(x1+x2−1)=02x1+λ+γ=02x2−λ+γ=0x1−x2−2=0
由例1可知,其解不位于不等式约束内,所以在例2中,不等式约束将会生效为等式约束,因此可以改写为:
x 1 + x 2 − 1 = 0 2 x 1 + λ + γ = 0 2 x 2 − λ + γ = 0 x 1 − x 2 − 2 = 0 x_1+x_2-1=0\\2x_1+\lambda+\gamma=0\\2x_2-\lambda+\gamma=0\\x_1-x_2-2=0 x1+x2−1=02x1+λ+γ=02x2−λ+γ=0x1−x2−2=0
得: x 1 = 1.5 , x 2 = − 0.5 x_1=1.5,x_2=-0.5 x1=1.5,x2=−0.5
实际应用中,往往会出现多个约束,只需要增加乘子,按如上方法一起求和构建拉格朗日函数即可。
提完拉格朗日乘子法,就要回到SVM的话题上了。本质上说,SVM和感知器类似,也是训练一组线性参数来对原数据集分割。给定一组包含 N N N个数据的训练数据集,我们首先假设它线性可分(即存在直线,可以将这个数据集完全正确分类),线性可分的概念可以通过如下式子从数学角度进行描述:
∃ w ⃗ w ⃗ T x i ⃗ + w 0 > 0 , ∀ x i ⃗ ∈ S 1 w ⃗ T x ⃗ i + w 0 ≤ 0 , ∀ x i ⃗ ∈ S 2 \exist \vec{w}\\ \vec w^T\vec{x_i}+w_0>0,\forall \vec{x_i}\in S_1\\ \vec w^T\vec x_i+w_0\leq0,\forall\vec{x_i}\in S_2 ∃wwTxi+w0>0,∀xi∈S1wTxi+w0≤0,∀xi∈S2
其中 S 1 S_1 S1和 S 2 S_2 S2表示二分类情况下的第一类和第二类。一般情况下,可以通过引入类别系数 z i z_i zi来简化上式:
z i = { 1 , x ⃗ i ∈ S 1 − 1 , x ⃗ i ∈ S 2 z_i=\left\{ \begin{aligned} 1, \vec x_i\in S_1 \\-1,\vec x_i\in S_2 \end{aligned} \right. zi={1,xi∈S1−1,xi∈S2
现在可将上式改写为:
∃ w ⃗ , s . t . z i ( w ⃗ T x i ⃗ + w 0 ) > 0 , ∀ x i ⃗ \exist \vec{w},s.t.\ z_i(\vec{w}^T\vec{x_i}+w_0)>0,\forall \vec{x_i} ∃w,s.t. zi(wTxi+w0)>0,∀xi
SVM的目标在于寻找 w ⃗ \vec w w,使得对所有数据点,最小值越大越好。 即对于所有 x ⃗ i \vec x_i xi,希望下式的 b b b越大越好:
z i ( w ⃗ T x ⃗ i + w 0 ) > b {z_i(\vec w^T\vec x_i+w_0)}>b zi(wTxi+w0)>b
但是通过最大化 b b b来求解 w ⃗ \vec w w和 w 0 w_0 w0不是一个好主意,最好的情况是能够有一个与 w ⃗ \vec w w相关的目标函数来求解最优 w ⃗ \vec w w和 w 0 w_0 w0。可以将两边同时除以 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣来标准化 w ⃗ \vec w w,这样不会改变不等号。可得:
z i ( w ⃗ T x ⃗ i + w 0 ) ∣ ∣ w ∣ ∣ ≥ b ∣ ∣ w ∣ ∣ \frac{z_i(\vec w^T\vec x_i+w_0)}{||w||}\geq\frac{b}{||w||} ∣∣w∣∣zi(wTxi+w0)≥∣∣w∣∣b
可以看到,在给定 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣的情况下最大化 b b b,和在给定 b b b的情况下最小化 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣是等价的。所以此处令 b = 1 b=1 b=1,上式可转化为优化问题:对于所有 i i i,在约束 z i ( w ⃗ T x ⃗ i + w 0 ) − 1 ≥ 0 z_i(\vec w^T\vec x_i+w_0)-1\ge0 zi(wTxi+w0)−1≥0下,优化 m i n ( ∣ ∣ w ⃗ ∣ ∣ ) min(||\vec w||) min(∣∣w∣∣)。建立拉格朗日函数:
L ( w ⃗ , w 0 , λ ⃗ ) = 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 − ∑ i = 1 N λ i [ z i ( w ⃗ T x ⃗ i + w 0 ) − 1 ] L(\vec w, w_0, \vec \lambda)=\frac12||\vec w||^2-\sum\limits_{i=1}^N\lambda_i[z_i(\vec{w}^T\vec x_i+w_0)-1] L(w,w0,λ)=21∣∣w∣∣2−i=1∑Nλi[zi(wTxi+w0)−1]
注:上式的第一项, ∣ ∣ w ⃗ ∣ ∣ ||\vec w|| ∣∣w∣∣写为 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 \frac 12||\vec w||^2 21∣∣w∣∣2并不影响求解,因为两者都单调上升,写后者是因为可以便于求偏导。
根据KKT条件,上式必须满足:
{ λ i ≥ 0 , ∀ i z i ( w ⃗ T x ⃗ i + w 0 ) − 1 ≥ 0 , ∀ i λ i z i ( w ⃗ T x ⃗ i + w 0 ) − 1 = 0 , ∀ i \left\{ \begin{aligned} \lambda_i\ge0,\forall i\\ z_i(\vec{w}^T\vec x_i+w_0)-1\geq0,\forall i\\ \lambda_iz_i(\vec{w}^T\vec x_i+w_0)-1=0,\forall i \end{aligned} \right. ⎩⎪⎨⎪⎧λi≥0,∀izi(wTxi+w0)−1≥0,∀iλizi(wTxi+w0)−1=0,∀i
上式称为拉格朗日原始问题,要求解是比较难的,所以一般转化为拉格朗日对偶问题来化简求解。对 w ⃗ \vec w w和 w 0 w_0 w0求偏导,并使其等于零,可得:
∂ L ∂ w ⃗ = w ⃗ − ∑ i = 1 N λ i z i x i = 0 ∂ L ∂ w 0 = − ∑ i = 1 N λ i z i = 0 \frac{\partial L}{\partial \vec w}=\vec w-\sum_{i=1}^{N}\lambda_iz_ix_i=0\\ \frac{\partial L}{\partial w_0}=-\sum_{i=1}^{N}\lambda_iz_i=0 ∂w∂L=w−i=1∑Nλizixi=0∂w0∂L=−i=1∑Nλizi=0
将上式代入拉格朗日函数,可得:
L ( λ ⃗ ) = 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 − ∑ i = 1 N λ i z i ( w ⃗ T x ⃗ i ) − ∑ i = 1 N λ i z i w 0 + ∑ i = 1 N λ i = 1 2 ∑ i = 1 N ∑ j = 1 N λ i λ j z i z j x i ⃗ T x j ⃗ − ∑ i = 1 N ∑ j = 1 N λ i λ j z i z j x i ⃗ T x j ⃗ − 0 ∗ w 0 + ∑ i = 1 N λ i = − 1 2 ∑ i = 1 N ∑ j = 1 N λ i λ j z i z j x i ⃗ T x j ⃗ + ∑ i = 1 N λ i L(\vec \lambda)=\frac12||\vec w||^2-\sum_{i=1}^N\lambda_iz_i(\vec{w}^T\vec{x}_i)-\sum_{i=1}^N\lambda_iz_iw_0+\sum_{i=1}^N\lambda_i \\ =\frac12\sum_{i=1}^N\sum_{j=1}^N\lambda_i\lambda_jz_iz_j\vec{x_i}^T\vec{x_j}-\sum_{i=1}^N\sum_{j=1}^N\lambda_i\lambda_jz_iz_j\vec{x_i}^T\vec{x_j}-0*w_0+\sum_{i=1}^{N}\lambda_i\\ =-\frac12\sum_{i=1}^N\sum_{j=1}^N\lambda_i\lambda_jz_iz_j\vec{x_i}^T\vec{x_j}+\sum_{i=1}^{N}\lambda_i L(λ)=21∣∣w∣∣2−i=1∑Nλizi(wTxi)−i=1∑Nλiziw0+i=1∑Nλi=21i=1∑Nj=1∑NλiλjzizjxiTxj−i=1∑Nj=1∑NλiλjzizjxiTxj−0∗w0+i=1∑Nλi=−21i=1∑Nj=1∑NλiλjzizjxiTxj+i=1∑Nλi
通过最优化上式的 λ ⃗ \vec \lambda λ之后,可以通过 w ⃗ ∗ = ∑ i = 1 N λ i z i x ⃗ i \vec w^*=\sum_{i=1}^N\lambda_iz_i\vec{x}_i w∗=∑i=1Nλizixi来求得最优的 w ⃗ ∗ \vec w^* w∗,并通过 λ i [ z i ( w ∗ T x ⃗ i + w 0 ) − 1 ] = 0 \lambda_i[z_i(w^{*T}\vec{x}_i+w_0)-1]=0 λi[zi(w∗Txi+w0)−1]=0来求得 w 0 w_0 w0。
接下来,讨论数据集线性不可分的情况,显然我们无法使用上述方法求解。此处引入松弛变量 σ \sigma σ,表示SVM开始容忍一些错误分类。其定义为如果分类正确,且在最优分界线内,则为零。如果在最优分界线外,则为到最优分界线的标准化距离。以下图为例,如果某个红色类别的数据点在黑粗线上,则其松弛变量为1,因为它距离最优分界线(最上的这条线)为1。显然对于所有数据点, σ i ≥ 0 \sigma_i\ge0 σi≥0。
现在,约束不再是原先的对所有数据点 x ⃗ i \vec x_i xi要求其 z i ( w ⃗ T x ⃗ i + w 0 ) ≥ 1 z_i(\vec w^T\vec x_i+w_0)\ge1 zi(wTxi+w0)≥1,而是 z i ( w ⃗ T x ⃗ i + w 0 ) ≥ 1 − σ i 。 z_i(\vec w^T\vec x_i+w_0)\ge1-\sigma_i。 zi(wTxi+w0)≥1−σi。最小化目标函数也不再是 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 \frac 12||\vec w||^2 21∣∣w∣∣2,而变成了 1 2 ∣ ∣ w ⃗ ∣ ∣ 2 + c ∑ i = 1 N σ i \frac 12||\vec w||^2+c\sum\limits_{i=1}^N\sigma_i 21∣∣w∣∣2+ci=1∑Nσi。也就是说,在考虑使得分界线离数据点尽可能远的同时,还考虑到使错分点也尽可能像分界线靠拢。 c c c为常数,表示松弛变量所占比重的超参数,在训练前需要人工设置。
这种情况下,其对偶问题与线性数据集类似(推导省略),即:
L ( λ ⃗ ) = − 1 2 ∑ i = 1 N ∑ j = 1 N λ i λ j z i z j x i ⃗ T x j ⃗ + ∑ i = 1 N λ i L(\vec \lambda)=-\frac12\sum_{i=1}^N\sum_{j=1}^N\lambda_i\lambda_jz_iz_j\vec{x_i}^T\vec{x_j}+\sum_{i=1}^{N}\lambda_i L(λ)=−21i=1∑Nj=1∑NλiλjzizjxiTxj+i=1∑Nλi
约束也与原先相同,除了 λ i ≥ 0 \lambda_i\ge 0 λi≥0需要转变为 0 ≤ λ i ≤ c 0 \le \lambda_i \le c 0≤λi≤c。
至此,线性的SVM就推导完毕了。当然还没完,在实际应用中,仅仅是线性的分类器很难有所作为,所以需要引入非线性的核函数来达到准确的分类目的。在上式中,有一部分是 x ⃗ i T x ⃗ j \vec x_i^T\vec x_j xiTxj,这是两个数据的内积,如果将其标准化,它其实是相似度的一种度量方式(具体地说,是余弦相似度)。这个内积,就是核函数的一种,可以考虑修改核函数来引入非线性信息,从而达到不同的分类效果。将核函数定义为 K ( x ⃗ i , x ⃗ j ) K(\vec x_i, \vec x_j) K(xi,xj),比较常见的有:
最后一种也是sklearn的默认核函数,十分常见。