cs231n学习记录-理解线性分类器

目录

前言:

内容简介:

一、NN分类器的缺点

二、什么是线性分类器

三、线性分类器的原理

四、从图像到标签分值的参数化映射

五:解释这个“b”

六、将线性分类器看做模板匹配

七、结尾


前言:

        学习内容是斯坦福大学的《面向计算机视觉的卷积神经网络》课程,课程代码cs231n,原文链接是Stanford University CS231n: Deep Learning for Computer Vision,同时知乎上有课程笔记的中文翻译贺完结!CS231n官方笔记授权翻译总集篇发布 - 知乎

        写这个博客的主要原因是为了督促自己学完整个课程同时记录自己的学习路程,所以博客的内容大概会是我在看完课程笔记以及查阅资料之后一些自己的理解。由于我一个大一仔在这个方面几乎是一无所知,所以写的内容肯定会有错误以及理解不到位的地方,如果有大佬偶然看到了这个博客想要不吝赐教的话,十分感谢,热烈欢迎。 

内容简介:

        这篇博客我打算把重心放在如何理解线性分类器上,因为这也是我学的时候觉得最难以理解的部分,我第一次看完全不理解里面的数学原理,因此决定好好研究一下,边查资料边看边写。同时,我觉得官方笔记里面的讲解顺序对初学者有点不友好,所以我打算按照我理解线性分类器的步骤来写这个博客,同时,我参照其他资料结合自己的思考往里面加了一些博客中没有的东西,可能会有较多的漏洞或者偏差,请大佬们指点。

一、NN分类器的缺点

        书接上文,上篇笔记介绍了NN和K-NN分类器,但是这两种分类器有着明显的缺陷:

        1、需要储存整个训练数据集用于测试时一一比对,非常占用存储资源;

        2、在测试时需要把测试图片与每一张训练集图片都比对一遍,计算成本大,耗时也长;

        所以,如果能有一种分类器,能够在使用训练数据进行训练(哪怕多花点时间)之后就能够脱离训练集的“摇篮”,同时在实际使用时能够采取更快捷的分类方式,那么将大大减少使用分类器的储存空间成本,计算资源成本等等。而线性分类器,就很好的解决了这一问题。

二、什么是线性分类器

        关于线性分类器,原笔记直接放上了“从图像到标签分值的参数化映射”这个高级语句,当时我反正是盯着那一段反复看了好几遍也没看出个名堂,所以在大概理解了之后,我打算先用一个超级简单的例子来说明线性分类器是什么。

        首先,我们来看看我下面放的这幅图:

                                        3009b560c4f145b0a872319d43bab4b2.jpg

        在这个平面里面,有很多两种颜色的点,现在我们想要把这两类点区分开,最简单的方法是什么?当然是往如图所示(或者其他满足条件的地方)画一条线,一刀两断,线的这一端这是黄色类,另一端是蓝色类。以这个在二维空间中的分布为例,我们手上有一个如图所示的点点图作为训练集数据(其中每一个点都是一个数据,这么多点一起构成一个训练集),我们想要通过这张图,确定出一条直线:这条直线不仅可以在这张训练集上很好的将两种颜色的点点分隔开,还可以在其他的(称为测试集)有黄蓝点点(同种颜色的点点在这个空间上的分布应该是相近的,不同颜色点在空间中的分布位置是有明显差异的)的图片上,以尽可能高的准确率将两种颜色的点分隔开。

        这是在二维平面上的线性分类。而在更高维空间里,也是相似的。

       tips:这里对跟我一样的萌新多说一句,不用把高维空间看的多么深奥高大上,虽然正常人的大脑是难以想象出三维以上的空间的,但是如果我们把多维空间用以下这个说法来解释,就会好理解很多:一个n维空间,就是由所有的n维向量所组成的一个空间,跟点动成线线动成面面动成体是一个道理。

        线性分类器的分类方法,就是想在一组分布中,找出一个超平面作为决策边界,使得分类器在数据(包括测试集)上的分类误差尽量接近于小。

超平面:是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中,一条直线是一维的,它把平面分成了两块;三维空间中,一个平面是二维的,它把空间分成了两块。

决策边界:能够把样本正确分类的一条边界。刚才在黄蓝点点中间画的那条直线就是一条决策边界。

