SVM

支持向量机

支持向量机(support vector machines)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,它在学习复杂的非线性方程时能提供一种更加清晰和强大的方法。

在 Logistic 回归中,如果要令 y=1y = 1,则有 hθ(x)=11+e−θTx≈1h_\theta(x) = \dfrac{1}{1+e^{-\theta^Tx}} \approx 1,即 θTx≫0\theta^Tx \gg 0;当 y=0y=0 时有 hθ(x)≈0h_\theta(x)\approx 0,即 θTx≪0\theta^Tx\ll 0。

对于 Logistic 回归,其代价函数为

−(ylog⁡hθ(x)+(1−y)log⁡(1−hθ(x)))-(y\log h_\theta(x) + (1 - y) \log (1 - h_\theta(x)))

将 hθ(x)h_\theta(x) 代入上述函数得

−ylog⁡11+e−θTx−(1−y)log⁡(1−11+e−θTx)-y\log\dfrac 1{1+e^{-\theta^Tx}} - (1-y) \log (1 - \dfrac 1{1+e^{-\theta^Tx}})

当 y=1y = 1 时,代价函数变为 −log⁡11+e−z-\log \dfrac1{1+e^{-z}},此时令 z→+∞z \to +\infty,代价函数将会趋近于 0,这也是为什么在看见 y=1y = 1 这样的样本时,会将 zz 赋值为一个极大值;类似地,当看见 y=0y = 0 这样的样本时,会将 zz 赋值为一个极小值。

在 Logistic 回归中,我们的代价函数 J(θ)J(\theta) 为

J(θ)=min⁡θ1m[∑i=1my(i)(−log⁡hθ(x(i)))+(1−y(i))(−log⁡(1−hθ(x(i))))]+λ2m∑j=1nθj2J(\theta) = \min_{\theta}\dfrac 1m\left[\sum\limits_{i = 1}^my^{(i)}\left(-\log h_{\theta}(x^{(i)})\right) + (1 - y^{(i)})\left(-\log (1 - h_\theta(x^{(i)}))\right)\right] + \dfrac{\lambda}{2m}\sum\limits_{j = 1}^n \theta_j^2

上式中后一项为正则化参数。

在 SVM 中,代价函数为

J(θ)=min⁡θ[C∑i=1my(i)cost⁡1(θTx(i))+(1−y(i))cost⁡0(θTx(i))]+12∑j=1nθj2J(\theta) = \min_\theta \left[C\sum\limits_{i = 1}^my^{(i)}\operatorname{cost}_1(\theta^Tx^{(i)}) + (1 - y^{(i)})\operatorname{cost}_0(\theta^Tx^{(i)})\right] + \dfrac{1}{2}\sum\limits_{j = 1}^n\theta_j^2

其中 cost⁡0\operatorname{cost}_0,cost⁡1\operatorname{cost}_1 为合页损失函数。由于 1m\dfrac 1m 是常数,对 θ\theta 的取值不会造成影响,于是将 1m\dfrac 1m 约去。在 SVM 中,权重参数将不在正则化项上,而是在前一项,按照惯例设为 CC。

SVM 的输出并不是概率,而是预测值,即:

