支持向量机SVM
模型形式
SVM用于连续特征二分类。
在逻辑回归中,我们习惯在特征中加入常数
此外,我们还要求用
逻辑回归,函数间隔与几何间隔
可以看出,SVM 和逻辑回归都是依靠线性分界来分类,并且,为了使预测更加可信,我们希望当
但是线性回归的优化目标倾向于得到整体最优:
这样可能导致会有一些点极其靠近分界面。
而 SVM 的优化目标是最大化数据点与分界面的最小距离。那么,我们需要量化定义距离——
函数间隔 functional margin
考虑如下定义距离的方式
但是这样定义存在问题。考虑到分界线就是
我们可以加入一些限制,比如
几何间隔 geometric margin
顾名思义,
写出表达式即为
看起来很熟悉?取
实际上,由于分界面是线性的,函数间隔也反应了几何上的相对关系,仅是相差一些倍数。
SVM优化目标
取
注意到,分母上的
仅仅是形式化的表达,我们并不能从上式马上得到我们想要的
实际上也很好解决,只要限制任意一个变量即可。仍然限制
可以看到,这样的确有唯一解,并且都是线性约束。但是这样做的本质含义是什么?——通过放缩
进一步,把优化目标转化为易求的值。
(注:从以上构造性推导无法看出
这就是一个二次规划问题,可以用求解。下面我们分析广泛的 KTT 条件下的非线性规划如何求解。
拉格朗日乘子法
目标
用于解决有等式约束的最值问题,也即求(
此处的
前置
一些在之后的推导会用到的结论,如果不会严格证明可以凭借几何直观理解。
- 函数在某点的等高线的法向向量与该点的梯度平行;
- 设
在 限制下,在 处取得最值,则等高线 与 相切。
推导
当没有约束时,我们取得最值的点
考虑有一个约束
如下构造
- 若
,则 ,所以我们也可以是在 限制下求 的最值。 ,那么 的限制自然写作 。 ,则根据拉格朗日乘子的定义,在最值点 有 。
于是我们可以发现这样构造的巧妙之处——有限制的最值问题化为了无限制的求
推广到多个限制,同样解如下函数的无限制最值(几何上不太直观,但还是用上述性质证):
KTT 条件下非线性规划求解
考虑在拉格朗日乘子法所解决的问题中引入不等式限制,形式化地:
仍然考虑引入拉格朗日乘子:
我们希望引入拉格朗日乘子能够做到以下的操作:
- 如果最值点在不等式的边界取得,也即
,则 产生与一般的拉格朗日乘子相同的效果; - 如果最值点在不等式的内部取得,也即
,则 。
如果以上两点满足,则可以直接求
上述问题的根源是
那么无论最值点落在何处,都有
利用一些现有的结论(对偶问题的结论,我还没学:(),对于这个问题,
求解 SVM 最优化问题
在上文,我们推导出了 SVM 最优化目标:
改写为标准的二次规划问题:
引入拉格朗日乘子:
在
于是得到
SVM 的预测值是
并且当且仅当下式成立,原函数有最小值:
代入
最后一步引入内积记号,
同样也将 SVM 的预测值写作内积形式
接下来就是以
暂时搁置这一问题,作为 SMO 算法章节的目标。
假设已经求得
但是如何确定
于是可以得到
也即正负分分界的中点。
核函数 Kernel
如果仅仅是完成以上的最优化目标,SVM仍然仅仅做到了线性分类,与逻辑回归的唯一区别就是最优化的思想不同。
然而结合 Kernel,SVM 能够做到非线性分类。
回顾在逻辑回归中,我们如何实现一个非常局限的非线性分类——比如我们观察到分类边界大概是个二次函数,那么我们把特征手动扩展至平方。
可以用这样一个特征变换函数表示(以
进行这样的坐标变换后,原来的最优化问题也要相应修改。之前用内积表达最优化目标的作用就体现在此处——SVM的最优化目标中所有涉及特征
但是我们很快发现,进行上述坐标变换后,计算代价非常大,计算一次内积由原来的
我们考虑用核函数
观察以下核函数,并推导其对应的坐标变换:
发现它对应的坐标变换就是之前提到的
复杂度仍为
常用的核函数
考虑如下核函数:
同样的推导,可以知道它对应的变换为
合理设置
再考虑如下核函数:
这个核函数称为高斯核函数,因为它看起来很像高斯分布的概率密度。用泰勒展开为无穷级数,可知
有效的核函数
由 Mercer 定理,对于函数
在这里我们可以把
必要性容易证明:
充分性略过。
这意味着我们没有必要找到原变换
容错——Regularization
回顾 SVM 的优化目标:
然而,如果数据本身不可分(可能是噪声),也即条件不能对所有
引入松弛变量
从而允许一些点不符合分界要求,但是不能无限制的松弛,考虑修改代价函数——松弛越多代价越高。
其中
于是相应的修改拉格朗日乘子法,再引入乘子
于是我们要求(需要注意
求偏导并置零:
于是乎,
考虑到
此时
总结即为:
当如下 KKT 条件满足时,原问题得解:
坐标上升法 & SMO
最后我们开始着手解决上述最优化问题。需要引入梯度下降以及牛顿法以外的另一个迭代求解的算法——坐标上升法,以及该方法应用到 SVM 上的一个优化——SMO。
坐标上升法
思路同样非常简单。设
我们每次选择一个参数
如果
此外,对于 SVM,此方法还需修改,因为 SVM 的
考虑如下修改:每次取两个坐标
下面具体描述如何用坐标上升法实现 SVM。
SMO
常规的坐标上升法,我们往往会选择依次优化每一个参数,迭代若干次直至收敛。
如果
先研究如何优化
优化参数
考虑选定
; 恒定,因为其满足线性约束。
于是可以针对
我们把优化目标函数记为
既然研究
我们知道
设
于是
其中
我们将与
则有
将以上两式以及
则有
其中
为什么写作
更新其他值:
注意到偏差
若
则
若
于是我们这样更新
- 如果
不在边界( ),则取 ; - 如果
在边界而 不在边界,则取 ; - 如果
都不在边界,则取 。
选取优化参数
下面描述 SMO 的启发式流程,笔者尚未理解其优化原理。
外层循环(Plott 论文中的 outer loop)用于选取第一个参数
- 首先枚举每一个
,如果其不满足 KKT 约束,并且可以优化,则选取其为 并进一步选取 进行优化。完成这一轮循环后,如果没有找到可以优化的 ,则全局优化结束,否则,下一轮循环只考虑不在边界的 作为 。 - 枚举所有不在边界的
为 ,如果可以优化,则进一步寻找 。若这一轮循环没有找到可以优化的 ,则下一轮循环枚举所有 (步骤 1);否则,下一轮循环仍然只考虑不在边界的 。
内层循环用于选取第二个参数
- 首先尝试最大化
——如果 ,则尝试找到最小的 ,否则尝试找到最大的 。 - 如果步骤 1 找不到合法的
,则枚举所有不在边界的 尝试优化。注意,为了防止总是用较小的 进行优化而导致模型偏向靠前的数据,枚举的起点是随机选取的。 - 如果步骤 2 也没有找到可以优化的
,再枚举所有的 尝试优化,同样要随机选取起点。
参考代码
**Show Code**
Copy
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现