深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器

作者: 寒小阳
时间:2015年11月。
出处:http://blog.csdn.net/han_xiaoyang/article/details/49999299
声明:版权所有,转载请注明出处,谢谢。

1. 线性分类器

深度学习与计算机视觉系列(2)我们提到了图像识别的问题,同时提出了一种简单的解决方法——KNN。然后我们也看到了KNN在解决这个问题的时候,虽然实现起来非常简单,但是有很大的弊端:

  • 分类器必须记住全部的训练数据(因为要遍历找近邻啊!!),而在任何实际的图像训练集上,数据量很可能非常大,那么一次性载入内存,不管是速度还是对硬件的要求,都是一个极大的挑战。
  • 分类的时候要遍历所有的训练图片,这是一个相当相当相当耗时的过程。

这个部分我们介绍一类新的分类器方法,而对其的改进和启发也能帮助我们自然而然地过渡到深度学习中的卷积神经网。有两个重要的概念:

  • 得分函数/score function:将原始数据映射到每个类的打分的函数
  • 损失函数/loss function:用于量化模型预测结果和实际结果之间吻合度的函数

在我们得到损失函数之后,我们就将问题转化成为一个最优化的问题,目标是得到让我们的损失函数取值最小的一组参数。

2. 得分函数/score function

首先我们定义一个有原始的图片像素值映射到最后类目得分的函数,也就是这里提到的得分函数。先笼统解释一下,一会儿我们给个具体的实例来说明。假设我们的训练数据为 xiRD ,对应的标签 yi ,这里 i=1N 表示N个样本, yi1K 表示K类图片。

比如CIFAR-10数据集中N=50000,而D=32x32x3=3072像素,K=10,因为这时候我们有10个不同的类别(狗/猫/车…),我们实际上要定义一个将原始像素映射到得分上函数 f:RDRK

2.1 线性分类器

我们先丢出一个简单的线性映射:


f(xi,W,b)=Wxi+b

在这个公式里,我们假定图片的像素都平展为[D x 1]的向量。然后我们有两个参数:W是[K x D]的矩阵,而向量b为[K x 1]的。在CIFAR-10中,每张图片平展开得到一个[3072 x 1]的向量,那W就应该是一个[10 x 3072]的矩阵,b为[10 x 1]的向量。

这样,以我们的线性代数知识,我们知道这个函数,接受3072个数作为输入,同时输出10个数作为类目得分。我们把W叫做权重,b叫做偏移向量

说明几个点:

  • 我们知道一次矩阵运算,我们就可以借助W把原始数据映射为10个类别的得分。
  • 其实我们的输入 (xi,yi) 其实是固定的,我们现在要做的事情是,我们要调整W, b使得我们的得分结果和实际的类目结果最为吻合。
  • 我们可以想象到,这样一种分类解决方案的优势是,一旦我们找到合适的参数,那么我们最后的模型可以简化到只有保留W, b即可,而所有原始的训练数据我们都可以不管了。
  • 识别阶段,我们需要做的事情仅仅是一次矩阵乘法和一次加法,这个计算量相对之前…不要小太多好么…

提前剧透一下,其实卷积神经网做的事情也是类似的,将原始输入的像素映射成类目得分,只不过它的中间映射更加复杂,参数更多而已…

2.2 理解线性分类器

我们想想,其实线性分类器在做的事情,是对每个像素点的三个颜色通道,做计算。咱们拟人化一下,帮助我们理解,可以认为设定的参数/权重不同会影响分类器的『性格』,从而使得分类器对特定位置的颜色会有自己的喜好

举个例子,假如说我们的分类器要识别『船只』,那么它可能会喜欢图片的四周都是蓝色(通常船只是在水里海里吧…)。

我们用一个实际的例子来表示这个得分映射的过程,大概就是下图这个样子:

得分函数

原始像素点向量 xi 经过W和b映射为对应结果类别的得分 f(xi,W,b)=Wxi+b 。不过上面这组参数其实给的是不太恰当的,因为我们看到在这组参数下,图片属于狗狗的得分最高 -_-||

