深度学习笔记(一)线性SVM与SoftMax分类器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fyuanfena/article/details/52485390

1. 线性分类器

KNN处理图像识别虽然实现起来非常简单,但是有很大的弊端:

  • 分类器必须记住全部的训练数据(因为要遍历找近邻啊!!),而在任何实际的图像训练集上,数据量很可能非常大,那么一次性载入内存,不管是速度还是对硬件的要求,都是一个极大的挑战。
  • 分类的时候要遍历所有的训练图片,这是一个相当相当相当耗时的过程。
    这个部分我们介绍一类新的分类器方法,而对其的改进和启发也能帮助我们自然而然地过渡到深度学习中的卷积神经网。有两个重要的概念:

  • 得分函数/score function:将原始数据映射到每个类的打分的函数

  • 损失函数/loss function:用于量化模型预测结果和实际结果之间吻合度的函数
    在我们得到损失函数之后,我们就将问题转化成为一个最优化的问题,目标是得到让我们的损失函数取值最小的一组参数。

2.损失函数

腻害的大神们定义出了好些损失函数,我们这里首先要介绍一种极其常用的,叫做多类别支持向量机损失(Multiclass SVM loss)。如果要用一句精简的话来描述它,就是它(SVM)希望正确的类别结果获得的得分比不正确的类别,至少要高上一个固定的大小\(\Delta\)

我们先解释一下这句话,一会儿再举个例子说明一下。对于训练集中的第i张图片数据xi,我们的得分函数,在参数W下会计算出一个所有类得分结果\(f(x_{i},W)\),其中第j类得分我们记作\(f(x_i, W)_j\),该图片的实际类别为yi,则对于第i张样本图片,我们的损失函数是如下定义的:

Li=jyimax(0,sjsyi+Δ)

假定我们现在有三个类,score值为s = [13, -7, 11],而实际的结果是第一类(yi=0)。假定\(\Delta\)为10。那么上文的\(L_i \)损失函数如下:

Li=max(0,713+10)+max(0,1113+10)

仔细看看上述的两项,左边项-10和0中的最大值为0,因此取值是零。其实这里的含义是,实际的类别得分13要比第二类得分-7高出20,超过了我们设定的正确类目和错误类目之间的最小margin\(\Delta=10\),因此第二类的结果我们认为是满意的,并不带来loss,所以值为0。而第三类得分11,仅比13小2,没有大于\(\Delta=10\),因此我们认为他是有损失loss的,而损失就是当前距离2距离设定的最小距离\(\Delta\)的差距8。

我们还需要提一下的是,关于损失函数中\(max(0,-)\)的这种形式,我们也把它叫做hinge loss/铰链型损失,有时候你会看到squared hinge loss SVM(也叫L2-SVM),它用到的是\(max(0,-)^2\),这个损失函数惩罚那些在设定\(\Delta\)距离之内的错误类别的惩罚度更高。两种损失函数标准在特定的场景下效果各有优劣,要判定用哪个,还是得借助于交叉验证/cross-validation。

对于损失函数的理解,可以参照下图:

正则化

然而上面的损失函数有一定的bug。假定我们有一个权值W可以进行正确的分类(也就是说对于所有的i,损失函数\(L_i=0\)),那么现在将W加倍,\(\lambda W\)同样也会得到0损失值。可是这种转化也将正确类\(y_i\)与错误类的score的相差值扩大了\(\lambda\)倍。

因此,想要消除这种误差,我们采用regularization penalty \(R(W)\).比较通用的是L2范式

R(W)=klW2k,l

上式将权值的平方累加,对权值进行正则化。因此多分类SVM损失函数包含数据损失函数和权值损失函数两部分,如下所示:

L=1NiLidata loss+λR(W)regularization loss

或者也可以把它展开来看:

L=1Nijyi[max(0,f(xi;W)jf(xi;W)yi+Δ)]+λklW2k,l

对太大的权值进行惩罚能够很好地提升泛化能力,这就意味着输入维度不会对影响score值。比如我们有一个向量x = [1,1,1,1],还有两个权值向量\(w_1 = [1,0,0,0]\)和\(w_2 = [0.25,0.25,0.25,0.25]\)。那么\(w_1^Tx = w_2^Tx = 1\),所以不加正则项的时候,这俩得到的结果是完全一样的,也就意味着——它们是等价的。但是加了正则项之后,我们发现w2总体的损失函数结果更小(因为4*0.25^2<1),因此L2惩罚项更倾向于选择w2,也就是更小更分散的权值向量,这样最终的分类器会倾向于考虑所有的输入特征,而不是仅考虑一个特征。这样就可以更好地提升泛化能力,来避免过拟合

