【深度学习与计算机视觉】2、线性 SVM 与 Softmax 分类器

2023-11-20

2、线性SVM与Softmax分类器

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

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

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

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

2.1 得分函数(score function)

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

假设我们的训练数据为$x_ i ∈R D ,对应的标签 ,对应的标签 ,对应的标签y_ i ,这里 ,这里 ,这里i=1…N $
表示 N N N个样本,$y _i ∈1…K $表示K类图片。

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

2.1.1 线性分类器

简单的线性映射:$f(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(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可以完成由像素到类目得分的过程,同时,我们知道训练数据 ( x i , y i ) (x_ i ,y_ i ) (xi,yi)是给定的,可以通过调整参数来使得映射的结果和实际的类别吻合。

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

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

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

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

这里写图片描述

2.2.2 正则化

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

![这里写图片描述](https://img-blog.csdn.net/20180424100032618?)

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

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

![这里写图片描述](https://img-blog.csdn.net/20180424100125135?)

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

这里写图片描述

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

假定我们的输入图片像素矩阵是 x = [ 1 , 1 , 1 , 1 ] x=[1,1,1,1] x=[1,1,1,1] ,而现在我们有两组不同的W权重参数中对应的向量$w_ 1 =[1,0,0,0] , , w _2 =[0.25,0.25,0.25,0.25] 。那我们很容易知道 。那我们很容易知道 。那我们很容易知道w ^T 1 x=w^ T 2 x=1 ,所以不加正则项的时候,这俩得到的结果是完全一样的,也就意味着——它们是等价的。但是加了正则项之后,我们发现 ,所以不加正则项的时候,这俩得到的结果是完全一样的,也就意味着——它们是等价的。但是加了正则项之后,我们发现 ,所以不加正则项的时候,这俩得到的结果是完全一样的,也就意味着——它们是等价的。但是加了正则项之后,我们发现w _2 总体的损失函数结果更小 ( 因为 4 ∗ 0.2 5 2 < 1 ) ,于是我们的系统会选择 总体的损失函数结果更小(因为4*0.25^2<1),于是我们的系统会选择 总体的损失函数结果更小(因为40.252<1),于是我们的系统会选择w _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)支持向量机

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

这里写图片描述

我们可以理解为类别 y i ∈ − 1 , 1 y i ∈−1,1 yi1,1 ,它是我们的多类别识别的一个特殊情况,而这里的 C C C λ λ λ是一样的作用,只不过他们的大小对结果的影响是相反的,也就是$C∝1/λ $。

2.3.3 关于非线性SVM

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

2.4 Softmax分类器

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

这里写图片描述

其中,使用 f i f_i fi来表示分向量 f f f的第j个元素值,总体的损失也是 L i L_i Li遍历训练集之后的均值,再加上正则化项 R ( W ) R(W) R(W),而函数 f j ( z ) = e z j ∑ k e z k f _j (z)=\frac{e^z j }{ ∑_ k e^ {z _k} } fj(z)=kezkezj 被称为softmax函数,其输入值是一个实数向量 z z z,然后在指数域做了一个归一化,保证其和为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 ] → [ e 1 , e − 2 , e 0 ] = [ 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] [1,2,0][e1,e2,e0]=[2.71,0.14,1][0.7,0.04,0.26]

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

[ 0.5 , − 1 , 0 ] → [ e 0.5 , e − 1 , e 0 ] = [ 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] [0.5,1,0][e0.5,e1,e0]=[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,可以动手调调看看。
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深度学习与计算机视觉】2、线性 SVM 与 Softmax 分类器 的相关文章

随机推荐

  • 【阶段二】Python数据分析Pandas工具使用05篇:数据预处理:数据的规范化

    本篇的思维导图 数据预处理 数据的规范化 数据标准化 归一化 处理是数据挖掘的一项基础工作 不同评价指标往往具有不同的量纲 数值间的差别可能很大 不进行处理可能会影响数据分析的结果 为了消除指标之间的量纲和取值范围差异的影响 需要进行标准化
  • C语言的不完整类型和前置声明

    声明与定义 Declaration and Definition 开始这篇文章之前 我们先弄懂变量的declaration和definition的区别 即变量的声明和定义的区别 一般情况下 我们这样简单的分辨声明与定义的区别 建立存储空间的
  • Black Duck----安装 Synopsys Detect,运行你的第一次

    Synopsys Detect 也称为 Detect 可以在您的桌面图形用户界面 GUI 或命令行 CLI 上运行 虽然 Detect 运行有许多变化 但运行将执行以下三个步骤 首先 Detect 将使用项目的包管理器来派生该包管理器已知的
  • Anaconda中安装并运行tensorflow

    Anaconda中安装并运行tensorflow 创建环境 选择自己喜欢的名字和需要的python环境进行创建 这里我创建了一个名字为tensorflow的虚拟环境 蓝色框住的地方为这个虚拟环境的路径 记住 有用的 现在这样就是在创建中了
  • 【CV with Pytorch】第 7 章 :图像异常检测

    机器学习的研究使我们进入了研究各种模式和行为的过程 它使我们能够构建可以研究封闭环境的模型 预测能力通常遵循模型训练过程 这是我们在训练模型时需要经常问的一个重要问题 还有另一个问题需要回答 多少数据足以帮助模型理解分布 以便我们有一个好的
  • 恢复误删除的数据库数据-Oracle

    Oracle数据误删快速恢复 文章目录 1 创建测试数据 2 数据未提交 rollback回滚 3 数据已提交 3 1 通过scn恢复数据 3 2 通过时间恢复数据 1 创建测试数据 第一步创建测试表 create table cctest
  • 区域生长法快速入门,不带种子点的选取

    这里实现的区域生长法 是最原始的区域生长法 基本原理是判断像素点的强度值是和种子点的强度值差是否小于阈值 如果小于阈值则被标记 实现过程中利用了栈的先进后出的思想 将8邻域中符合生长要求的点压入栈 然后依次取出 然后在取出的点的基础上对8邻
  • QT信号和槽以结构体为参数传递复杂数据

    QT 的信号和槽机制能十分方便的用来传输数据 但是如果数据种类比较多 分类比较多的时候 就需要更好地更高效的来传递数据的方法 以结构体作为参数是个很不错的选择 这几天写的程序正好需要以结构体来作为参数 但是网上搜的资料很少 讲的也不详细 我
  • chatgpt赋能python:用Python对图片进行分类

    用Python对图片进行分类 在如今的数字时代 图片分类是一个越来越常见的任务 特别是在搜索引擎优化中 图片分类可以让搜索引擎更容易地找到特定类型的图片 并在相关的搜索中以更高的排名显示它们 在本文中 我们将介绍如何使用Python来分类图
  • 理解java反射机制

    Java反射机制 java反射机制是各种框架的基础 因为有了反射 可以实现类的动态加载 只有类在运行期间用到时才加载到内存中 实现动态编程 对于反射机制的理解 主要需要理解类加载的过程 这是非常重要的一点 通过java视频教程整理文档如下
  • 10分钟带你了解轻量级插件框架x3py

    写在前面 由于本人目前主要从事的是Windows客户端开发方面的工作 所以本文介绍x3py的侧重点也是从客户端程序开发者方面叙述的 本文主要参考整理自x3py的官方Wiki 修正了一些官方示例中的错误 有兴趣的同学可以直接阅读原文 设计目的
  • React 定时刷新接口

    通过 useEffect 在页面加载时调用 getNodeDetailList 列表接口 useEffect gt getNodeDetailList change 然后通过 setInterval 来进行定时刷新 useEffect gt
  • vue.cli3.0移动端px和rpx的转换

    1 安装插件 npm i postcss plugin px2rem save dev 2 创建vue config js module exports lintOnSave true css loaderOptions postcss p
  • 微信小程序面试题大全

    1 简述微信小程序的相关文件类型 WXML 搭建页面的结构 WXSS 页面样式文件 js 逻辑处理 网络请求 json 配置当前页面标题和引入组件等 app js 可以在里边监听生命周期函数 声明全局变量 app json 小程序的全局配置
  • 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)<转>

    干货 Chrome插件 扩展 开发全攻略 不点进来看看你肯定后悔 写在前面 我花了将近一个多月的时间断断续续写下这篇博文 并精心写下完整demo 写博客的辛苦大家懂的 所以转载务必保留出处 本文所有涉及到的大部分代码均在这个demo里面 h
  • 解密Qt安装目录的结构

    了解 Qt 安装目录的结构虽然不是编程必须的 但是它能练就我们的内功 让我们对 Qt 的编程环境了如指掌 Windows 和 Linux 下 Qt 安装目录的结构非常相似 我们以 Windows 为例进行讲解 Linux 不再赘述 Qt 整
  • Odoo文档——安装

    Odoo文档 安装 下载和安装 下载地址 https www odoo com zh CN page download 安装文档地址 https www odoo com documentation 12 0 setup install h
  • Minio有了这篇文章,比SDK要好入门多了

    想学minio 看小编这边文章可以解决你很多问题 一 安装minio 1 1 创建文件夹 并在指定文件夹中下载minio文件 1 2 赋予minio文件执行权限 1 3 启动minio 1 4 修改环境变量 1 5 指定端口启动minio服
  • Windows下celery正确接收任务,但是没有执行任务

    先说解决方案 Windows下运行celery的命令是这个celery A djangoProject1 worker concurrency 4 loglevel INFO P threads 也就是说要指定是多线程的 Linux下运行c
  • 【深度学习与计算机视觉】2、线性 SVM 与 Softmax 分类器

    文章目录 2 线性SVM与Softmax分类器 2 1 得分函数 score function 2 1 1 线性分类器 2 1 2 理解线性分类器 2 2 损失函数 2 2 1 多类别支持向量机损失 Multiclass SVM loss