• 2、线性SVM与Softmax分类器

    • 2.1 得分函数(score function)

      • 2.1.1 线性分类器
      • 2.1.2 理解线性分类器
    • 2.2 损失函数
      • 2.2.1 多类别支持向量机损失(Multiclass SVM loss)
      • 2.2.2 正则化
    • 2.3 实际中的考虑点
      • 2.3.1 设定Delta
      • 2.3.2 关于二元(Binary)支持向量机
      • 2.3.3 关于非线性SVM
    • 2.4 Softmax分类器
      • 2.4.1 从信息论角度理解
      • 2.4.2 从概率角度理解
      • 2.4.3 实际工程的注意点:数据稳定性
      • 2.4.4 softmax名字的说明
    • 2.5 SVM与Softmax
      • 2.5.1 损失函数
      • 2.5.2 分类器的本质
      • 2.5.3 实际应用中的SVM与Softmax分类器

2、线性SVM与Softmax分类器

鉴于kNN的分类弊端,本节介绍一种新的分类器,其中由两个很重要的概念:

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

  • 损失函数:用于量化模型预测结果和实际结果之间吻合度的函数

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

2.1 得分函数(score function)

首先我们定义一个有原始的图片像素值映射到最后类目得分的函数,也就是这里提到的得分函数。

假设我们的训练数据为xi∈RDxi∈RDx_ i ∈R D ,对应的标签yiyiy_ i ,这里i=1…Ni=1…Ni=1…N
表示NNN个样本,yi∈1…K" role="presentation" style="position: relative;">yi∈1…Kyi∈1…Ky _i ∈1…K 表示K类图片。

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

2.1.1 线性分类器

简单的线性映射:f(xi,W,b)=Wxi+bf(xi,W,b)=Wxi+bf(x _i ,W,b)=W x _i+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]的向量。

说明几个点:

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

2.1.2 理解线性分类器

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

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

1)划分的第一种理解

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

W中的每一列对应类别中的类,而当我们改变W中的值的时候,图上的线的方向会跟着改变。

b是一个偏移量,它表示当我们直线的方向确定之后,能够更适当的平移到合适的位置,如果没有b的话,所有的直线都会经过原点,这种强制条件下显然不能保证很好的平面类别分割。

2)划分的第二种理解

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

感觉和KNN有些类似,不过我们这里不再像KNN那样比对所有的图像,而是比对类别的模板,这样对比次数只和类目数k有关系,所以计算量会小很多,且不再使用L1 / L2距离,而是使用内积进行计算。

这里展示了CIFAR-10上学习到的模板的样子:

3)偏移量的处理

线性分类器:f(xi,W,b)=Wxi+bf(xi,W,b)=Wxi+bf(x _i ,W,b)=W x _i+b

公式中有W和b两个参数,我们知道调节两个参数比调节一个参数要麻烦很多,所以我们将其组合起来,放到一个参数中去。

我们现在要做的运算是矩阵乘法再加偏移量,最常用的合并方法就是将b加入W中:

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

4)关于数据的预处理

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

2.2 损失函数

通过参数W和b可以完成由像素到类目得分的过程,同时,我们知道训练数据(xi,yi)(xi,yi)(x_ i ,y_ i )是给定的,可以通过调整参数来使得映射的结果和实际的类别吻合。

上面预测猫、狗的例子中,预测的结果和实际结果相差很大,于是我们要想办法将这个偏差表示出来。

能够完成偏差表示的工具叫做“损失函数”,也就是当偏差很大的时候,损失函数值会很大,我们训练的目标就转化为最小化损失函数。

2.2.1 多类别支持向量机损失(Multiclass SVM loss)

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

2.2.2 正则化

把W参数的这种不确定性去除掉,这就是我们要提到的正则化,我们需要在原来的损失函数上再加上一项正则化项(regularization penalty R(W) ),最常见的正则化项是 L2 范数,它会对幅度很大的特征权重给很高的惩罚:

根据公式可以看到,这个表达式R(W)把所有W的元素的平方项求和了。而且它和数据本身无关,只和特征权重有关系。

我们把两部分组(数据损失/data loss和正则化损失/regularization loss)在一起,得到完整的多类别SVM损失权重,如下:

也可以展开,得到更具体的完整形式:

其中,N是训练样本数,我们给正则化一个参数λλ\lambda,但是这个参数的设定只有通过实验确定,也就是通过交叉验证确定。