hθ(x)={1,if θTx≥00,otherwise\begin{aligned} h_\theta(x) = \begin{cases} 1, &\text{if } \theta^\mathrm Tx \geq 0 \\ 0, &\text{otherwise} \end{cases} \end{aligned}

Large Margin Intuition

1674124967265.png

当 CC 非常大时,我们希望使第一项的值尽量为 0,则当 y(i)=1y^{(i)} = 1 时,我们希望得到 θTx≥1\theta^\mathrm Tx \geq 1;当 y(i)=0y^{(i)} = 0 时,我们希望得到 θTx≤−1\theta^\mathrm Tx \leq -1,则此时最优化问题变为

min⁡θ12∑j=1nθj2s.t. {θTx(i)≥1,if y(i)=1θTx(i)≤−1,if y(i)=0\begin{aligned} &\min_{\theta} \dfrac 12 \sum\limits_{j=1}^n{\theta_j^2} \\ &\text{s.t. } \begin{cases} \theta^\mathrm Tx^{(i)} \geq 1, &\text{if } y^{(i)} = 1 \\ \theta^\mathrm Tx^{(i)} \leq -1, &\text{if } y^{(i)} = 0 \end{cases} \end{aligned}

通过求解上述的最优化问题,我们可以得到一个更加鲁棒的超平面(决策边界)。

距离超平面最近的几个训练样本点被称为支持向量,两个不同类支持向量到超平面的距离之和被称为间隔(margin)。

image-20230124105740524

当 CC 非常大时,模型会对离群值非常敏感,有可能为了追求正确率而将间隔变小,所以我们需要调整参数 CC 以权衡间隔和错误率。

image-20230124105746386

当样本不是线性可分时,也会出现上述情况,我们需要通过核化法将问题升维,以转化为线性可分的问题,或者容忍合适的错误率,以获取鲁棒的超平面。

The mathematics behind large margin classification

首先回顾向量的内积:设 u⃗=[u1u2]\vec u = \begin{bmatrix}u_1 \\ u_2\end{bmatrix},v⃗=[v1v2]\vec v = \begin{bmatrix}v_1 \\ v_2\end{bmatrix},则 u⃗\vec u 和 v⃗\vec v 的内积为 u⃗Tv⃗=p⋅∥u∥=v⃗Tu⃗=u1v1+u2v2{\vec u}^\mathrm T \vec v = p \cdot \|u\| = {\vec v}^\mathrm T \vec u = u_1v_1 + u_2v_2,其中 pp 是 v⃗\vec v 在 u⃗\vec u 上的投影,∥u⃗∥\|\vec u\| 表示 u⃗\vec u 的长度(范数)。

在下面的过程中,我们对要最优化的目标函数做一些简化:令 θ0=0\theta_0 = 0,n=2n = 2,目标函数可以写做

12∑j=1nθj2=12(θ12+θ22)=12(θ12+θ22)2=12∣∣θ⃗∣∣2\begin{aligned} &\dfrac 12 \sum\limits_{j=1}^n{\theta_j^2}\\ = &\dfrac 12\left(\theta_1^2 + \theta_2^2\right) \\ = &\dfrac 12 \left(\sqrt{\theta_1^2 + \theta_2^2}\right)^2 \\ = &\dfrac 12 ||\vec \theta||^2 \end{aligned}

其中,θ⃗=[b1b2]\vec\theta = \begin{bmatrix}b_1 \\ b_2\end{bmatrix}。

观察原最优化问题的限制条件:

{θTx(i)≥1,if y(i)=1θTx(i)≤−1,if y(i)=0\begin{cases} \theta^\mathrm Tx^{(i)} \geq 1, &\text{if } y^{(i)} = 1 \\ \theta^\mathrm Tx^{(i)} \leq -1, &\text{if } y^{(i)} = 0 \end{cases}

将限制条件和向量内积做对比,可以得到:

{p(i)⋅∣∣θ⃗∣∣≥1,if y(i)=1p(i)⋅∣∣θ⃗∣∣≤−1,if y(i)=0\begin{cases} p^{(i)} \cdot ||\vec\theta|| \geq 1, &\text{if } y^{(i)} = 1 \\ p^{(i)} \cdot ||\vec\theta|| \leq -1, &\text{if } y^{(i)} = 0 \end{cases}

其中 p(i)p^{(i)} 表示 x(i)x^{(i)} 在 θ⃗\vec \theta 上的投影。

此时原最优化问题成为:

min⁡θ12∣∣θ⃗∣∣2s.t. {p(i)⋅∣∣θ⃗∣∣≥1,if y(i)=1p(i)⋅∣∣θ⃗∣∣≤−1,if y(i)=0\begin{aligned} &\min_{\theta} \dfrac 12 ||\vec \theta||^2 \\ &\text{s.t. } \begin{cases} p^{(i)} \cdot ||\vec\theta|| \geq 1, &\text{if } y^{(i)} = 1 \\ p^{(i)} \cdot ||\vec\theta|| \leq -1, &\text{if } y^{(i)} = 0 \end{cases} \end{aligned}

image-20230124105755676

对于上图这个超平面,它并不是最优的,这是因为 θ⃗\vec \theta 是这个超平面的法向量,作出后如下图所示:

image-20230124105800914

将 p(i)p^{(i)} 画出后,可以发现所有的 ∣p(i)∣|p^{(i)}| 都比较小:

image-20230124105817169

这意味着,如果要满足最优化问题的限制条件,∥θ⃗∥\|\vec \theta\| 需要尽可能地大,这与最优化问题中最优化的表达式相违背!由此可以看出,这不是一个好的超平面。

image-20230124105822850

当选择这个超平面时,∣p(i)∣|p^{(i)}| 会大得多,∥θ⃗∥\|\vec\theta\| 从而会相应的小很多,于是 SVM 会选择这个超平面,而不是上面那一个。

当 θ0≠0\theta_0 \neq 0 时,超平面将不再经过 (0,0)(0, 0) 点,但 SVM 依然会做类似的工作,使得 margin 最大。

Kernels

我们令 fif_i 表示第 ii 个特征变量,则预测函数 hθ(x)h_\theta(x) 成为

hθ(x)=[θ0+θ1f1+θ2f2+⋯≥0]h_\theta(x) = \left[\theta_0 + \theta_1f_1 + \theta_2f_2 + \cdots \geq 0\right]

其中 [x][x] 表示如果布尔表达式 xx 为真,则取值为 1,反之为 0。

有没有一种较好的方法来合理地选取各个特征变量?下面介绍一种构造方法。

下面例子中,我们只构造三个特征变量 f1f_1,f2f_2,f3f_3,特征为 x1x_1,x2x_2。

我们在 x1x_1,x2x_2 形成的二维空间上选取三个点 l(1)l^{(1)},l(2)l^{(2)} 和 l(3)l^{(3)},则每个特征变量由下式构造得到:

fi=κ(x,l(i))=exp⁡(−∥x−l(i)∥22σ2)=exp⁡(−∑j=1n(xj−lj(1))22σ2)f_i = \kappa(x, l^{(i)}) = \exp\left(-\dfrac{\|x - l^{(i)}\|^2}{2\sigma^2}\right) = \exp\left(-\dfrac{\sum_{j=1}^n{(x_j - l^{(1)}_j)^2}}{2\sigma^2}\right)

其中,κ(⋅,⋅)\kappa(\cdot, \cdot) 被称为核函数,此处我们使用的是高斯核函数。此处的 σ\sigma 与正态分布中的 σ\sigma 对图像的影响类似,当 σ\sigma 缩小时,图像会更加的陡峭,从最高点处向下时,下降的速度会更快;反之则会更平缓,下降的速度会更慢。我们称 σ\sigma 影响着图像的平滑程度。

当 xx 和 l(i)l^{(i)} 非常接近时,fi≈1f_i \approx 1,而当二者之间的距离非常远时,fi≈0f_i \approx 0。

假设我们已经得到参数的值:θ0=−0.5\theta_0 = -0.5,θ1=1\theta_1 = 1,θ2=1\theta_2 = 1,θ3=0\theta_3 = 0,则靠近 l(1)l^{(1)} 和 l(2)l^{(2)} 的点将会被预测为 y=1y = 1,其余位置将会被预测为 y=0y = 0。根据参数,我们可以得到一个超平面,落入这个超平面中的所有数据点都会被预测为 y=1y = 1。

具体实践中,我们可以将每个数据 x(i)x^{(i)} 在超平面上的位置作为一个标记点 l(i)l^{(i)},这样我们可以得到 mm 个标记,其中 mm 为训练集规模。

此时我们可以得到 mm 个特征变量 f1f_1,f2f_2,…\dots,fmf_m。我们将其写作一个向量,同时按照惯例,我们在向量中加入 f0f_0,即

f⃗=[f0=1f1f2⋮fm]\vec f = \begin{bmatrix}f_0 = 1 \\ f_1 \\ f_2 \\ \vdots \\ f_m\end{bmatrix}

对于训练集中的一个数据 {x(i),y(i)}\left\{x^{(i)}, y^{(i)}\right\},我们可以计算得到一个新的特征向量

f(i)→=[f0(i)=1f1(i)=κ(x(i),l(1))f2(i)=κ(x(i),l(2))f3(i)=κ(x(i),l(3))⋮fm(i)=κ(x(i),l(m))]\overrightarrow{f^{(i)}} = \begin{bmatrix} f_0^{(i)} = 1 \\ f_1^{(i)} = \kappa(x^{(i)}, l^{(1)}) \\ f_2^{(i)} = \kappa(x^{(i)}, l^{(2)}) \\ f_3^{(i)} = \kappa(x^{(i)}, l^{(3)}) \\ \vdots \\ f_m^{(i)} = \kappa(x^{(i)}, l^{(m)}) \end{bmatrix}

这样,我们可以把一个 n+1n + 1 维的数据 x(i)x^{(i)} 转化为一个 m+1m + 1 的特征向量 f(i)→\overrightarrow{f^{(i)}}。此时,预测函数将会变为

hθ(x)=[θTf(i)→≥0]h_\theta(x) = \left[\theta^\mathrm T \overrightarrow{f^{(i)}} \geq 0\right]

其中,θ∈Rm+1\theta \in \mathbb{R}^{m + 1},f(i)→∈Rm+1\overrightarrow{f^{(i)}} \in \mathbb R^{m + 1}。

最优化问题为:

arg⁡min⁡θ C∑i=1mcost⁡1(θTf(i)→)+(1−y(i))cost⁡0(θTf(i)→)+12∑j=1mθj2\underset{\theta}{\arg\min}\ C\sum\limits_{i = 1}^m{\operatorname{cost}_1(\theta^\mathrm T \overrightarrow{f^{(i)}}) + (1 - y^{(i)})\operatorname{cost}_0(\theta^\mathrm T \overrightarrow{f^{(i)}})} + \dfrac 12\sum\limits_{j = 1}^m{\theta_j^2}

当把 θ0\theta_0 省略后,L2 正则项可以写作 12θTθ\displaystyle \dfrac 12 \theta^\mathrm T\theta。

在上式中,CC 的作用与 1λ\dfrac 1\lambda 基本相当:

  • 当 CC 较大时,偏差小,方差大,容易过拟合;
  • 当 CC 较小时,偏差大,方差小,容易欠拟合。

常用的核函数有如下几种:

名称 表达式 参数
线性核 κ(x,l)=xTl\kappa(x, l) = x^\mathrm Tl
多项式核 κ(x,l)=(xTl+r)d\kappa(x, l) = \left(x^\mathrm Tl + r\right)^d rr 为偏移量,d≥1d \geq 1 为多项式次数
高斯核 κ(x,l)=exp⁡(−∣x−l∣22σ2)\kappa(x, l) = \exp\left(-\dfrac{|x - l|^2}{2\sigma^2}\right) σ>0\sigma > 0 为高斯核的带宽
拉普拉斯核 κ(x,l)=exp⁡(−∣x−l∣σ)\kappa(x, l) = \exp\left(-\dfrac{|x - l|}{\sigma}\right) σ>0\sigma > 0
Sigmoid 核 κ(x,l)=tanh⁡(βxTl+θ)\kappa(x, l) = \tanh\left(\beta x^\mathrm Tl + \theta\right) β>0\beta > 0,θ<0\theta < 0