另外,我们在讨论过拟合的这个部分的时候,并没有提到b这个参数,这是因为它并不具备像W一样的控制输入特征的某个维度影响力的能力。还需要说一下的是,因为正则项的引入,训练集上的准确度是会有一定程度的下降的,我们永远也不可能让损失达到零了(因为这意味着正则化项为0,也就是W=0)。

下面是简单的计算损失函数(没加上正则化项)的代码,有未向量化和向量化两种形式:

实用考虑:

设置Delta

前文的损失函数使用了\(\Delta\)当做界定距离,那么\(\Delta\)设置为多少比较合理呢?莫不是…也需要交叉验证…?其实基本上大部分的场合下我们设定Δ=1.0都是一个安全的设定。我们看公式中的参数Δ和λ似乎是两个截然不同的参数,实际上他俩做的事情比较类似,都是尽量让模型贴近标准预测结果的时候,在 数据损失/data loss和 正则化损失/regularization loss之间做一个交换和平衡

在损失函数计算公式里,可以看出,权重W的幅度对类别得分有最直接的影响,我们减小W,最后的得分就会减少;我们增大W,最后的得分就增大。从这个角度看,Δ这个参数的设定(Δ=1或者Δ=100),其实无法限定W的伸缩。而真正可以做到这点的是正则化项,λ的大小,实际上控制着权重可以增长和膨胀的空间。

关于二元/Binary支持向量机

如果大家之前接触过Binary SVM,我们知道它的公式如下:

Li=Cmax(0,1yiwTxi)+R(W)

我们可以理解为类别yi∈−1,1,它是我们的多类别识别的一个特殊情况,而这里的C和λ是一样的作用,只不过他们的大小对结果的影响是相反的,也就是\(C \propto \frac{1}{\lambda}\)

与二分类SVM的关联

二分类的损失函数如下:

Li=Cmax(0,1yiwTxi)+R(W)

C在此处代表的是\(C \propto \frac{1}{\lambda}\)

Softmax 分类器

话说其实有两种特别常见的分类器,前面提的SVM是其中的一种,而另外一种就是Softmax分类器,它有着截然不同的损失函数。如果你听说过『逻辑回归二分类器』,那么Softmax分类器是它泛化到多分类的情形。不像SVM这种直接给类目打分\(f(x_i,W)\)并作为输出,Softmax分类器从新的角度做了不一样的处理,我们依旧需要将输入的像素向量映射为得分\(f(x_i; W) = W x_i\),只不过我们还需要将得分映射到概率域,我们也不再使用hinge loss了,而是使用交叉熵损失/cross-entropy loss,形式如下:

Li=logefyijefjor equivalentlyLi=fyi+logjefj

我们使用\(f_j\)来代表得分向量f的第j个元素值。和前面提到的一样,总体的损失/loss也是\(L_i\)遍历训练集之后的均值,再加上正则化项\(R(W)\),而函数\(f_j(z) = \frac{e^{z_j}}{\sum_k e^{z_k}}\)被称之为softmax函数:它的输入值是一个实数向量z,然后在指数域做了一个归一化(以保证之和为1)映射为概率。

信息论角度的理解

对于两个概率分布p(“真实的概率分布”)和估测的概率分布q(估测的属于每个类的概率),它们的互熵定义为如下形式:

H(p,q)=xp(x)logq(x)

而Softmax分类器要做的事情,就是要 最小化预测类别的概率分布(之前看到了,是\(q = e^{f_{y_i}} / \sum_j e^{f_j}\))与『实际类别概率分布』(\(p = [0, \ldots 1, \ldots, 0]\),只在结果类目上是1,其余都为0)两个概率分布的 交叉熵

另外,因为互熵可以用熵加上KL距离/Kullback-Leibler Divergence(也叫相对熵/Relative Entropy)来表示,即\(H(p,q) = H(p) + D_{KL}(p||q)\),而p的熵为0(这是一个确定事件,无随机性),所以互熵最小化,等同于最小化两个分布之间的KL距离。换句话说,交叉熵想要从给定的分布q上预测结果分布p。

概率角度的理解

我们再来看看以下表达式

P(yixi;W)=efyijefj

其实可以看做给定图片数据\(x_i\)和类别\(y_i\)以及参数W之后的归一化概率。在概率的角度理解,我们在做的事情,就是最小化错误类别的负log似然概率,也可以理解为进行最大似然估计/Maximum Likelihood Estimation (MLE)。这个理解角度还有一个好处,这个时候我们的正则化项\(R(W)\)有很好的解释性,可以理解为整个损失函数在权重矩阵W上的一个高斯先验,所以其实这时候是在做一个最大后验估计/Maximum a posteriori (MAP)。