三、线性分类器的原理

        我们已经知道了线性分类器的分类方法了,但现在我们面临一个问题:如果我们在刚才的那个图片中想要确定一条决策边界,我们就会发现,好像可以画出无数条符合标准的直线,                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        f96d70d8a4aa4c09a4ece25612dc190f.jpg(比如说这两条都符合标准)

但是最后的分类器肯定是只能有一条决策边界,那么到底该找哪条呢?事实上,这些决策边界中,是有优劣之分的。现在我们画出两条在测试集中都符合要求的决策边界,再往图片上加几个点作为测试数据:

        ​​​​​​​        06da5e607f8743b89d3273e5d730ae9c.jpga0b6af323e2b4450bc8e639e1134ed26.jpg

        这么一对比,高下立判。这里引用一下别人的博客线性SVM分类器的工作原理_圻子-的博客-CSDN博客_分类器的工作原理:     

         我们无法保证这条决策边界在未知数据集(测试集)上的表现也会优秀。对于现有的数据集来说,我们有B1和B2两条可能的决策边界。                                              ​​​​​​​        ​​​​​​​        ​​​​​​​                        在这里插入图片描述

        我们可以把决策边界B1向两边平移,直到碰到离这条决策边界最近的方块和圆圈后停下,形成两个新的超平面,分别是b11和b12,并且我们将原始的决策边界移动到b11和b12的中间,确保B1到b11和b12的距离相等。在b11和b12中间的距离,叫做B1这条决策边界的边际(margin),通常记作d。

        从中可以看出,拥有更大边际的决策边界在分类中的泛化误差更小。如果边际很小,则任何轻微的扰动都会对决策边界产生很大的影响。边际很小的情况,是一种模型在训练集上表现很好,却在测试集上表现不佳的情况,即“过拟合”现象。所以在寻找决策边界的时候,我们希望边际越大越好。

        经过反复的查资料和思考,我认为不论是什么种类的线性分类器,最终目的大体都是如上,只不过训练时使用的损失函数不同而已。

四、从图像到标签分值的参数化映射

        接下来,我根据查到的资料以及自己的思考,解释一下“从图像到标签分值的参数化映射”这个笔记上出现的名词。

        对于这张图片,我们假设这张图片是由四个像素组成的(现实中肯定要多得多),把这个二维矩阵降维为列向量。将二维图像变为向量是一个经常用到的方法,便于提取特征,进行训练。

        那么对于我们要进行分类的图片,每有一个标签种类可供选择,我们就给那个种类单独创立一个向量作为这个类的专属分类器,最后我们把所有的分类器并到一起,形成一个矩阵,这个矩阵称为权重矩阵。 在这里你可能会发现,上图中权重矩阵的列数和图片向量的维数恰巧相同,都为4。这是coincidence吗?不是。有学过线性代数的同学肯定会说这必须要相同啊,不然怎么做图上的矩阵乘法呢?没错,但事实上还是有更本质的原因。

        这里仍然用二维空间二分类的例子来讲解证明方法,然后我将它拓展到三维,更高维以此类推就好了(原谅我这字迹不是很好看,平板手写笔真的用不习惯)。

 ​​​​​​​  58fc4f2ccd924e338435894d6f79f875.jpg3b2ca5e960cd474bbc30fcda9b0e883f.jpg

                        (这里的W指的全部都是单个分类器的参数向量,不是权重矩阵!)        

        当时在查阅资料的时候我提出了一个疑问:在图片中的证明过程中,二分类我们只用到了一个Wx+b,但是之前却说对于每一个标签都要为它单独建立一个分类器,那二分类不应该是用到两个Wx+b直线吗?为了搞明白这个问题我追着我哥(大佬)问了好久,现在在这里做出解释:以分类猫和狗为例,如果我们只是想让电脑区分这张图片里是猫,还是不是猫,那么一个分类器足矣,只需要让电脑判断这个图片符不符合猫的标准就行了,不符合标准的直接贴上一个“不是猫”的标签,完事;但是如果我们想要让电脑区分这是一只猫还是一只狗呢?如果我们给电脑的数据集中只有猫和狗的图片,那结果也大概是准确的,毕竟只要判断出不是猫,那就必定是狗,和上一个分类任务差不多。那如果现在这个数据集中混进去了一张外星人的照片呢?电脑会判断这张照片不属于猫,于是把他标记为一只狗。这对吗?这不对。所以,我们需要为猫和狗各训练一个分类器,分别判断这张图片是不是猫,是不是狗,如果都不符合,那就贴上一个“THE OTHER”的标签,这样就提高了我们分类器处理异常数据的能力。总而言之,根据实际需要来做决定。

        上面左边笔记中的Wx+b=0的含义是我们作为决策边界的超平面表达式。那么前面图中最右边的三维列向量中的数字(也就是所谓的映射结果)是怎么回事呢?

        这是我们人为确定的一种评判方式:我们把这个W看做一个向量,我们现在赋予Wx+b的结果大小一个意义:如果W与x相乘的结果数值越大,那么说明x的位置与W的方向越接近:比如说现在上图右边笔记中的W是黄色点点的分类器,指向的是黄色点点所在区域,那么黄色点点乘以W得到的结果就会更大,蓝色点点乘以W得到的结果就会相对更小。我们让计算机以Wx+b的结果大小为评判依据,来判断数据应该贴什么样的标签。那么这个W怎么来呢?正确的W可不会从天上掉下来,我们的用测试集不断训练的目的,就是通过不断修改W的数值,找到那个让黄色点点乘以W的结果足够大,蓝色点点乘以W的结果足够小的W,作为黄色点点的分类器。而将这些分类器W拼在一起,就形成了上图中看起来很吓人的权重矩阵。说到这里,你还觉得“从图像到标签分值的参数化映射”这句话高端到令人生畏吗?

