线性分类器

Posted 唐淼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性分类器相关的知识,希望对你有一定的参考价值。

1.理解线性分类器

目前我了解学习的线性分类器有2个:SVM和逻辑回归(也就是SoftMax),这2个分类器的主体都是一样,不同的地方就是生成损失函数不一样。所以我先讲主体,再讲损失函数,关于线性分类器,大体就是这个样子:

技术分享图片

图片说明:生成这三根直线就是三个线性分类器,如果生成了这三根直线后,后面再有测试集进来,在靠近那根直线向外,就是属于哪个分类器的。(当然这只是形象的理解,真实的不可能就在二维平面上就这样分类了,一般是在高维空间)

主体函数为:f(xi,W,b)=Wxi+b ,xi就是训练集里各个图片的特征向量,W是分类的模板向量也叫权重(从这里为了好理解可以直接理解上图的斜率),b是偏移向量(这里为了好理解可以理解为了让直线不仅仅是经过原点,更好的划分)。结合下图更好的说明:

技术分享图片

假设图片是一个2*2的,把它化成一个列向量xi(上图的xi和b是我自己加的,原图没有),左乘一个W权重,加上b就能得到这张图片为每一类的分数了。很明显上图的W和b不好,导致dog的分数很高,预测的结果和实际情况有很大的偏差。于是我们现在要想办法,去把这个偏差表示出来,拟人一点说,我们可以调整的是参数/权重W,使得这个映射的结果和实际类别是吻合的,就是我们希望我们的模型在训练的过程中,能够对输出的结果计算并知道自己做的好坏。而能帮助我们完成这件事情的工具叫做损失函数(loss function)。直观一点说,就是我们输出的结果和实际情况偏差很大的时候,损失/代价就会很大。损失函数的不同就产生了2种不同的算法:SVM和SoftMax.

2.损失函数

2.1 SVM(Support Vector Machine)

用一句精简的话来描述它,就是它(SVM)希望正确的类别结果获得的得分比不正确的类别,至少要高上一个固定的大小Δ

SVM的损失函数计算公式为:技术分享图片

Li为第i张图片的损失分数,技术分享图片就是每一个得到的错误分数与正确分数相差多少,Δ就是你希望正确的应该比错误的大上多少,没大于Δ就是有损失的。形象解释如下图:

技术分享图片技术分享图片技术分享图片技术分享图片

SVM并不关心某个图片损失分数是多少,但是在乎不同图片相差的损失分数。

但是只应用这个公式这里还会产生一个问题就是,你会根据训练集产生这样的分类器:

技术分享图片

蓝色圆是训练集,曲线是分类器,这样的不像线性分类器(变得离散了),产生的原因就是:如果参数W能够正确地识别训练集中所有的图片(损失函数为0)。那么我们对W做一些变换,可以得到无数个使得能满足loss function=0的参数W。举例:

假定我们的输入图片像素矩阵是x=[1,1,1,1],而现在我们有两组不同的W权重参数中对应的向量w1=[1,0,0,0]w2=[0.25,0.25,0.25,0.25]。那我们很容易知道w1(T)*x=w2(T)*x=1 。(说明:括号里面的T为转置的意思)。那么这时我们不能分辨w1和w2哪个好,因此,我们需要正则来纠正,这里可以改为(wi^2)*x就能分别出来了:加了正则项之后,我们发现w2总体的损失函数结果更小(因为4*0.25^2<1),于是我们的系统会选择w2,如下图:

技术分享图片

加上正则(λR(W))之后就能趋近于线性了,那么测试集(绿色的砖块)也能比较清楚的划分了。关于正则有几种类型就不说了。

2.2 Softmax分类器

Softmax分类器从新的角度做了不一样的处理,我们依旧需要将输入的像素向量映射为得分f(xi; W) = W *xi,只不过我们还需要将得分映射到概率域。公式为:(我的理解它这里把b合到W里面去了)

技术分享图片

这里有一张图就解释清楚了:

技术分享图片