假定我们的输入图片像素矩阵是x=[1,1,1,1]x=[1,1,1,1]x=[1,1,1,1] ,而现在我们有两组不同的W权重参数中对应的向量w1=[1,0,0,0]w1=[1,0,0,0]w_ 1 =[1,0,0,0] ,w2=[0.25,0.25,0.25,0.25]w2=[0.25,0.25,0.25,0.25]w _2 =[0.25,0.25,0.25,0.25] 。那我们很容易知道wT1x=wT2x=1w1Tx=w2Tx=1w ^T _1 x=w^ T_ 2 x=1 ,所以不加正则项的时候,这俩得到的结果是完全一样的,也就意味着——它们是等价的。但是加了正则项之后,我们发现w2w2w _2 总体的损失函数结果更小(因为4*0.25^2<1),于是我们的系统会选择w2w2w _2 ,这也就意味着系统更『喜欢』权重分布均匀的参数,而不是某些特征权重明显高于其他权重(占据绝对主导作用)的参数。

之后的系列里会提到,这样一个平滑的操作,实际上也会提高系统的泛化能力,让其具备更高的通用性,而不至于在训练集上过拟合。

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

2.3 实际中的考虑点

2.3.1 设定Delta

我们在计算Multi SVM loss的时候,Δ是我们提前设定的一个参数。这个值咋设定?莫不是…也需要交叉验证…?其实基本上大部分的场合下我们设Δ=1.0 都是一个安全的设定。我们看公式中的参数Δ 和λ似乎是两个截然不同的参数,实际上他俩做的事情比较类似,都是尽量让模型贴近标准预测结果的时候,在 数据损失/data loss和 正则化损失/regularization loss之间做一个交换和平衡。

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

2.3.2 关于二元(Binary)支持向量机

二元支持向量机的公式如下:

我们可以理解为类别yi∈−1,1yi∈−1,1y i ∈−1,1 ,它是我们的多类别识别的一个特殊情况,而这里的CCC和λ" role="presentation" style="position: relative;">λλλ是一样的作用,只不过他们的大小对结果的影响是相反的,也就是C∝1/λC∝1/λC∝1/λ 。

2.3.3 关于非线性SVM

如果对机器学习有了解,你可能会了解很多其他关于SVM的术语:kernel,dual,SMO算法等等。在这个系列里面我们只讨论最基本的线性形式。当然,其实从本质上来说,这些方法都是类似的。

2.4 Softmax分类器

两种最常见的分类器,包括SVM和Softmax,它们有着截然不同的损失函数,softmax分类器就是逻辑回归二分类器泛化到多类的情形,不像SVM直接给类目打分f(xi,W)f(xi,W)f(x_ i ,W) 并作为输出,softmax分类器从新的角度做了不一样的处理,即需要将得分映射到概率域,不使用hinge loss了,而是用交叉熵损失函数:

其中,使用fifif_i来表示分向量fff的第j个元素值,总体的损失也是Li" role="presentation" style="position: relative;">LiLiL_i遍历训练集之后的均值,再加上正则化项R(W)R(W)R(W),而函数fj(z)=ezj∑kezkfj(z)=ezj∑kezkf _j (z)=\frac{e^z j }{ ∑_ k e^ {z _k} } 被称为softmax函数,其输入值是一个实数向量zzz,然后在指数域做了一个归一化,保证其和为1,映射为概率。

2.4.1 从信息论角度理解

2.4.2 从概率角度理解

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

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)) # 结果正确,同时解决数值不稳定问题

2.4.4 softmax名字的说明

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

2.5 SVM与Softmax

2.5.1 损失函数

下图是表示从输入端到分类结果的过程中,两者分别做了什么工作:

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

2.5.2 分类器的本质

  • 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,e−2,e0]=[2.71,0.14,1]→[0.7,0.04,0.26]" role="presentation">[1,−2,0]→[e1,e−2,e0]=[2.71,0.14,1]→[0.7,0.04,0.26][1,−2,0]→[e1,e−2,e0]=[2.71,0.14,1]→[0.7,0.04,0.26]

[1,−2,0]→[e ^1 ,e^{ −2} ,e ^0 ]=[2.71,0.14,1]→[0.7,0.04,0.26]

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

[0.5,−1,0]→[e0.5,e−1,e0]=[1.65,0.37,1]→[0.55,0.12,0.33][0.5,−1,0]→[e0.5,e−1,e0]=[1.65,0.37,1]→[0.55,0.12,0.33]

