Parametric Approach: Linear Classifier
(参数化方法):线性分类器
一个将图像映射到分类分值的例子。为了便于可视化,假设图像只有4个像素(都是黑白像素,这里不考虑RGB通道),有3个分类(红色代表猫,绿色代表狗,蓝色代表船,注意,这里的橙,紫和绿3种颜色仅代表分类,和RGB通道没有关系)。首先将图像像素拉伸为一个列向量,与W进行矩阵乘,然后得到各个分类的分值。需要注意的是,这个W一点也不好:猫分类的分值非常低。从上图来看,算法倒是觉得这个图像是一只狗。
线性分类器:
f(x_i,W,b)=Wx_i+b
- 在上面的公式中,假设每个图像数据都被拉长为一个长度为D的列向量,大小为[D x 1]。W: [K x D]的矩阵,b: [K x 1]列向量,为该函数的参数。
- 参数W被称为权重(weights)。b被称为偏差向量(bias vector),这是因为它影响输出数值,但是并不和原始数据xi
产生关联。 - 每个类的分类器就是W的一个行向量。
- 注意我们认为输入数据(x_i,y_i)是给定且不可改变的,但参数W和b是可控制改变的。我们的目标就是通过设置这些参数,使得计算出来的分类分值情况和训练集中图像数据的真实类别标签相符。
- 该方法的一个优势是训练数据是用来学习到参数W和b的,一旦训练完成,训练数据就可以丢弃,留下学习到的参数即可。
- 一个矩阵乘法和一个矩阵加法就能对一个测试数据分类,这比k-NN中将测试图像和所有训练数据做比较的方法快多了。
将图像看做高维度的点:
既然图像被伸展成为了一个高维度的列向量,那么我们可以把图像看做这个高维度空间中的一个点(即每张图像是3072维空间中的一个点)。
既然定义每个分类类别的分值是权重和图像的矩阵乘,那么每个分类类别的分数就是这个空间中的一个线性函数的函数值。我们没办法可视化3072维空间中的线性函数,但假设把这些维度挤压到二维,那么就可以看看这些分类器在做什么:
- 以红色的汽车分类器为例,红线表示空间中汽车分类分数为0的点的集合,红色的箭头表示分值上升的方向。所有红线右边的点的分数值均为正,且线性升高。红线左边的点分值为负,且线性降低。
- W的每一行都是一个分类类别的分类器。对于这些数字的几何解释是:如果改变其中一行的数字,会看见分类器在空间中对应的直线开始向着不同方向旋转。而偏差b,则允许分类器对应的直线平移。需要注意的是,如果没有偏差,无论权重如何,在x_i=0时分类分值始终为0。这样所有分类器的线都不得不穿过原点。
偏差和权重的合并技巧
回忆一下,分类评分函数定义为:
f(x_i,W,b)=Wx_i+b
分开处理这两个参数(权重参数W和偏差参数b)有点笨拙,一般常用的方法是把两个参数放到同一个矩阵中,同时x_i向量就要增加一个维度,这个维度的数值是常量1,这就是默认的偏差维度。这样新的公式就简化成下面这样:
f(x_i,W)=Wx_i
还是以CIFAR-10为例,那么x_i的大小就变成[3073x1],而不是[3072x1]了,多出了包含常量1的1个维度)。W大小就是[10x3073]了。W中多出来的这一列对应的就是偏差值b,具体见下图:
由
f(x_i,W)=Wx_i
Coming up:
- Loss function (quantifying what it means to
have a “good” W) - Optimization (start with random W and find a
W that minimizes the loss) - ConvNets (tweak the functional form of f)
参考:
CS231n课程笔记翻译:线性分类笔记(上) - 智能单元 - 知乎专栏
https://zhuanlan.zhihu.com/p/20918580?refer=intelligentunit
李飞飞CS231n课程
http://cs231n.stanford.edu/slides/2017