五:解释这个“b”

        现在来解释Wx+b中的这个“b”。这个b也没有什么吓人的,和“kx+b”中的b同属一种东西,就是个截距罢了,只不过这个截距可能是更高维度的向量形式。在这里b被称为偏差向量(bias vector),也是“超参数”的一种。这是因为它影响输出数值,但是并不和原始数据xi产生关联。b也可以求出来,在我们得到W之后,b可以反推出来。

六、将线性分类器看做模板匹配

        这里直接copy笔记上提出的一种理解方式:

        关于权重W的另一个解释是的每一行对应着一个分类的模板(有时候也叫作原型)。一张图像对应不同分类的得分,是通过使用内积(也叫点积)来比较图像和模板,然后找到和哪个模板最相似。从这个角度来看,线性分类器就是在利用学习到的模板,针对图像做模板匹配。从另一个角度来看,可以认为还是在高效地使用k-NN,不同的是我们没有使用所有的训练集的图像来比较,而是每个类别只用了一张图片(这张图片是我们学习到的,而不是训练集中的某一张),而且我们会使用(负)内积来计算向量间的距离,而不是使用L1或者L2距离。

————————————————————————————————————————

这里展示的是以CIFAR-10为训练集,学习结束后的权重的例子。注意,船的模板如期望的那样有很多蓝色像素。如果图像是一艘船行驶在大海上,那么这个模板利用内积计算图像将给出很高的分数。

七、结尾

       写博客时我没少参考线性SVM分类器的工作原理_圻子-的博客-CSDN博客_分类器的工作原理的内容,我觉得写的很详细,节省了很多时间。

        按理说我第二篇博客应该接着图片分类(上),开始写(下),但是我一直想借着写博客的机会认真看看我之前一直一知半解的线性分类,所以调换了一下顺序。虽然这一篇的篇幅和我之前写的差不多,但是这一篇花的时间比之前多了几倍,因为在写的时候发现自己对于线性分类器的理解实在是太不够用了,因此还花了好多的时间查找比对资料(感觉为了这几千字我查的网页都有上百来个了)。当然在这么付出这么大时间代价之后收获就是我对这个笔记的了解深入了很多。虽然SVM和Softmax损失函数的了解还不够,但是基本原理知道了公式什么的都好理解。

        由于我几乎没怎么碰过cs231n的代码,我决定在更完图像分类(下)之后冲一冲笔记的assignment1这个超大工程,然后也会把代码和写的过程发上来,bless me then吧。

        

        

                                         

猜你喜欢

转载自blog.csdn.net/qq_62861466/article/details/126330526
今日推荐