2.5.3 实际工程上的注意点:数据稳定性

在我们要写代码工程实现Softmax函数的时候,计算的中间项\(e^{f_{y_i}}\)和\(\sum_j e^{f_j}\)因为指数运算可能变得非常大,除法的结果非常不稳定,所以这里需要一个小技巧。注意到,如果我们在分子分母前都乘以常数C,然后整理到指数上,我们会得到下面的公式:

efyijefj=CefyiCjefj=efyi+logCjefj+logC

C的取值由我们而定,不影响最后的结果,但是对于实际计算过程中的稳定性有很大的帮助。一个最常见的C取值为\(\log C = -\max_j f_j\)。这表明我们应该平移向量f中的值使得最大值为0,以下的代码是它的一个实现:

f = np.array([123, 456, 789]) # 3个类别的预测示例
p = np.exp(f) / np.sum(np.exp(f)) # 直接运算,数值稳定性不太好

# 我们先对数据做一个平移,所以输入的最大值为0:
f -= np.max(f) # f 变成 [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # 结果正确,同时解决数值不稳定问题

关于softmax这个名字的一点说明

准确地说,SVM分类器使用hinge loss(有时候也叫max-margin loss)。而Softmax分类器使用交叉熵损失/cross-entropy loss。Softmax分类器从softmax函数(恩,其实做的事情就是把一列原始的类别得分归一化到一列和为1的正数表示概率)得到,softmax函数使得交叉熵损失可以用起来。而实际上,我们并没有softmax loss这个概念,因为softmax实质上就是一个函数,有时候我们图方便,就随口称呼softmax loss。

SVM 与 Softmax

这个比较很有意思,就像在用到分类算法的时候,就会想SVM还是logistic regression呢一样。
我们先用一张图来表示从输入端到分类结果,SVM和Softmax都做了啥:

区别就是拿到原始像素数据映射得到的得分之后的处理,而正因为处理方式不同,我们定义不同的损失函数,有不同的优化方法。

另外的差别

  • SVM下,我们能完成类别的判定,但是实际上我们得到的类别得分,大小顺序表示着所属类别的排序,但是得分的绝对值大小并没有特别明显的物理含义
  • Softmax分类器中,结果的绝对值大小表征属于该类别的概率
    举个例子说,SVM可能拿到对应 猫/狗/船 的得分[12.5, 0.6, -23.0],同一个问题,Softmax分类器拿到[0.9, 0.09, 0.01]。这样在SVM结果下我们只知道『猫』是正确答案,而在Softmax分类器的结果中,我们可以知道属于每个类别的概率。

但是,Softmax中拿到的概率,其实和正则化参数λ有很大的关系,因为λ实际上在控制着W的伸缩程度,所以也控制着最后得分的scale,这会直接影响最后概率向量中概率的『分散度』,比如说某个λ下,我们得到的得分和概率可能如下:

[1,2,0][e1,e2,e0]=[2.71,0.14,1][0.7,0.04,0.26]

而我们加大λ,提高其约束能力后,很可能得分变为原来的一半大小,这时候如下:

[0.5,1,0][e0.5,e1,e0]=[1.65,0.37,1][0.55,0.12,0.33]

因为λ的不同,使得最后得到的结果概率分散度有很大的差别。在上面的结果中,猫有着统治性的概率大小,而在下面的结果中,它和船只的概率差距被缩小。

实际应用中的SVM与Softmax分类器

实际应用中,两类分类器的表现是相当的。当然,每个人都有自己的喜好和倾向性,习惯用某类分类器。

一定要对比一下的话:
SVM其实并不在乎每个类别得到的绝对得分大小,举个例子说,我们现在对三个类别,算得的得分是[10, -2, 3],实际第一类是正确结果,而设定\(\Delta=1\),那么10-3=7已经比1要大很多了,那对SVM而言,它觉得这已经是一个很标准的答案了,完全满足要求了,不需要再做其他事情了,结果是 [10, -100, -100] 或者 [10, 9, 9],它都是满意的。

然而对于Softmax而言,不是这样的, [10, -100, -100] 和 [10, 9, 9]映射到概率域,计算得到的交叉熵损失是有很大差别的。所以Softmax是一个永远不会满足的分类器,在每个得分计算到的概率基础上,它总是觉得可以让概率分布更接近标准结果一些,交叉熵损失更小一些。

有兴趣的话,W与得分预测结果demo是一个可以手动调整和观察二维数据上的分类问题,随W变化结果变化的demo,可以动手调调看看。

Reference:

CS231原文
参考译文

Softmax回归

支持向量机通俗导论(理解SVM的三层境界)

猜你喜欢

转载自blog.csdn.net/fyuanfena/article/details/52485390