2.2.1 划分的第1种理解

图片被平展开之后,向量维度很高,高维空间比较难想象。我们简化一下,假如把图片像素输入,看做可以压缩到二维空间之中的点,那我们想想,分类器实际上在做的事情就如下图所示:

分割

W中的每一列对应类别中的每一类,而当我们改变W中的值的时候,图上的线的方向会跟着改变,那么b呢?对,b是一个偏移量,它表示当我们的直线方向确定以后,我们可以适当平移直线到合适的位置。没有b会怎么样呢,如果直线没有偏移量,那意味着所有的直线都要通过原点,这种强限制条件下显然不能保证很好的平面类别分割。

2.2.2 划分的第2种理解

对W第二种理解方式是,W的每一行可以看做是其中一个类别的模板。而我们输入图片相对这个类别的得分,实际上是像素点和模板匹配度(通过内积运算获得),而类目识别实际上就是在匹配图像和所有类别的模板,找到匹配度最高的那个。

是不是感觉和KNN有点类似的意思?是有那么点相近,但是这里我们不再比对所有图片,而是比对类别的模板,这样比对次数只和类目数K有关系,所以自然计算量要小很多,同时比对的时候用的不再是l1或者l2距离,而是内积计算。

我们提前透露一下CIFAR-10上学习到的模板的样子:

CIFAR-10模板

你看,和我们设想的很接近,ship类别的周边有大量的蓝色,而car的旁边是土地的颜色。

2.2.3 关于偏移量的处理

我们先回到如下的公式:


f(xi,W,b)=Wxi+b

公式中有W和b两个参数,我们知道调节两个参数总归比调节一个参数要麻烦,所以我们用一点小技巧,来把他们组合在一起,放到一个参数中。

我们现在要做的运算是矩阵乘法再加偏移量,最常用的合并方法就是,想办法把b合并成W的一部分。我们仔细看看下面这张图片:

合并W与b

我们给输入的像素矩阵加上一个1,从而把b拼接到W里变成一个变量。依旧拿CIFAR-10举例,原本是[3072 x 1]的像素向量,我们添上最后那个1变成[3073 x 1]的向量,而[W]变成[W b]。

2.2.4 关于数据的预处理

插播一段,实际应用中,我们很多时候并不是把原始的像素矩阵作为输入,而是会预先做一些处理,比如说,有一个很重要的处理叫做『去均值』,他做的事情是对于训练集,我们求得所有图片像素矩阵的均值,作为中心,然后输入的图片先减掉这个均值,再做后续的操作。有时候我们甚至要对图片的幅度归一化/scaling。去均值是一个非常重要的步骤,原因我们在后续的梯度下降里会提到。

2.3 损失函数

我们已经通过参数W,完成了由像素映射到类目得分的过程。同时,我们知道我们的训练数据 (xi,yi) 是给定的,我们可以调整的是参数/权重W,使得这个映射的结果和实际类别是吻合的。

我们回到最上面的图片中预测 [猫/狗/船] 得分的例子里,这个图片中给定的W显然不是一个合理的值,预测的结果和实际情况有很大的偏差。于是我们现在要想办法,去把这个偏差表示出来,拟人一点说,就是我们希望我们的模型在训练的过程中,能够对输出的结果计算并知道自己做的好坏。

而能帮助我们完成这件事情的工具叫做『损失函数/loss function』,其实它还有很多其他的名字,比如说,你说不定在其他的地方听人把它叫做『代价函数/cost function』或者『客观度/objective』,直观一点说,就是我们输出的结果和实际情况偏差很大的时候,损失/代价就会很大。

2.3.1 多类别支持向量机损失/Multiclass Support Vector Machine loss

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

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


Li=jyimax(0,f(xi,W)jf(xi,W)yi+Δ)

看公式容易看瞎,译者也经常深深地为自己智商感到捉急,我们举个例子来解释一下这个公式。
假如我们现在有三个类别,而得分函数计算某张图片的得分为 f(xi,

  • 49
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值