前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CS231n:2 线性分类器

CS231n:2 线性分类器

作者头像
Here_SDUT
发布2022-08-08 13:42:01
3750
发布2022-08-08 13:42:01
举报
文章被收录于专栏:机器学习炼丹之旅

CS231n第二节:线性分类器 传送门 本系列文章基于CS231n课程,记录自己的学习过程,所用视频资料为 2017年版CS231n,阅读材料为CS231n官网2022年春季课程相关材料 上一节介绍了图像分类问题——从固定的类别集合中选出一个标签分配给一张图片的任务,解释了图片分类问题的难点。同时,介绍了KNN分类器,它的原理是将待预测的图片与训练集中的所有图片比较,将最相近的图片的表情作为带预测图片的标签。KNN有很多的缺点,比如需要存储整个训练集,空间利用率低,预测所需的时间长。 本文主要介绍一种更加强大的处理图片分类问题的方法,这一方法可以延伸至神经网络以及CNN。这种方法主要由两部分组成:评价函数和损失函数,前者用于将原始的数据映射成某一分类的得分情况,后者用于量化预测结果和真实结果的差距。接着,我们就可以将图片分类问题转化成一个最优化问题, 即通过改变评价函数的参数最小化损失函数。 SVM和softmax的可视化交互网页

1. 从图像到标签值的映射

2. 对线性分类器的解释

2.1 直观理解

如下图就是线性分类器的工作过程,对于一张图片,假设是个黑白的 2*2 的图片,我们首先将其展开成一个 4*1 的列向量。假设我们一共有三个类比(猫,狗,船),下图中红色的表示识别猫的分类器,绿色的表示识别狗的分类器,蓝色表示识别船的分类器,三个分类器的参数堆叠在一起组成了评估函数的参数矩阵。将参数矩阵与原始数据相乘并加上对应的偏置项,得到每个分类器的得分,可以看到猫的得分为 -96.8,狗的得分为437.9,这说明,分类器认为这张图片最可能是只狗,最不可能是只猫,对于图中的例子,这无疑是个很不好的结果(因为输入图片是一只猫)。

从上述例子我们可以看出,线性分类器首先将一个RGB通道的图片的每个位置的像素进行加权后求和,将求和后的值作为该分类器所属类别的分数(分数最高的分类器所属的类别作为这张图片的预测类别)。那么线性分类器的原理是什么呢?评估函数通过调整参数,使得其有能力倾向于或者不倾向于图片某个位置的某个颜色。举例来说,对于一张船的图片,图片的周围很可能有很多的蓝色(表示在大海中),那么对于船的分类器就可能对图片四周位置的蓝色通道的权重设置成一个正数,而对相同位置的红色通道和绿色通道的权重设置成一个负数,这样对于某张图,如果满足图片四周位置的蓝色通道的数值大,而其他通道数值小(在图片中表现为四周为蓝色),那么它的评估得分也就会高。

2.2 几何理解

运用线性分类器后,我们将每张图片都转变成了一个 K 维的向量,那么我们可以将其看成 K 维空间中的一个点,同样,对于原来的图片,也可以看成高维空间中的一个点(比如CIFAR-10数据集中的每个图片可以看成3072维空间中的一个点)。由于我们定义每个类别得分为某张图片所有像素的加权和,所有每个类别的得分其实可以看成这个高维空间中的一个超平面,虽然无法可视化高维空间,但是如果将高维空间降维至二维,我们可以尝试可视化每个分类器在做什么:

如上图所示,有三根直线分别代表汽车分类器、鹿分类器、飞机分类器,以红色的汽车分类器为例,如果某个点刚好在线上,则汽车种类的得分为0,红色线上的箭头表示在这个方向上汽车得分为正,在反方向则为负。由此我们可以得出,评估函数中的 W 每一行代表一个分类器,而一个分类器在高维空间中就是一个划分空间的超平面,所以 W 中的每一行就代表一个分类器所对应超平面在空间中的方向,改变 W 的值的效果就是旋转这个超平面。而偏置项 b 其实就是超平面的截距,代表超平面在高维空间中的位置,如果没有偏置项,那么超平面只能过高维坐标系的原点。

