支持向量机SVM

模型形式

SVM用于连续特征二分类。

在逻辑回归中,我们习惯在特征中加入常数 1 来代表偏差,从而将预测写作 g(θTx)。而在 SVM 中,我们习惯把偏差单独表示,即 g(wTx+b)

此外,我们还要求用 ±1 代表分类(在后续推导中会看到这样要求的便利之处),此时取 g(x)={1x01x<0


逻辑回归,函数间隔与几何间隔

可以看出,SVM 和逻辑回归都是依靠线性分界来分类,并且,为了使预测更加可信,我们希望当 y(i)=1 时,θTx(i)0(或者 wTx(i)+b0),反之 θTx(i)0(或者 wTx(i)+b0)。

但是线性回归的优化目标倾向于得到整体最优:

maxiP(y(i)x(i))

这样可能导致会有一些点极其靠近分界面。

而 SVM 的优化目标是最大化数据点与分界面的最小距离。那么,我们需要量化定义距离——

函数间隔 functional margin

考虑如下定义距离的方式 γ^(i):=y(i)(wTx(i)+b),其实这一定义就是整合了 y(i)=±1 的两种情况,我们只需要使 γ^(i)0 即可。

但是这样定义存在问题。考虑到分界线就是 wTx+b=0,我们同倍数放缩 w,b 是不影响分界线的,但是 γ^ 也会同比放缩。

我们可以加入一些限制,比如 |w|=1,这样就解决了同比放缩的问题。

几何间隔 geometric margin

顾名思义,γ(i) 就是数据点 i 到分界面的欧氏距离,但是考虑到 y(i)=±1,这个距离是有向的(可以从表达式中的 y(i) 看出有向)。

写出表达式即为

γ(i)=y(i)(wTx(i)+b)|w|

看起来很熟悉?取 (w,b)(w|w|,b|w|),即为限制 |w|=1 的函数间隔。或者说:

γ(i)=γ^(i)|w|

实际上,由于分界面是线性的,函数间隔也反应了几何上的相对关系,仅是相差一些倍数。

SVM优化目标

γ=min{γ(i)}γ^=min{γ^(i)},则 SVM 要求最大化 γ。可以如下形式化地表达:

maximizeγ,w,b γs.t.i,y(i)(wTx(i)+b)|w|γ

注意到,分母上的 |w| 导致约束非线性,我们利用函数间隔与几何间隔的关系作如下变形:

maximizeγ,w,b γ^|w|s.t.i,y(i)(wTx(i)+b)γ^

仅仅是形式化的表达,我们并不能从上式马上得到我们想要的 w,b,因为符合条件的 w,b,γ^ 是成比的一系列取值,我们只需要其中的任意一个。

实际上也很好解决,只要限制任意一个变量即可。仍然限制 |w|=1?我们并不希望这样做,因为这不是线性约束。考虑限制 γ^=1,也即

maximizew,b 1|w|s.t.i,y(i)(wTx(i)+b)1

可以看到,这样的确有唯一解,并且都是线性约束。但是这样做的本质含义是什么?——通过放缩 (w,b),使得最小的函数间隔取为 1,这也是一种得到唯一解的方法。

进一步,把优化目标转化为易求的值。

minimizew,b 12|w|2s.t.i,y(i)(wTx(i)+b)1

(注:从以上构造性推导无法看出 12|w|2 如何得来,虽然显然正确,但是应该没有解释到本质。)

这就是一个二次规划问题,可以用求解。下面我们分析广泛的 KTT 条件下的非线性规划如何求解。


拉格朗日乘子法

目标

用于解决有等式约束的最值问题,也即求(max 同理,其中的 w 是向量,代表多元函数)

min{f(w)g1(w)=0,,gm(w)=0}

此处的 f 通常是连续,或者分块连续的,并且保证所求最值存在。

前置

一些在之后的推导会用到的结论,如果不会严格证明可以凭借几何直观理解。

  • 函数在某点的等高线的法向向量与该点的梯度平行;
  • f(w)g(w)=0 限制下,在 w0 处取得最值,则等高线 f(w)=f(w0)g(w)=0 相切。

推导

当没有约束时,我们取得最值的点 w0 满足 f(w0)=0,于是可以解 f(w)=0 从而求得最值。

考虑有一个约束 g(w)=0 时,设 f(w)w0 取得最值,则有 f(w0) 平行于 g(w0)。也即 f(w0)=λg(w0),其中的 λ 就被称作拉格朗日算子。

如下构造 L(w,λ)

L(w,λ):=f(w)λg(w)

L(w,λ) 有如下有用的性质:

  • g(w)=0,则 L(w,λ)=f(w),所以我们也可以是在 g(w)=0 限制下求 L(w,λ) 的最值。
  • dfdλ=g,那么 g(w)=0 的限制自然写作 df(w,λ)dλ=0
  • L(w,λ)=f(w)+λg(w),则根据拉格朗日乘子的定义,在最值点 w0L(w0,λ)=0

于是我们可以发现这样构造的巧妙之处——有限制的最值问题化为了无限制的求 L(w,λ) 的最值问题。

推广到多个限制,同样解如下函数的无限制最值(几何上不太直观,但还是用上述性质证):

L(w,λ1,,λm):=f(w)+λ1g1(w)++λmgm(w)


KTT 条件下非线性规划求解

考虑在拉格朗日乘子法所解决的问题中引入不等式限制,形式化地:

minw{f(w)gi(w)=0,hj(w)0}

仍然考虑引入拉格朗日乘子:

L(w,αi,βj)=f(w)+iαigi(w)+jβjhj(w)

我们希望引入拉格朗日乘子能够做到以下的操作:

  • 如果最值点在不等式的边界取得,也即 hi(w)=0,则 βi 产生与一般的拉格朗日乘子相同的效果;
  • 如果最值点在不等式的内部取得,也即 hi(w)<0,则 βi=0

如果以上两点满足,则可以直接求 L 的最值代替求 f 的最值。但是很明显不满足,问题出在我们的第二个要求——如果我们直接求 L 的最大值,而有 hj(w)<0,我们显然可以让 βj,那么 L 无最值。

上述问题的根源是 β 能取负数,我们想要限制 βj0,这样就能解决这个问题。于是作如下构造:

L^(w)=maxβ0,αL(w,α,β)

那么无论最值点落在何处,都有 L^(w)=f(w),所以我们只需要求

minwL^(w)=minwmaxβ0,αL(w,α,β)

利用一些现有的结论(对偶问题的结论,我还没学:(),对于这个问题,

minwL^(w)=minwmaxβ0,αL(w,α,β)=maxβ0,αminwL(w,α,β)


求解 SVM 最优化问题

在上文,我们推导出了 SVM 最优化目标:

minimizew,b 12|w|2s.t.i,y(i)(wTx(i)+b)1

改写为标准的二次规划问题:

minimizew,b 12|w|2s.t.i,1y(i)(wTx(i)+b)0

引入拉格朗日乘子:

L(w,b,α)=12|w|2+iαi(1y(i)(wTx(i)+b))=12wTwwTiαiy(i)x(i)+iαi(1by(i))

α 给定且 αi0 的情况下,求偏导并置零:

L(w,b,α)=wiαiy(i)x(i)=0bL(w,b,α)=iαiy(i)=0

于是得到

w=iαiy(i)x(x)

SVM 的预测值是 wTx+b,于是代入 w 可得

h(x)=iαiy(i)x(i)Tx

并且当且仅当下式成立,原函数有最小值:

iαiy(i)=0

代入 L(w,b,α)

J(α)=12iαiy(i)x(i)Tjαjy(j)x(j)+iαi(1by(i))=12iαiy(i)x(i)Tjαjy(j)x(j)+iαibiα(i)y(i)=iαi12ijαiαjy(i)y(j)x(i)Tx(j)=iαi12ijαiαjy(i)y(j)x(i),x(j)

最后一步引入内积记号,v,u:=vTu,只是为了下一步的推导。

同样也将 SVM 的预测值写作内积形式

h(x)=iαiy(i)x(i),x

接下来就是以 α 为变量求最大值,即

maxα{J(α)iαiy(i)=0}

暂时搁置这一问题,作为 SMO 算法章节的目标。

假设已经求得 α,我们可以直接算出 w

w=iαiy(i)x(x)

但是如何确定 b?此时需要回归最开始的最优化目标:

maximizeb γ^s.t.y(i)(wTx(i)+b)γ^

于是可以得到

b=12(maxy(i)=1{wTx(i)}+miny(i)=1{wTx(i)})

也即正负分分界的中点。


核函数 Kernel

如果仅仅是完成以上的最优化目标,SVM仍然仅仅做到了线性分类,与逻辑回归的唯一区别就是最优化的思想不同。

然而结合 Kernel,SVM 能够做到非线性分类。

回顾在逻辑回归中,我们如何实现一个非常局限的非线性分类——比如我们观察到分类边界大概是个二次函数,那么我们把特征手动扩展至平方。

可以用这样一个特征变换函数表示(以 3 个特征值为例):

ϕ(x)=x2(x1x2x3)(x1x1x1x2x1x3x3x3)

进行这样的坐标变换后,原来的最优化问题也要相应修改。之前用内积表达最优化目标的作用就体现在此处——SVM的最优化目标中所有涉及特征 x 的位置,都是一个内积,我们只需要把 x(i),x(j) 更换为 ϕ(x(i)),ϕ(x(j))

但是我们很快发现,进行上述坐标变换后,计算代价非常大,计算一次内积由原来的 O(n) 变为了 O(n2)。是否有方法加速计算?

我们考虑用核函数 K 表示特征变换后的内积。

K(u,v):=ϕ(u),ϕ(v)

观察以下核函数,并推导其对应的坐标变换:

K(u,v)=(uTv)2=(i=1nuivi)2=i=1nj=1nuiujvivj=(u1u1,u1u2,,unun)(v1v1,v1v2,,vnvn)T

发现它对应的坐标变换就是之前提到的 ϕ(x)=x2。也就是说我们可以直接计算

ϕ(x(i)),ϕ(x(j))=K(x(i),x(j))=(x(i)Tx(j))2

复杂度仍为 O(n)

常用的核函数

考虑如下核函数:

K1(u,v)=(uTv+c)d

同样的推导,可以知道它对应的变换为

ϕ(x)=(xdcdxd1cd1dxcd)

合理设置 c 的取值,我们可以得到一个 d 次的坐标变换,计算代价仍然是 O(n)(如果 d 是个小常数)。

再考虑如下核函数:

K2(u,v)=exp(|uv|22σ2)

这个核函数称为高斯核函数,因为它看起来很像高斯分布的概率密度。用泰勒展开为无穷级数,可知 K2 对应的特征变换是将原特征变换为无穷维特征,而计算代价仍然较小。这很明显地体现了核函数的强大。

有效的核函数

由 Mercer 定理,对于函数 K(u,v),存在特征变换 ϕ(x) 使得 Kϕ 的核函数的充要条件是 K 是对称半正定的。

在这里我们可以把 K 视作一个矩阵:Kij=K(x(i),x(j))。显然 K 是对称的。并且由于内积的线性性:

K(u,v)=uTKv

必要性容易证明:

K(z,z)=zTKz=ijziKijzj=ijziϕT(x(i))ϕ(x(j))zj=ijzizjkϕk(x(i))ϕk(x(j))=kiziϕk(x(i))jzjϕk(x(j))=k(iziϕk(x(i)))2

充分性略过。

这意味着我们没有必要找到原变换 ϕ 来判断 K 是否是一个有意义的核函数,而可以直接验证 i,K(x(i),x(i))0 来判断。


容错——Regularization

回顾 SVM 的优化目标:

minimizew,b 12|w|2s.t.i,y(i)(wTx(i)+b)1

然而,如果数据本身不可分(可能是噪声),也即条件不能对所有 i 满足,我们仍然希望得到一个尽可能好的分界。

引入松弛变量 ξi,将限制条件改为

i,y(i)(wTx(i)+b)1ξi,ξi0

从而允许一些点不符合分界要求,但是不能无限制的松弛,考虑修改代价函数——松弛越多代价越高。

minimizew,b 12|w|2+Ciξis.t.i,1ξiy(i)(wTx(i)+b)0,ξi0

其中 C 是一个设置的参数,C 越大限制越强。

于是相应的修改拉格朗日乘子法,再引入乘子 ξ

L(w,b,ξ,α,β)=12|w|2+Ciξi+iαi(1ξiy(i)(wTx(i)+b))+iβi(ξi)

于是我们要求(需要注意 w,b,ξ 都是算法的参数,而 α,β 是乘子):

minw,b,ξmaxα0,β0{L(w,b,α,β)}=maxα0,β0minw,b{L(w,b,α,β)}

求偏导并置零:

Lw=wiαiy(i)x(i)Lb=iαiy(i)Lξi=CαiβiLξ=Cαβ

于是乎,Lw,b,ξ 有最小值当且仅当

αTy=0,Cαβ=0

考虑到 αi0,βi0,上述第二条限制可以写为:

0αiC

此时 w=iαiy(i)x(i)

L(w,b,ξ,α,β)=12wTw+iαi=12i,jαiαjy(i)y(j)x(i),x(j)+iαi

总结即为:

max0αiC,αTy=0{iαi12i,jαiαjy(i)y(j)x(i),x(j)}

当如下 KKT 条件满足时,原问题得解:

αi=0yih(xi)1αi=Cyih(xi)10<αi<Cyih(xi)=1


坐标上升法 & SMO

最后我们开始着手解决上述最优化问题。需要引入梯度下降以及牛顿法以外的另一个迭代求解的算法——坐标上升法,以及该方法应用到 SVM 上的一个优化——SMO。

坐标上升法

思路同样非常简单。设 f(α1,,αn)n 元函数,αi 的取值在实数域上没有任何限制。我们想要求 f 的最小值(以及对应的参数取值)。

我们每次选择一个参数 αk,视其他参数为常数,则 f 成为关于 αk 的一元函数,此时我们求使得 f 取得最小值的 αk,令 αkak。形式化地:

αk:=argmintf(α1,,αk1,t,αk+1,,αn)

如果 f 是一个凸函数(对于最大值则是凹函数),则算法正确性是显然的。SVM 的优化目标是凸函数,由这一点可以看出之前取优化目标为 12|w|2 的明智性。

此外,对于 SVM,此方法还需修改,因为 SVM 的 α1,,αn 是相关的——

iαiy(i)=0

考虑如下修改:每次取两个坐标 αi,αj,则 αj 是关于 αi 的函数,进而 f 是关于 αi 的函数。

下面具体描述如何用坐标上升法实现 SVM。

SMO

常规的坐标上升法,我们往往会选择依次优化每一个参数,迭代若干次直至收敛。

如果 n 很大(SVM 就是这种情况),那么这个算法迭代一次无疑非常低效。我们很自然地想要选择下降最快的一个坐标。

先研究如何优化 αi,αj 两个参数。

优化参数

考虑选定 αi,αj 两个参数进行优化,优化需要满足

  • αi,αj[0,C]
  • y(i)αi+y(j)αj 恒定,因为其满足线性约束。

于是可以针对 y(i),y(j) 相等、不等两种情况分别计算出 αj 的取值范围,记为 [L,H],具体参考 Plott 的论文。

我们把优化目标函数记为 Ψ(α),即

Ψ(α)=iαi12ijαiαjy(i)y(j)K(x(i),x(j))

既然研究 αi,αj 的优化,就把 Ψ(α) 整理成只与这两个变量相关的函数(用 Kpq 表示 K(x(p),x(q))):

Ψ(α)=(αi+αj)12αi2Kii12αj2Kjjy(i)y(j)αiαjKijαiy(i)ki,jαky(k)Kikαjy(j)ki,jαky(k)Kjk+Const

我们知道 αi,αj 之间有线性限制,具体可以写为:

αi+y(i)y(j)αj=λ:=y(i)ki,jy(k)αk

s=y(i)y(j),则有 αi=λsαjαiαj=s

于是

αjΨ(α)=1s(λsαj)(s)KiiαjKjjs(λsαj)Kij+αjKij+y(j)(vivj)

其中 vi=ki,jαky(k)Kikvj 同理。

我们将与 αi,αj 有关的变量在修改之前的值用 x~ 标注。注意到

u~i:=h(x(i))=kαky(k)Kik=vi+α~iy(i)Kii+α~jy(j)Kij

则有

vi=u~iα~iy(i)Kiiα~jy(j)Kijvj=u~jα~iy(i)Kijα~jy(j)Kjj

将以上两式以及 λ=y(i)α~i+y(j)α~j 代入 αjΨ(α)(注:笔者并未成功化简出如下式子,结论参考自 Plott 的论文):

αjΨ(α)=(αjα~j)(Kii+Kjj2Kij)y(j)(u~iy(i)u~j+y(j))

则有

α^j=α~j+yj(E~iE~j)η

其中 Ei=uiy(i),表示样本 i 的误差(预测-实际),这一变量需要在程序中维护(是SMO算法的重要优化,笔者尚未理解优化原因)。η=Kii+Kjj2Kij,仅是方便表示。

为什么写作 α^j 而不是 αj?因为 αj 还必须满足 αj[L,H] 的限制,而我们现在相当于只是在整个平面上考虑 Ψ(α) 的最值。所幸 Ψ 关于 α 是二次的,所以如果 αj 越过了 [L,H] 边界,则最值在边界取得:

αj={Lα^jLα^jL<α^j<HHα^jH

更新其他值:

αi=λsαjEk=E~k+(αiα~i)y(i)Kik+(αjα~j)y(j)Kjk+bb~

注意到偏差 b 也会随着 αi,αj 的变化而更新。下面研究怎样计算 b。我们需要调整 b 使得 αiαj 对应的 KKT 条件满足:

0<αi<C,要使 αi 的 KKT 条件满足,则 y(i)ui=1,即 ui=y(i)。又

ui=u~i+(αiα~i)y(i)Kii+(αjα~j)y(j)Kij+bb~

b1=b~(αiα~i)y(i)Kii(αjα~j)y(j)Kij+y(i)u~i=b~(αiα~i)y(i)Kii(αjα~j)y(j)KijE~i

0<αj<C,要使 αj 满足 KKT 限制,同理有

b2=b~(αiα~i)y(i)Kij(αjα~j)y(j)KjjE~j

于是我们这样更新 b

  • 如果 αi 不在边界(0<αi<C),则取 b=b1
  • 如果 αi 在边界而 αj 不在边界,则取 b=b2
  • 如果 αi,αj 都不在边界,则取 b=12(b1+b2)

选取优化参数

下面描述 SMO 的启发式流程,笔者尚未理解其优化原理。

外层循环(Plott 论文中的 outer loop)用于选取第一个参数 αj

  1. 首先枚举每一个 α,如果其不满足 KKT 约束,并且可以优化,则选取其为 αj 并进一步选取 αi 进行优化。完成这一轮循环后,如果没有找到可以优化的 αj,则全局优化结束,否则,下一轮循环只考虑不在边界的 α 作为 αj
  2. 枚举所有不在边界的 ααj,如果可以优化,则进一步寻找 αi。若这一轮循环没有找到可以优化的 αj,则下一轮循环枚举所有 α(步骤 1);否则,下一轮循环仍然只考虑不在边界的 α

内层循环用于选取第二个参数 αi

  1. 首先尝试最大化 |EiEj|——如果 Ei>0,则尝试找到最小的 Ej,否则尝试找到最大的 Ej
  2. 如果步骤 1 找不到合法的 Ej,则枚举所有不在边界的 αi 尝试优化。注意,为了防止总是用较小的 i 进行优化而导致模型偏向靠前的数据,枚举的起点是随机选取的。
  3. 如果步骤 2 也没有找到可以优化的 αi,再枚举所有的 αi 尝试优化,同样要随机选取起点。

参考代码

**Show Code**
Copy

posted @   Lucky_Glass  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
TOP BOTTOM
点击右上角即可分享
微信分享提示