先把所有分数都经过e的指数,变为整数,然后归一化,然后得到正确的分类的可能性,然后再进过对数运算,因为归一化过,数的大小都在(0,1)之间,都为负数,所以加个负号好观察比较,得到的结果越接近0表明为1的概率越大,就越正确。

 

3.最优化与随机梯度下降

既然我们知道有损失函数了,那么我们就要尝试改变W使损失函数尽可能的降为0对吗,损失函数越小,表明W这个模板向量分类的正确性越高。

  • 所以最直接粗暴的方法就是,我们尽量多地去试参数,然后从里面选那个让损失函数最小的,作为最后的W,但是这样的方法明显不是很好,不仅耗费的时间多而且正确率不高。

 

  • 刚才的策略,我们说了,最大的缺点是非常耗时,且计算量也很大。我们一直在做的事情,就是在当前的位置基础上,想找到一个最合适的下降方向。我们依旧回到我们假设的那个情境,如果我们在山顶,要以最快的方式下山,我们会怎么做?我们可能会环顾四周,然后找到最陡的方向,迈一小步,然后再找当前位置最陡的下山方向,再迈一小步…而这里提到的最陡的方向,其实对应的就是数学里『梯度』的概念,也就是说,其实我们无需『伸脚试探』周边的陡峭程度,而是可以通过计算损失函数的梯度,直接取得这个方向。我们知道在1个变量的函数里,某点的斜率/导数代表其变化率最大的方向。而对于多元的情况,梯度是上面情况的一个扩展,只不过这时候的变量不再是一个,而是多个,同时我们计算得到的『梯度方向』也是一个多维的向量。大家都知道数学上计算1维/元函数『梯度/导数』的表达式如下技术分享图片

 

对于多元的情况,这个时候我们需要求的东西扩展成每个方向的『偏导数』,然后把它们合在一块组成我们的梯度向量。

虽然上面的第二个通求W的“偏导数”能够很好实现梯度下降,但是当图片种类特别多(假设为N)时,而W的矩阵大小为N*N,当N大于一定数据量时,计算机处理就可能非常慢。又因为W是一个雅可比矩阵,是对每个元素分别进行运算,比如输入里面的第一个元素,只和输出的第一个元素有关,所以可以采用蒙特卡洛算法来随机采样,一般会选择2的倍数。

4.总结

  • SVM其实并不在乎每个类别得到的绝对得分大小,举个例子说,我们现在对三个类别,算得的得分是[10, -2, 3],实际第一类是正确结果,而设定Δ=1,那么10-3=7已经比1要大很多了,那对SVM而言,它觉得这已经是一个很标准的答案了,完全满足要求了,不需要再做其他事情了,结果是 [10, -100, -100] 或者 [10, 9, 9],它都是满意的。
  • 然而对于Softmax而言,不是这样的, [10, -100, -100] 和 [10, 9, 9]映射到概率域,计算得到的交叉熵损失是有很大差别的。所以Softmax是一个永远不会满足的分类器,在每个得分计算到的概率基础上,它总是觉得可以让概率分布更接近标准结果一些,交叉熵损失更小一些。
  • 其实SVM和softmax一般是不会直接对像素进行分析的,因为那样环境对分类影响太大了,所以一般先会提取特征(方法有HOG,SIFT,SURF,ORB,其中HOG一般用于行人检测,SURF是SIFT的进化版本),然后分词带(BOW),最后再用分类器去建立模型,结果比较准确,当然这是在卷积神经网络(CNN)出现之前,在2012年ImageNet比赛中,CNN的准确度彻底压制了SVM这类算法,从此CNN进入了统治地位。

但是线性分类器还是无法分类一些东西,比如如下:

技术分享图片

无法将蓝色区域和红色区域分开,这时候就要到后面的神经网络的激励函数解释去了。

 

 

 

以上是关于线性分类器的主要内容,如果未能解决你的问题,请参考以下文章

线性分类器

学习朴素贝叶斯分类器本质上是线性分类器

Python 代码CS231n中Softmax线性分类器非线性分类器对比举例(含python绘图显示结果)

BAT机器学习面试1000题系列(41-45题)

机器学习基础笔记:最简单的线性分类器

cs231n笔记:线性分类器