本课程笔记是基于今年斯坦福大学Feifei Li, Andrej Karpathy & Justin Johnson联合开设的Convolutional Neural Networks for Visual Recognition课程的学习笔记。目前课程还在更新中,此学习笔记也会尽量根据课程的进度来更新。
今天的话题是:线性分类。
先讲个笑话,The girl in the picture is building a 20 layer neural network!! :)
话说按这种学习的效率我现在应该能建100多层的深度神经网络了,而我现在之所以没建出来是因为小时候积木没搭好…
1. Parametric approach
首先回顾下我们在上一章中所用的数据集是CIFAR-10 dataset,共包含10类60000张图片,每张图片大小为32*32*3,我们将其分为2部分,其中50000张作为训练,剩下的用作测试。
我们想做的是输入一张测试图片,比如下面这只猫,通过分类器预测它所属的类别,或者给出它分别属于10个类的可能性(得分)。
之前我们说到了最近邻分类器,这是一种无参数的分类器,我们所要做的只是把输入的测试图片和我所有的训练图片进行一一比较。今天我们要来学习有参数的分类器。
我们将分类器看成一个函数,输入一张图片x(包含 3072个数),通过参数W和函数f进行变换以后,输出10个score,分别表示这张图片属于每一类的可能性。当然,对于下面这张图片来说,我们希望“猫”的score高,其他9个类的score低。这一点我们就要通过f(x,W)来实现了,输入x是给定的,但是参数W和函数f是可变的,我们要做的就是选择合适的W和f使得“猫”的score高于其他类。这样的函数f有几种不同的选择,首先我们先来介绍线性函数。
2. linear classification
2.1 线性分类器
线性函数的表达式是这样的: f(xi,W,b)=Wxi+b
我们知道对于CIFAR-10来说,输入的 xi 是一张32*32*3的图片,将它拉成一个向量就是3072*1维;输出是10个score,即10*1维的向量。那么W(称为parameters/weights)则应该是一个10*3072维的矩阵,同时b(叫做bias)是一个10*1维的向量,bias在这里是偏差,比如说我们的数据中猫很多,狗只有几只,那么猫的bias可能比狗高,因为我们更倾向于预测出猫来。
举一个简单的例子来帮助我们理解(上图)。假设我们这张图片只有4个pixel,把它拉成一个向量后x是4*1维的。另外我们假设只有3类{猫,狗,船},那么输出是一个3*1的向量,表示这张图片分属这三类的score。那么根据线性函数的表达式,W应该是一个3*4的矩阵,b是3*1的向量。从下图输出的score看出,我们这一次设置的参数W和b并不好,因为猫的score只有-96.8,远远小于其他两类。因此我们要做的是通过调节W和b,使得猫的score最大,其他的类则减小。
另外需要说明的一点是,其实这里的W是3个平行的分类器(每一行W都分别和x做乘,再加上每一行的b,得到每一类的score),分别预测3个不同的类:猫,狗和船。
Bias trick
我们之前将线性分类器表示成 f(xi,W,b)=Wxi+b ,这个函数中有两个未知参数W和b,为了更加方便地对参数进行跟踪,我们可以把这两个参数合并成一个:
f(xi,W,b)=Wxi+b=[Wb][xi1]=Wnewxinew=f(x