跳转至

SVM

支持向量机(support vector machine, SVM)是除了树模型之外另一大经典机器学习算法。

想法

对于一个二分类问题,支持向量机的想法非常简单,假设数据是线性可分的,我们只需要找到一个最优的划分超平面即可。

SVM图解

硬间隔

最优性定义

问题是如何定义最优

Info

不难发现,划分超平面附近事实上成为了两个类别的隔离带,因此朴素的想法是这个隔离带的宽度应该尽量大。

并且我们最终定义的划分超平面应该尽量远离两侧的样本,因此隔离带的中线是个不错的选择。

Formulation

假设数据是线性可分的(可以找到一个隔离带),那么总存在图示的两条边界:

$$ w^Tx - b = 1, \quad w^Tx - b = -1 $$

Note

在这两条边界上的数据称为支持向量

为了使得右侧的系数为$\pm 1$,我们需要一定的缩放。根据对称性,这总是可以做到的。

以及隔离带的中间超平面$\alpha$:

$$ w^Tx - b = 0 $$

这个时候我们可以计算出两个边界超平面的间隔为: $$ \frac{2}{\sqrt{w^Tw}} $$

这就是我们最开始说的隔离带宽度。

因此,我们只需要找到最大的间隔,然后取整个隔离带的中线即可。于是我们得到了优化模型:

$$ \begin{aligned} &\max_{w,b} \quad \frac{2}{\sqrt{w^Tw}}\\ s.t. &\quad y_i(w^Tx_i-b) \ge 1 \end{aligned} $$

其中$(x_i, y_i)$是训练数据,$y_i \in \{ 1, -1 \}$是样本的标签。

拉格朗日乘子法

显然,之前的优化问题等价于:

$$ \begin{aligned} &\min_{w,b} \quad \frac{1}{2} w^Tw\\ s.t. &\quad y_i(w^Tx_i-b) \ge 1 \end{aligned} $$

这是一个美好的凸优化,形式也很简洁。不过为了更加高效求解,我们来寻找它的对偶问题。

令拉格朗日乘子函数为:

$$ L(w, b, a) = \frac{1}{2} w^Tw + \sum_{i} a_i(1- y_i(w^Tx_i - b)) $$

其中$a_i\ge 0$是拉格朗日乘子。

令 $$ \frac{\partial L}{\partial w} = \frac{\partial L}{\partial b} = 0 $$ 得到:

$$ w = \sum_i a_iy_ix_i,\quad \sum_i a_iy_i = 0 $$

把这些条件带入拉格朗日函数,得到对偶问题:

$$ \begin{aligned} &\min_{\vec{a}} \quad \sum_i a_i - \frac{1}{2} \sum_i \sum_j (a_ia_jy_iy_j) \cdot x^T_ix_j \\ s.t. &\quad \sum_i a_iy_i = 0, \quad a_i\ge 0 \end{aligned} $$

KKT条件如下:

$$ \begin{aligned} &a_i\ge 0\\ &y_i(w^Tx_i - b)\ge 1\\ &a_i\left [y_i(w^Tx_i - b) - 1\right] = 0 \end{aligned} $$

换言之 $$ a_i = 0 \quad \text{或者} \quad y_i(w^Tx_i - b) = 1 $$

也就是说,最终$a_i\ne 0$的那些样本,都是在边界上的支持向量

求解完对偶问题,我们就可以得到:

$$ w = \sum_i a_iy_ix_i $$

实际上,我们知道这个式子中只会包含支持向量:

$$ w = \sum_{i \in S} a_iy_ix_i $$

接下来只需要使用KKT条件即可求解$b$:

$$ a_i\left [y_i(w^Tx_i - b) - 1\right] = 0 $$

同样的,只需要找出支持向量的那些下标:

$$ y_i(w^Tx_i - b) = 1 \quad \forall i \in S $$

带入之前求解的$w$得到:

$$ y_k(\sum_{i \in S} a_iy_ix_i^Tx_k - b) = 1 \quad \forall k \in S $$

实践中,我们就取:

$$ b = \frac{1}{|S|} \sum_{k \in S} (y_k - \sum_{i \in S} a_iy_ix_i^Tx_k) $$

核函数

