一、损失函数
在逻辑回归中,我们的预测函数和损失函数为:
预测函数:
损失函数:
我们知道当y分别是1和0的时候,其cost函数如下黑色曲线部分:
不难看出,当 y=1时,随着 z 取值变大,预测损失变小,因此,逻辑回归想要在面对正样本 y=1时,获得足够高的预测精度,就希望 。而 SVM 则将上图的曲线拉直为图中的折线,构成了 y=1时的代价函数曲线
,如上图的蓝色直线部分,因此当y=1的时候,为了预测精度足够高,SVM希望
。同样的,在y=0的时候,为了预测精度足够高,SVM希望
。
我们知道,在逻辑回归中,加上正则化项后的损失函数为:
而SVM定义其损失函数为:
事实上,我们可以将逻辑回归的损失函数简要描述为:
而SVM的损失函数描述为:
即,在逻辑回归中,我们通过正规化参数 λ调节 A、B 所占的权重,且 A 的权重与 λ 取值成反比。而在 SVM 中,则通过参数 C调节 A、B 所占的权重,且 A的权重与 C 的取值成反比。亦即,参数 C 可以被认为是扮演了 1\λ 的角色。
二、大间距分类器
上一节中,SVM的最小损失函数的过程为:
并且,C取值很大,当的时候,SVM希望
;而当
的时候,SVM希望
。因此上述最小化损失函数又可以描述为:
SVM 最终找出的决策边界会是下图中三条平行的蓝色直线所示的决策边界,而不是另外两条的决策边界。该决策边界保持了与正、负样本都足够大的距离,因此,SVM 是典型的大间距分类器(Large margin classifier)。
为什么求解SVM的最小损失函数就能得到最大化间距呢?这里面有一个有关向量内积的知识点。
假设我们现在又两个二维的向量:
令p为v投影到u的线段长,如下图所示:
则u,v的内积为:
其中,||u||为u的范数,也就是向量u的长度。
假定我们的,则有:
由向量内积公式可得:
其中,
为特征向量
在
上的投影:
当时,我们希望
,就是希望
,此时考虑两种情况:
(1)当很小,则需要
很大,这与
矛盾。
(2)当很大,则需要
很小,如下图所示,即样本与决策边界的距离足够大,此时我们才能在既要
足够小的情况下,又能有
,保证预测精度够高。这就解释了为什么 SVM 的模型会具有大间距分类器的性质了。
三、核函数
以上是数据线性可分的情况,然而真实情况下,很多时候数据都不是线性可分的。在逻辑回归中,我们会通过扩展多项式来处理非线性可分的问题:
假设我们令:
预测函数为:
但多项式回归所带来的高阶项不一定作用明显,针对这一问题,SVM 不会引入高阶项来作为新的特征,而是会选择一些标记点(landmark),并将样本与标记点
的相似程度作为新的训练特征
:
相似度量方式就称之为核函数(Kernel),最常见的核函数是高斯核函数(Gaussian Kernel):
我们发现如果样本点与标记点足够近的话,既,则 :
如果样本点与标记点足够远的话,则有:
下面是具体的参数例子:
TIPS:在使用高斯核函数前,需要做特征缩放(feature scaling),以使 SVM 同等程度地关注到不同的特征。
有了核函数后,我们标记点应该怎么选择呢?假设我们有如下的数据集:
我们就将每个样本作为一个标记点:
则对于样本,我们计算其与各个标记点的相似度:
得到新的特征向量:
则具备核函数的SVM的损失函数如下:
四、总结
基本上到这里,SVM的基础知识就总结完了,当然NG以简单易懂的方式介绍了SVM算法,其中还有很多的细节问题这里就不做过多的描述,有兴趣的可以移步到机器学习那本书去学习。
作为当今最为流行的分类算法之一,SVM 已经拥有了不少优秀的实现库,如 libsvm 等,因此,我们不再需要自己手动实现 SVM(要知道,一个能用于生产环境的 SVM 模型并非课程中介绍的那么简单)。
在使用这些库时,我们通常需要声明 SVM 需要的两个关键部分:
- 参数 C
- 核函数(Kernel)
由于 C 可以看做与正规化参数 λ作用相反,则对于 C 的调节:
- 低偏差,高方差,即遇到了过拟合时:减小 C值。
- 高偏差,低方差,即遇到了欠拟合时:增大 C值。
而对于核函数的选择有这么一些 tips:
- 当特征维度 n 较高,而样本规模 m 较小时,不宜使用核函数,否则容易引起过拟合。
- 当特征维度 n 较低,而样本规模 m 足够大时,考虑使用高斯核函数。不过在使用高斯核函数前,需要进行特征缩放(feature scaling)。
另外,当核函数的参数 δ 较大时,特征 fi 较为平缓,即各个样本的特征差异变小,此时会造成欠拟合(高偏差,低方差):
当 δ 较小时,特征 fifi 曲线变化剧烈,即各个样本的特征差异变大,此时会造成过拟合(低偏差,高方差):
当然不是所有的相似度评估手段都能被用作SVM核函数,他们需要满足 Mercer 理论(具体的请参考资料,我也不太明白)。
对于多分类问题,通常,流行的SVM库已经内置了多分类相关的 api,如果其不支持多分类,则与逻辑回归一样,使用 One-vs-All 策略来进行多分类。