2.3 模板匹配角度

对于参数 W 还有一种解释:对于每一行的 W ,其代表了某一类别的模板,当预测图片时,我们将图片分别与每个类别的模板做内积,得到每个类别的评估得分,得分最高的类别作为预测结果。所以,线性分类器其实就是在做模板匹配的过程,而这些模板是从训练集中的图片训练得到的。另外还有一种理解角度,可以把线性分类器看成一种更高效的KNN算法。只是区别在于它不用和KNN一样存下整个训练集,而是将训练集浓缩成一个模板图片 W ,并且将内积作为距离函数,而不是KNN中的L1和L2距离。

如下图是使用CIFAR-10作为训练集训练得到的分类器,从 W 得到每个种类分类器的可视化结果:

image-20220511150700702
image-20220511150700702

观察图片,可以发现一些有意思的事情,马的分类器可视化出来的是一个双头马,这说明在CIFAR-10的训练集中有头朝左和头朝右的马,于是分类器将这种特征合并在模板中。再比如车的分类器,可以隐约看出一个车的形状,并且车的颜色以红色居多,这说明在CIFAR-10的训练集中红色的汽车居多。这也说明了一个问题,当分类器遇到一个其他颜色的车时,它的识别效果可能就会变差,也说明这个分类器的泛化能力不是很好。这是由数据集和模型的局限性导致的,在之后介绍的神经网络中,通过隐藏层,就能比较好的解决这个问题(当然也需要一个更好的数据集)。

2.4 偏置项合并

参数合并的示意图如下:

image-20220511153703114
image-20220511153703114

2.5 数据预处理 normalization

在前面的过程中,我们都是直接使用原始的图片数据来训练。在机器学习中,对输入的特征进行归一化是一种很普遍的做法。具体来说,我们图片的每个像素的数据范围是 [0-255],然后我们得到训练集中每个位置像素的平均值,得到一个平均像素矩阵,然后将每张图片都减去这个平均像素矩阵,数据范围大约变成[-127,127],更一般的做法是将其归一化至 [-1,1] 的范围。

3. 损失函数

在上一节,我们定义了一个评估函数,通过设置评估函数的参数 W ,我们希望分类器预测类别的得分和真实值接近。但是,有时事实不尽人意,比如我们预测猫的图片,但是分类器给出猫的评分可能为一个很小的负数,然后其他种类的得分非常大,这显然不是我们想要的。那么我们需要一个函数来量化我们对分类器的预测结果的不满意度,即损失函数(或代价函数)。直观来讲,当分类器的效果很好时,损失值将会很低;当分类器的效果很差时,损失值将会很高。

3.1 多分类SVM的损失函数

image-20220511193315279
image-20220511193315279

此外还有一点需要说明的,在多分类SVM的损失函数中使用的 max(0,-) 也称为铰链函数,因为它的图像很像一个铰链。有时SVM也会用到平方铰链函数,即max(0,-)^2,这时SVM对那些不满足要求的损失值给予更大的惩罚(即对于在间隔内的点)。

3.2 正则化 Regularization

3.3 损失函数的代码实现

代码语言:javascript
复制

3.4 $\Delta$ 的设置

从上面的损失函数可以知道,除了权重以外,还有两个超参数 \Delta \lambda 需要我们手动设置,虽然可以采用交叉验证的方式,但是其实我们对于任何情况,都可以将 \Delta 设置为1。\Delta \lambda 看似是两个不同的超参数,但其实他们有同样的效果:用于平衡数据损失值和正则化损失值。正则项影响的是权重 W 的量级,权重的量级又影响这评估函数的结果:权重量级越大,那么不同种类之间的评估得分相差也就越大,反之相差也就越小,所以正则项控制着评估得分之间的差异,而正则化的强弱是由 \lambda 控制的,通过改变 \lambda 可以任意放大或者缩小这种差异。于是乎, \Delta 数值的大小也就变得没有那么重要了,因为我们可以通过 \lambda 随意控制评估得分差异的大小。因此,我们需要考虑的只有我们允许权值的大小是多少(通过控制正则项系数 \lambda)。