[0.5,−1,0]→[e ^{0.5} ,e^{ −1} ,e ^0 ]=[1.65,0.37,1]→[0.55,0.12,0.33]

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

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

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

一定要对比一下的话:

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

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

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

深度学习与计算机视觉(二)线性SVM与Softmax分类器相关推荐

  1. 【深度学习笔记(二)】之Softmax分类器

    本文章由公号[开发小鸽]发布!欢迎关注!!! 老规矩–妹妹镇楼: 一. Softmax分类器 用SVM损失函数得出的只是一个个的分数,还要通过对比分数来分类.那么,如果直接输出结果为分类的概率,岂不是 ...

  2. 深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器--在深度学习的视觉分类中的,这两个分类器的原理和比较

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

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

    作者: 寒小阳 &&龙心尘 时间:2015年11月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/49999299 声明: ...

  4. 线性SVM与Softmax分类器

    1 引入 上一篇介绍了图像分类问题.图像分类的任务,就是从已有的固定分类标签集合中选择一个并分配给一张图像.我们还介绍了k-Nearest Neighbor (k-NN)分类器,该分类器的基本思想是通 ...

  5. 深度学习与计算机视觉系列(4)_最优化与随机梯度下降\数据预处理,正则化与损失函数

    1. 引言 上一节深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器中提到两个对图像识别至关重要的概念: 用于把原始像素信息映射到不同类别得分的得分函数/score function 用 ...

  6. 深度学习与计算机视觉(三)最优化与梯度下降

    三.最优化与梯度下降 上一节深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器中提到两个对图像识别至关重要的概念: 用于把原始像素信息映射到不同类别得分的得分函数/score funct ...

  7. 【深度学习】计算机视觉(二)——认识和基础(下)

    文章目录 step4:深度学习和计算机视觉基础 图像表示 图像分类--得分函数 分类评价--损失函数 结果概率--Softmax分类器 反向传播--梯度下降法 梯度下降法 链式法则 分类器[核函数待补 ...

  8. 深度学习和计算机视觉相关总结

    最近要找工作,个人比较心仪的岗位当然是DL&CV,大概是因为硕士期间对这些研究的比较多.有时接触的东西多了,但是很多看了一次就忘记了,就算是看过多次的也留不下多少记忆.原因当然是没有系统地进行 ...

  9. 深度学习与计算机视觉

    目录 1 深度学习 1.1 人工智能 1.2 机器学习 1.3 深度学习 1.3.1 深度学习发展历程 1.3.2 深度学习中的核心因素 1.3.3 深度学习模型分类 1.3.4 深度学习框架 2 计 ...

最新文章

  1. 辞退了一名 2 年工作经验的前端工程师
  2. #if/#else/#endif
  3. Flowable 数据库表结构 ACT_ID_GROUP
  4. sql 安装程序文件_【病毒文件分析】MedusaLocker勒索病毒,小心全网被加密
  5. openGL之API学习(一四七)实时渲染、光线追踪渲染和栅格化渲染
  6. oracle启动报错ora11157,ORA-20011 KUP-11024 外部表引起的错误
  7. python-生成xlsx表格
  8. 此文对你人生会有莫大好处的,建议永久保存
  9. idea配置php开发环境以及配置debug
  10. Cordova打包Vue项目(修改APP logo name)
  11. 匹配的通配符很全面,但无法找到元素mvc:annotation-driven的声明
  12. win10 悬浮日历_Win10日历隐藏功能:可直接打印空白月历
  13. APP测试基本流程以及APP测试要点梳理,成功入职就靠它了
  14. 20181212股票复盘
  15. 企业实战LNMP-安装wordpress论坛
  16. 打造数字时代的“诺亚方舟”
  17. 惠普HP DesignJet T1708 打印机驱动
  18. 爬虫实战(1)————百度首页爬取
  19. 软件工程作业六:了解JAVA反射机制
  20. html编辑器安卓版Excel,AndroXLS editor for XLS sheets

热门文章

  1. 浅谈 DDoS 攻击与防御
  2. 关于分布式计算的一些概念
  3. 批量设置 style
  4. 剖析大数据平台的数据采集
  5. Android QQ登录 程序奔溃的问题
  6. 纯CSS3实现Material Design
  7. 深入Java核心 Java内存分配原理精讲(3)
  8. enterprise architect复制到word中的标签怎么改变_7个 Word 技巧,不会别说自己会 Word...
  9. c语言dynamic变量,C# dynamic关键字的使用方法
  10. 链表的基本操作 java_详细实现单链表的基本操作【Java版】