zoukankan      html  css  js  c++  java
  • 线性分类器

    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进入了统治地位。

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

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

     

     

  • 相关阅读:
    飞入飞出效果
    【JSOI 2008】星球大战 Starwar
    POJ 1094 Sorting It All Out
    POJ 2728 Desert King
    【ZJOI 2008】树的统计 Count
    【SCOI 2009】生日快乐
    POJ 3580 SuperMemo
    POJ 1639 Picnic Planning
    POJ 2976 Dropping Tests
    SPOJ QTREE
  • 原文地址:https://www.cnblogs.com/tangmiao/p/8182971.html
Copyright © 2011-2022 走看看