4. Softmax 分类器

4.1 信息学层面解释

在信息论中有一个交叉熵的概念,它主要用于度量两个概率分布间的差异性信息。在介绍交叉熵之前先介绍一些基本概念。

4.1.1信息量:

信息量的概念在平时生活中也经常遇到,下面举两个例子,比如你获得了两个信息:

  • 明天太阳从东边升起
  • 明天的双色球彩票号码为1234567

从直观来讲, 第一个信息的信息量比第二个小,因为第一个信息是必然发生的,而第二个信息的发生概率很小。也就是说信息量的大小取决于这个信息消除了多少不确定性,而这个信息所描述的事件发生的概率越小,则这件事情发生了所带来的信息量也就越大,也就是说信息量的大小和事件发生的概率成反比。对于事件 x 信息量的公式定义为:

4.1.2 熵(Entropy):

对于给定的离散随机变量 X,以可能性 P(x_1),⋯,P(x_n) 取值为 x_1,⋯,x_n,则 X 的熵为:

信息量度量的是一个具体事件发生所带来的信息,而熵是指该某一事件可能的结果所蕴含的不确定性的平均水平,以抛硬币为例,如果抛一枚质量均匀的硬币,那么朝上还是朝下的概率是相同的,那么此时抛一枚硬币的不确定性是最大的。但如果硬币质量不均匀,正面的概率比反面大很多,那么抛一枚硬币这个事件的不确定性就比均匀硬币要小了。也就是说,熵的概念是衡量某个事件的平均不确定性,而信息量描述的是接受该信息后消除的不确定性的量值。熵的本质其实就是对于一个事件信息量的期望

4.1.3 相对熵(KL散度)与交叉熵:

KL散度:

这是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵。在概率学和统计学上,我们经常会使用一种更简单的、近似的分布来替代观察数据或太复杂的分布。K-L散度能帮助我们度量使用一个分布来近似另一个分布时所损失的信息量。假设对于同一个随机变量 x 有两个单独的概率分布 p(x) q(x) ,我们可以用KL散度来衡量这两个分布之间的差异,具体来说,如果要比较分布 q(x) 相对于 p(x) 的差异,可以用下列公式:

也就是说,如果使用 q(x) 描述问题,还需要一个增量 D_{K L}(p \| q) ,才能和使用概率分布 p(x) 来描述问题有一样的效果。

交叉熵:

在相对熵公式中,前面一半是 \sum_{i=1}^{n} p\left(x_{i}\right) \log \left(p\left(x_{i}\right)\right) ,可以发现这就是概率分布 p(x) 的熵,而后一半 \sum_{i=1}^{n} p\left(x_{i}\right) \log \left(q\left(x_{i}\right)\right) 就是交叉熵了。它的含义为,使用概率分布 q 来表示概率分布 p 的困难程度。

4.1.4 在分类问题中的应用:

4.2 概率层面解释

前面说到 Softmax 分类器首先将评估得分转变为一个概率分布,也就是说我们可以把整个模型当做一个以 x_i W 作为参数的概率分布,即:

由于 x_i 为输入值是不变的,所以模型训练的本质其实也就等价于,确定一个 W 使得 y_i 发生的概率最大,这里的 y_i 表示为输入样本对应的真实种类,所以就转换成了一个极大似然估计(MLE)的问题。由于原始的似然函数是一个连乘的形式,所以加上一个log变成对数似然函数(加上log不会改变极值点的位置,只会改变极值的大小,而我们主要求得位置即可,不关心值的大小,所以没有影响),转变为一个连加的形式方便计算,其最终的表达式也和softmax的损失函数等价。同时,我们可以对正则项 R(W)=\sum_{k} \sum_{l} W_{k, l}^{2} 给出一定解释:实际上,加上这个正则项等价于加入权重的先验概率,使得极大似然估计变成最大后验估计,这里假设权重是服从一个均值为0的高斯先验分布的。

4.3 代码实现

在代码实现的过程中需要注意的是,由于涉及指数运算,所以分子和分母的数据可能会很大,对于两个很大的数字做除法可能会导致精度问题。通常,在实现的过程中,我们使用下面的技巧:

这里的 C 是有我们自己选取的,一般我们设置为 logC = -max_jf_j ,即取评估得分最大值,这样可以使得整体的数据变小的同时不影响结果。代码如下:

代码语言:javascript
复制
f = np.array([123, 456, 789]) # example with 3 classes and each having large scores
p = np.exp(f) / np.sum(np.exp(f)) # Bad: Numeric problem, potential blowup

# instead: first shift the values of f so that the highest number is 0:
f -= np.max(f) # f becomes [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # safe to do, gives the correct answer

5. SVM和Softmax对比

上图展示了SVM和Softmax的区别,对于一个输入的数据,两个分类器首先都是计算相同的得分 f,但是两者对于得分 f 的解释不同。对于SVM分类器,它将 f 就当做类别的得分,所以它的损失函数时希望正确类别的得分比其他类别高出一个间隔的差距。而Softmax分类器则将 f 处理成对数概率,其损失函数希望归一化后的真实类别的概率尽可能地大(可以从交叉熵和极大似然估计的角度分别理解)。从上图中可以看出SVM的损失值为1.58,Softmax的交叉熵损失为1.04,但这两者是没有可比性的,对于一个损失函数的值只能和相同的损失函数进行比较。

SVM和Softmax的性能差距很小,不过还是有一些差异的。相比于Softmax,SVM更加,这可以看做是SVM的缺陷也可以看做是SVM的特点,比如说某个样本的预测得分为 [10,-2,3] ,假设第一个类别是其真实类别,并且SVM 的 \Delta = 1 ,那么很显然这个预测得分的损失为0。SVM是不关注某个种类的具体得分的,比如说如果预测得分分别为 [10,-100,-100] \ [10,9,9] ,在 \Delta = 1 的情况下,损失值都为0。所以,只要满足真实种类的评估得分比其余都大一个规定的间隔,那么SVM会无视具体的差异的,但是对于Softmax则不同,在Softmax分类器中,[10,-100,-100] 的损失值肯定比 \ [10,9,9] 小,换句话说,Softmax希望的是真实种类的概率尽量大,而其他的尽量小。但是在某种情况下,这也不一定就是SVM的缺陷,比如说某个汽车分类器专注于对卡车和汽车的分类,那么模型的预测得分不应该受到其他种类比如青蛙的影响,只要青蛙的得分保证一定程度地低就够了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-5-13 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 从图像到标签值的映射
  • 2. 对线性分类器的解释
    • 2.1 直观理解
      • 2.2 几何理解
        • 2.3 模板匹配角度
          • 2.4 偏置项合并
            • 2.5 数据预处理 normalization
            • 3. 损失函数
              • 3.1 多分类SVM的损失函数
                • 3.2 正则化 Regularization
                  • 3.3 损失函数的代码实现
                    • 3.4 $\Delta$ 的设置
                    • 4. Softmax 分类器
                      • 4.1 信息学层面解释
                        • 4.1.1信息量:
                        • 4.1.2 熵(Entropy):
                        • 4.1.3 相对熵(KL散度)与交叉熵:
                        • 4.1.4 在分类问题中的应用:
                      • 4.2 概率层面解释
                        • 4.3 代码实现
                        • 5. SVM和Softmax对比
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档