显然,数据一般很难是线性可分的,例如下面这样一组数据:

线性不可分数据

映射

这时候分类的边界是一个闭合的曲线,但我们依然可以用SVM来解决这个问题,只不过需要把源数据映射到另外一个空间:

不妨设映射为$\phi$,那么优化问题变为: $$ \begin{aligned} &\min_{w,b} \quad \frac{1}{2} w^Tw\\ s.t. &\quad y_i(w^T\phi(x_i)-b) \ge 1 \end{aligned} $$

其对偶问题为:

$$ \begin{aligned} &\min_{\vec{a}} \quad \sum_i a_i - \frac{1}{2} \sum_i \sum_j (a_ia_jy_iy_j) \cdot \phi(x_i)^T\phi(x_j) \\ s.t. &\quad \sum_i a_iy_i = 0, \quad a_i\ge 0 \end{aligned} $$

求解后得到分类超平面:

$$ f(x) = w^T\phi(x) + b = \sum_i a_iy_i \phi(x_i)^T\phi(x) + b $$

其中

$$ b = \frac{1}{|S|} \sum_{k \in S} (y_k - \sum_{i \in S} a_iy_i \phi(x_i)^T\phi(x_k)) $$

核技巧

不难发现,不论是对偶问题的求解,还是最终分类超平面的计算,都只需要计算内积$\phi(x_i)^T\phi(x_j)$,而不需要$\phi(\cdot)$本身。这被称为核技巧(kernel trick)。

因此,我们实际上只需要定义一个核函数: $$ \kappa(\cdot,\cdot) $$ 满足内积的一些性质即可。

核函数

$\kappa$是核函数,当切仅当对于任意数据$x_i, \quad i=1,\cdots, m$,核矩阵 $$ K = [\kappa(x_i,x_j)]_{m\times m} $$ 是半正定的。

常用的核函数如下:

  • 线性核
    • $\kappa(x_i,x_j) = x_i^Tx_j$
  • 多项式核
    • $\kappa(x_i,x_j) = (x_i^Tx_j)^d$
  • 高斯核,也称为RBF核
    • $\kappa(x_i,x_j) = \exp(-\lVert x_i-x_j \rVert ^2 / (2\sigma^2))$
  • 拉普拉斯核
    • $\kappa(x_i,x_j) = \exp(-\lVert x_i-x_j \rVert / \sigma)$
  • Sigmoid核
    • $\kappa(x_i,x_j) = \tanh(\beta x_i^Tx_j + \theta)$

核函数还可以进行组合。

如果$\kappa_1$和$\kappa_2$都是核函数,那么

  • $$\gamma_1 \kappa_1 + \gamma_2 \kappa_2$$也是核函数。
  • $$(\kappa_1 \otimes \kappa_2)(x,z) = \kappa_1(x,z)\kappa_2(x,z)$$也是核函数。

此外对于任意其他函数$g$ $$ \kappa(x,z) = g(x)\kappa_1(x,z)g(z) $$

也是核函数。

软间隔

当然,即使使用了核函数,数据依然可能不是线性可分的。如果强硬要求线性可分,可能会导致过拟合

这时候通常我们可以考虑使用软间隔,也就是放宽对划分超平面的要求,允许一些样本出错。

具体来说,优化问题转化为:

$$ \begin{aligned} &\min_{w,b} \quad \frac{1}{2} w^Tw + C\sum_i l_{0/1} \left(y_i (w^Tx_i-b)-1 \right) \end{aligned} $$

其中$C$是惩罚系数,$l_{0/1}$是损失函数,定义为: $$ l_{0/1}(z) = \mathbb{I}(z\lt 0) $$

当然,我们可以用更加光滑的函数来代替它:

  • hinge损失:$\max(0,1-z)$
  • 指数损失:$\exp(-z)$
  • 对率损失:$\log(1+\exp(-z))$

除了分类问题,SVM还可以求解回归问题(线性回归就是寻找超平面的过程)。

我们只需要使用软间隔,惩罚在间隔外的样本从而找到最佳的超平面即可。


最后更新: 2025-10-23 22:35:11
创建日期: 2025-10-23 22:35:11

广告

人要恰饭的嘛🤑🤑

评论