SVM现在主流的有两个方法。
SVM模型的基本原理,就是寻找一个合适的超平面,把两类的样本正确分开。单个SVM只能处理二分类,多分类需要多个SVM。
【什么是超平面?】 超平面就是n维度空间的n-1维度的子空间。换成人话就是2维空间中的1维度的线,三维立体空间的二维平面。
图中总共有5个超平面,那么哪一个是最好的呢?我们认为中间的那个是最好的。因为他对两侧的间隔较大。
超平面我们可以用这个方程来表示:
空间中任意一个点x到这个超平面的垂直距离为:
这里不得不提到一下逻辑回归,对于逻辑回归来说:
就是在超平面一侧的样本,逻辑回归给出的预测类别是1,另外一侧就是0.
但是SVM觉得这样有一些过于绝对了,所以:
不仅仅要一个样本在平面的一侧,还要在平面的这一侧足够远的地方,才能算作某一类的样本。
从图中可以看到,两条虚线之外的点,才是SVM能确定是正样本还是负样本的点。
【什么是支持向量?】图中距离超平面最近的几个训练样本,并且这几个训练样本可以让上式的等号成立。这个点就是支持向量。
【什么是SVM的间隔】两个不同类别的支持向量到超平面的最小距离之和。其实也就是
到这里,我们可以隐隐约约的发现,寻找最优的超平面其实等价于寻找一个最大的间隔,或者说让间隔最大化。所以可以得到:这个的约束条件就是:让SVM给正样本的打分大于1,给负样本的打分小于-1,也就是:
简化一下这个约束条件,可以得到:
一般我们都是求取最小化问题,所以把最大化max问题取倒数,变成最小化问题:这里为了后续的计算方便,最小化等价于最小化,所以得到:
总之SVM的基本型就是:
现在求得了基本型。现在可以来进一步优化这个最小化问题。但是首当其冲的问题便是,如何处理这个约束条件。这里用到的方法是拉格朗日乘子法。将约束条件以的权重加入到优化问题中,所以可以得到:
为了最小化这个问题,对w和b求偏导数,可以得到:
然后把这两个公式代入到:
可以消掉w和b,得到:
约束条件为:
从而根据这个计算出的取值,然后得到w和b的取值。
【到底如何求解?】上面说的最后一部求解alpha,都是理论可以求解,但是实际中如何做到呢?其实这里如何求解要用到另外一个条件。
就是上述过程要满足一个叫做KKT的条件(KKT具体是什么有点复杂,就不多说了):
加上了这个条件,我们可以求解出来的具体数值,然后求解w和b的数值。
假设有3个支持向量,那么就会有三个 ,然后根据可以列出3个关于的三元一次方程组,然后得到唯一解。
在SVM中,将约束问题转化成非约束问题采用到了拉格朗日乘子法。这个文章就讲一下拉格朗日乘子法与KKT约束是怎么回事。本人不是数学科班出身,但是也只能硬着头皮讲一讲了。
现在我们要解决这样一个问题:这个函数距离原点最近的距离是多少。
先画出函数图像:
然后想求出最短距离:
这里的思路就是,做一个以原点为中心的圆形:
不断扩大圆形的半径,直到圆与蓝色的曲线相切:
现在。第一次与相交的点就是距离原点最近的那个点:
这个,圆形与曲线相切,且切线既是圆形的切线,也是曲线的相切。
这时候,这个切线的垂线其实也就是我们所说的梯度,也叫做等高线的法线,看下面两个图可能会好理解一些:
那么这个梯度怎么计算呢?先看圆形的梯度:
再看曲线的梯度计算的梯度:
在相切的时候,两者的梯度方向都在同一条直线上,可以称之为,成比例,这里用比例系数来表示:
所以我们汇总一下所有的已知信息,得到下面的方程组:
可以求解得到:
这个就是拉格朗日乘子法的直观理解。
我们要解决的问题:
我们会将约束问题通过拉格朗日乘子法转换成非约束问题:
【为什么可以这样呢?】
如果求极值,偏导数为0。先对上面的公式进行求偏导数:
这两个等式与这个等价,唯一的不同就是一个是正数一个是负数:
当然,对于这个条件,我们也可以写成,所以,可以得到这样的一个方程组:
之前的拉格朗日的约束条件是等值的,现在可以通过KKT条件推广到不等式。因为限制条件往往是不大于,小于这样的不等式,所以KKT才是拉格朗日化约束问题为非约束问题的关键。
对于不等式问题,就是有两种情况:
可行解在g(x)<0,就表示这个约束条件并没有起到约束效果,有根没有事一个效果(下图中的左图);可行解g(x)=0,就表示这个约束条件起到作用了,这就表示g(x)与f(x)相切,也就是下图中右边的图。
【g(x)<0的情况】这种情况下,就是没有限制条件下的情况,其实就是没有约束条件的限制,也就是的情况,所以我们的等式就是直接求解:
【g(x)=0的情况】如果是g(x)=0的情况,那也就是约束条件起到作用了,也就意味着。在这种情况下,存在着:并且两个函数的扩张的方向相反,所以表明两个g(x)和f(x)的梯度一个是正数,一个是负数。所以这个表示。
所以综上所述,在这种情况下,我们所有的条件综合起来可以得到,其中就是最优解:
这三个就是KKT条件。
【主要讨论的问题】:
这里先介绍一下对SVM的部分基础知识,以及本文使用的算法符号。
基本就这么多了,咱们开始看损失函数吧。
谈到损失函数,我们必须要明确一点:分类任务的目标是什么?
对于SVM来说:
【为什么用“也许”呢?如果?】的时候,和哪个更好,其实我们并不能得到正确答案。因为两种情况都是分类正确的。
一般的平方损失就是:
但是因为这里的两类是用+1和-1来表示的,所以可以写成这个样子:
这样的写法的话,就是希望:
这里放一个loss function的函数图:
然后上面的平方损失,就是途中的红色的曲线。我们先品一品是什么?
回到平方损失,可以看到,平方损失在大于1的时候,损失越来越大。这个不合理呀。你考试,肯定是越高越好,不可能只要求你考70分。你考80分怎么还比70分得到更大的损失。
【这也是分类问题为什么不使用平方损失的原因。因为回归的时候,要预测的是一个数值,高了低了都不好。但是回归的时候,是一个阈值,距离这个阈值越远,越好,没有上限。】
来看一下交叉熵损失。交叉熵需要把模型的结果归一化到0~1中间,所以先对的结果,加上一个sigmoid函数。
看一下交叉熵的SVM损失函数:
这个绿色的损失看起来不错,比平方损失强多了。
目前:交叉熵完爆平方损失。
有人提出,假设使用sigmoid将限制在0~1内,那么,就可以避免平方损失在大于1的区间内出现的问题。
损失函数变成:
图像是下图中的蓝色的线。
但是sigmoid+平方损失还是不如交叉熵。举个例子:假如一个样本的非常小,那么交叉熵的梯度就会非常大而sigmoid+平方损失的梯度却非常小。非常小的梯度意味着小的变化,如果使用sigmoid+平方损失作为损失函数,会让模型收敛的非常慢。
总之,分类问题,用交叉熵非常的好。
那么SVM的hinge loss是什么呢?
其实这个的函数图像与交叉熵非常的像:
图中紫色的就是hinge loss的图像了,为了让其更加明显,用红色的箭头来凸显了。
【PS:有一点点像ReLu的翻转】
【Hinge Loss vs CrossEntropy】
Hinge loss感觉就会把更多的注意力放在没有分类分的很好的那些样本上,不会再注意的样本了。像是focal loss的感觉。
最后,可以感觉到。如果线性SVM使用交叉熵损失函数的那,那就是Logistic Regression逻辑回归了。所以SVM与其他模型区分的关键就是Hinge Loss损失函数。
所以有的时候,对于一个多层感知机,使用了Hinge Loss的话,也会被成为深度SVM模型。