SVM 学习笔记

Support Vector Machine(SVM),也是广泛应用于各个领域的机器学习算法。

注意为了方便,本文取消了 \(x_0 = 1\) 的这一维,故原来的 \(\mathbf{\theta}^{\mathbf{T}} \mathbf{x}\),现在记为 \(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0\)

1. SVM 模型

我们先复习一下 Logistic 回归,我们的函数模型是设 \(h_{\mathbf{\theta}}(\mathbf{x}) = \sigma(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0)\) 表明 \(\mathbf{x}\) 是正类的概率。然后通过代价函数:

\[J(\theta) = \frac{1}{m} \bigg[ \sum_{i = 1}^m y^{(i)} \left(- \ln(h_{\theta}(\mathbf{x}^{(i)})) \right) + (1 - y^{(i)}) \left(- \ln(1 - h_{\theta}(\mathbf{x}^{(i)})) \right) \bigg] + \frac{\lambda}{2m} \sum_{j = 1}^{n} \theta_j^2 \]

来使用数据训练该模型。

由于代价函数中出现了对数函数,不便于计算,我们考虑使用一个便于计算且可以同样在模型决策错误时,让代价函数的值趋于正无穷的单调函数。我们暂且用 \(\operatorname{cost}_1(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0), \operatorname{cost}_0(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0)\) (下标代表了这个代价是否为正类数据的代价)代替代价函数中的两个对数的部分,即让新的代价函数为:

\[J(\theta) = \frac{1}{m} \bigg[ \sum_{i = 1}^m y^{(i)} \operatorname{cost}_1(\mathbf{\theta}^{\mathbf{T}} \mathbf{x}^{(i)} + \theta_0) + (1 - y^{(i)}) \operatorname{cost}_0(\mathbf{\theta}^{\mathbf{T}} \mathbf{x}^{(i)} + \theta_0) \bigg] + \frac{\lambda}{2m} \sum_{j = 1}^{n} \theta_j^2 \]

我们一般会选取 \(\operatorname{cost}_1(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0) = \max(0, -\mathbf{\theta}^{\mathbf{T}} \mathbf{x} - \theta_0), \operatorname{cost}_0(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0) = \max(0, \mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0)\) 做代价函数这两部分。

而且由于 SVM 在代价函数的表示方法上与 Logistic 回归有些不同,我们去掉了第二项的正则化参数,而在第一项前面添加了参数,而且也去掉了取平均,最终的代价函数即为:

\[J(\theta) = C \bigg[ \sum_{i = 1}^m y^{(i)} \operatorname{cost}_1(\mathbf{\theta}^{\mathbf{T}} \mathbf{x}^{(i)} + \theta_0) + (1 - y^{(i)}) \operatorname{cost}_0(\mathbf{\theta}^{\mathbf{T}} \mathbf{x}^{(i)} + \theta_0) \bigg] + \frac{1}{2} \sum_{j = 1}^{n} \theta_j^2 \]

不同于 Logistic 回归,会给出一个概率,而 SVM 会给出一个直接的分类:

\[h_{\theta}(\mathbf{x}) = \begin{cases} 1, & \mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0 \ge 0 \\ 0, & \mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0 < 0 \end{cases} \]

但是我们会给一个边界因子,使得分类效果更加明显,即我们最终的函数模型为:

\[h_{\theta}(\mathbf{x}) = \begin{cases} 1, & \mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0 \ge 1 \\ 0, & \mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0 \le -1 \end{cases} \]

我们不妨来看一下这些式子的意义。让我们从 \(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0\) 这一部分下手。

我们发现这个是超平面的方程 \(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0 = 0\) 的一部分,我们可以简单推导一下超平面的相关内容:

设超平面的法向量为 \(\mathbf{\theta}\)\(\mathbf{x}_0\) 是由原点为起点,终点为超平面上一点的一个向量。故超平面的方程为 \(\mathbf{\theta}^{\mathbf{T}} (\mathbf{x} - \mathbf{x}_0) = 0\),如果令 \(-\mathbf{\theta}^{\mathbf{T}} \mathbf{x}_0 = \theta_0\),则超平面的方程就为 \(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0 = 0\)

\(\mathbf{x}\) 为空间内任意一点,其到超平面的距离 \(d\) 即为向量 \(\mathbf{x} - \mathbf{x}_0\) 到法向量 \(\mathbf{\theta}\) 的投影的绝对值。即:

\[d = \dfrac{\vert \mathbf{\theta}^{\mathbf{T}}(\mathbf{x} - \mathbf{x}_0) \vert}{\vert \mathbf{\theta} \vert} = \dfrac{\vert \mathbf{\theta}^{\mathbf{T}}\mathbf{x} + \theta_0 \vert}{\vert \mathbf{\theta} \vert} \]

如果我们将 \(h_{\mathbf{\theta}}(\mathbf{x})\) 化作这样:

\[h_{\theta}(\mathbf{x}) = \begin{cases} 1, & \dfrac{\mathbf{\theta}^{\mathbf{T}}\mathbf{x} + \theta_0}{\vert \mathbf{\theta} \vert} \ge \dfrac{1}{\vert \mathbf{\theta} \vert}\\ 0, & -\dfrac{\mathbf{\theta}^{\mathbf{T}}\mathbf{x} + \theta_0}{\vert \mathbf{\theta} \vert} \ge \dfrac{1}{\vert \mathbf{\theta} \vert} \end{cases} \]

如果正类和负类的限制条件都加上绝对值,那么就是表明我们希望任意样本点 \(\mathbf{x}\) 到超平面 \(\mathbf{\theta}^{\mathbf{T}} \mathbf{x} + \theta_0 = 0\) 的距离至少为 \(\dfrac{1}{\vert \mathbf{\theta} \vert}\),而原式没有加绝对值,说明当 \(h_{\mathbf{\theta}}(\mathbf{x}) = 1\) 时,即 \(\mathbf{x}\) 为正类样本点时,我们还限制其在超平面上方,反之亦然。注意这里的上方是指 \(\mathbf{x} - \mathbf{x}_0\) 与超平面法向量 \(\mathbf{\theta}\) 的夹角为锐角。

所以若设 \(d = \dfrac{1}{\vert \mathbf{\theta} \vert}\),那么显然,最终训练出的分布应该是用一个超平面将正类和负类分开,并且这个超平面距离所有数据点的距离均要大于等于 \(d\)。在二维平面上就是下图的黑线:

img

我们也称 \(d\) 为 SVM 的 margin。

我们再看代价函数的前一部分:

\[C \bigg[ \sum_{i = 1}^m y^{(i)} \max(0, -\mathbf{\theta}^{\mathbf{T}} \mathbf{x}^{(i)} - \theta_0) + (1 - y^{(i)}) \max(0, \mathbf{\theta}^{\mathbf{T}} \mathbf{x}^{(i)} + \theta_0) \bigg] \]

我们可以这样理解这个代价函数,即当一个数据为正类的时候,如果该数据点在我们当前由 \(\mathbf{\theta}\)\(\theta_0\) 决定的超平面的下方的话,我们就会惩罚这个函数模型,反之亦然。而前面的常数 \(C\) 也表明了这样的惩罚最终被落实下来是多少。

下图表明了 \(C\) 的作用,如果我们将图中蓝色的圈看作一个正类数据,红色的叉看作负类数据,一开始我们的数据集没有左下角的那个负类数据时,我们训练出的 SVM 大概是黑线,但是如果我们向数据集添加了那个左下角的负类数据后,重新训练 SVM,这时候训练的结果就会受到 \(C\) 的影响。如果 \(C\) 过大,那么模型就会仅仅因为有一个负类数据点被分到了正类里面,而得到很大的惩罚,迫使其将训练结果调整为紫红色的线。反正若 \(C\) 较小,那么模型就不会过于受到这仅仅一个点的影响,最终的结果仍然和黑线接近。

img

如果数据是近似线性可分的,那么最终得到的 \(\mathbf{\theta}, \theta_0\) 会使得代价函数前一部分的值不会太大,可以近似看作 0,进而代价函数的后一部分就需要重点考虑,即:

\[\frac{1}{2} \sum_{j = 1}^n \theta_j^2 \]

不难发现,其就是 \(\frac{1}{2} \vert \mathbf{\theta} \vert^2\),我们使它最小化,也就是使得 \(\vert \mathbf{\theta} \vert\) 最小化,进而使 \(d = \frac{1}{\vert \mathbf{\theta} \vert}\) 最大化。也就是说我们的代价还是在保证正负类在被分到平面的两侧的同时,还在使得间隔 \(d\) 尽可能大。这就是 SVM 的模型。

虽然 SVM 使用简单的超平面来分类,但是即使在实际情况中许多问题都不是线性可分的,SVM 仍然能做的很好。

2. 核函数

posted @ 2023-05-10 18:01  Nickel_Angel  阅读(37)  评论(0编辑  收藏  举报