深度学习笔记(一)线性分类器(基础知识)
声明,这个系列基本是我自己的一些学习过程,方便我自己后期复习的!
1.线性分类器
线性分类器主要由两个部分组成:
- 一个是评分函数(score function),它是一个从原始图像到类别分值的映射函数。
- 另一个是损失函数(loss function)也叫代价函数(cost function),它是用来量化预测得到的分类标签的得分与真实标签之间的一致性。
该线性分类器可以转化成为一个最优化问题,在最优化过程中,通过更新score function的参数来最小化loss function。
2.评分函数
评分函数将图像夫人像素值集合最终映射为各个分类类别的得分,得分高低代表图像属于该类别的可能性高低。例如,有训练集$x_i\epsilon{R^D}$,对应的标签为$y_i$,这里$i=1,2,...,N$, $y_i \epsilon{1,2,...,k}$。也就是说,我们有$N$个图像样本,每个样本的维度是$D$,共有$K$个不同的类别。
举例来说,在CIFAR-10数据集中,我们有一个$N=50000$的训练集,每个图像有$D=32*32*3=3072$个像素,而$k=10$(狗,猫,汽车等)。我们定义评分函数$f:R^D\to{R^K}$,该函数是原始图像像素到分类类别分值的映射。
这里,我们从以个最简单的概率函数开始,一个线性映射:$f(x_i,W,b) = Wx_i+b$
where, 每个样本$x_i$大小为$D*1$,矩阵$W$(大小为$K*D$),向量$b$(大小为$D*1$),为该函数的参数。同样以CIFAR-10数据为例,$x_i$包含了第$i$个图像的所有像素信息,这些信息被拉成为一个$3072*1$的向量,$W$的大小为$10*3072$,$b$的大小为$10*1$。因此,3072个像素值作为输入输入函数,函数输出10个分值结果。参数 $W$ 被称为权重(weight),参数 $b$ 称为偏差(bias),偏差影响输出值,但并不和原始数据产生关联。
需要注意的是:
- 一个简单的矩阵乘法$Wx_i$就可以有效评估$K$个不同的分类器(每个分类器对应一个类别),其中每个类别是 $W$ 的一个行向量。
- 我们认为输入数据$(x_i,y_i)$是给定且不可改变的,但参数$W$ 和 $b$ 可控制改变的。我们的目标就是通过设置这些参数,使得计算出来的分类分值情况和训练集众图像的真实类别标签相符。
- 该方法相对于 KNN 算法的优势在于,训练数据是用来学习参数$W$ 和 $b$ 的,一旦训练完成,训练数据就可以丢弃了。对于一个测试图像,我们简单地将其输入函数,并基于计算的分类分值进行分类即可。
- 最后,注意我们只要做一个矩阵乘法和一个矩阵加法就能对测试数据分类,这也比 KNN方法快多了。
理解线性分类器
线性分类器计算图像中3个颜色通道中所有像素值与 权重的矩阵乘法,从而得到分类分值。根据我们对权重设置的值,对于图像中某些位置的某些颜色,函数表现出喜好或者厌恶(根据每个权重的符号而定)。举个例子,可以想象“船”分类就是被大量的蓝色包围(对应的就是水)。那么“船”分类器在蓝色通道上的权重就有很多的正权重(它们的出现提高了“船”分类的分值),而在绿色和红色通道上的权重为负的就比较多(它们的出现降低了“船”分类的分值)。
上面是一个简单的将图像 映射到分类分值得例子。为了便于可视化,假设图像只有4个像素(都是黑白像素,这里不考虑RGB通道),有三个分类(红色代表猫,绿色代表狗,蓝色代表船,注意,这里的红、绿和蓝3种颜色仅代表分类,和RGB通道没有关系)。首先将图像像素拉伸为一个列向量,与进行矩阵乘,然后得到各个分类的分值。需要注意的是,这个一点也不好:猫分类的分值非常低。从上图来看,算法倒是觉得这个图像是一只狗。
偏差和权重的合并技巧
实际操作中,我们常常将 $W$ 和 $b$ 合二为一。回忆一下,分类评分函数定义为:$f(x_i,W,b) = Wx_i+b$。
一般常用的方法是把两个参数放到同一个矩阵中,同时 $x_i$ 向量就要增加一个维度,这个维度的数值是常量 1,这就是默认的偏差维度。这样新的公式就简化成下面这样:
$f(x_i,W) = Wx_i$
还是以CIFAR-10为例,$x_i$的大小变成了 $3073*1$,而不是$3072*1$了,多出了包含常向量1的一个维度。$W$ 的大小变成了 $10*3073$。$W$ 这多出来的这一列对应的就是偏差值$b$,具体见下图:
图像数据预处理
在上面的例子中,所有的图像都是使用原始像素值(从0到255)。在机器学习中,对应特征做归一化(normalization)处理是常见套路。在图像分类的例子中,图像上的每一个像素可以看作一个特征(feature)。
在这些图片的例子中,该步骤意味着根据训练集所有的图像计算出一个平均像素值,然后每个图像都减去这个平均值,这样图像的像素就大约分布在[127,127]之间了。下一个常见步骤是,让所有数值分布的区间变成[-1,1]。零均值的中心化是很重要的。
这并没有改变你的图像信息,而且更利于数值优化。
3. 损失函数
上面我们定义来从图像像素值到所属类别的评分函数(score function),该函数的参数是权重矩阵$W$。在函数中,数据 $(x_i,y_i$ 是给的的,不能修改。但我们可以调整权重矩阵这个参数,使得评分函数的结果与训练数据集中图像的真实类别一致,既评分函数在正确的分类位置应当得到最高的评分(score)。
回到之前那张猫的图像分类例子,它有针对“猫”,“狗”,“船”三个类别的分数。我们看到例子中权重值非常差,因为猫分类的得分非常低(-96.8),而狗(437.9)和船(61.95)比较高。我们将使用损失函数(loss function)/代价函数(cost function)来衡量我们对结果的不满意程度。直观地讲,当评分函数输出结果与真实结果之间差异越大,损失函数输出越大,反之越小。
多类支持向量机损失 Multiclass Support Vector Machine Loss
损失函数的具体形式多种多样。这里,我们介绍了常用的多类别支持向量机(SVM)损失函数。该损失函数想要SVM在正确分类上的得分始终比不正确分类上的得分高出一个边界值 $\Delta$。我们可以把损失函数想象成一个人,这位SVM先生(或者女士)对于结果有自己的品位,如果某个结果能使得损失值更低,那么SVM就更加喜欢它。
具体的:样本 $i$ 中包含图像像素 $x_i$ 和类别标签 $y_i$。输入图像通过score function $f(x_i,W)$ 来计算不同分类类别的分值。那么针对这个样本的多类别SVM损失函数定义如下:
$L_i=\sum_{j\neq{y_i}}max(0, f_j-f_{y_i}+\Delta)$
例如:假设有三个分类类别,图片 $x_i$ 通过评分函数得到的分值为 [13, -7, 11]。假设第一个类别正确,即$y_i=0$,同时假设 $\Delta$ 是10。那么 $L_i=max(0, -7-13+10) + max(0, 11-13+10) = 8$。简而言之,SVM的损失函数想正确分类类别 $y_i$ 的分数比不正确的类别分数要高,而且至少要高 $\Delta$ ,如果不满足这点,则开始计算损失值。
在结束这一小结前,还必须提一下这个有关0的阈值函数:$max(0,-)$,它常被称为折叶损失(hinge loss)。有时候会听到人们使用平方折叶函数SVM(即 L2-SVM)。它使用的是 $max(0,-)^2$,将更强烈(平方地而不是线性地)地惩罚过界的边界值。不使用平方是更标准的版本,但是在某些数据集中,平方折叶损失会工作得更好。可以通过交叉验证来决定到底使用哪个。
我们对于预测训练集数据分类标签的情况总有一些不满意的,而损失函数就能将这些不满意的程度量化。
多类SVM”想要”正确类别的分数比其他不正确分类类别的分数要高,而且至少高出 $\Delta$ 边界值。如果其他分类分数进入了红色的区域,甚至更高,那么就开始计算损失。如果没有这种情况,损失值为0.我们的目标是找到一些权重,它们能够让训练集中的数据样例满足这些限制,也能够让总的损失值尽可能的低。
正则化(Regularization)
上面的损失函数有一个问题。假设有一个数据集和一个权重 $w$ 能够正确地分类每个数据(即所有的边界都满足,对于所有的 $i$ 都有 $L_i$ = 0),问题在于这个 $W$ 并不唯一。我们想象一下,当 $\lambda{ > 1}$ 时,任何 $\lambda{M}$ 都能使 损失值为0,因为这个变化将所有的分值的大小都均等地扩大了,所有它们的差值也扩大了。举个例子,如果一个正确分类的分值和距离它最近的错误分类的分值的差距是15,对 $W$ 乘以2将使得差距变成30。
我们希望能向某些特定的权重 $W$ 添加一些偏好,对于其他权重则不添加,以此来消除模糊性。这一点的实现方法是向损失函数增加一个正则化惩罚(regularization penalty) $R(W)$ 部分。最常用的正则化惩罚是 L2 范数,L2 范数通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重:
$R(W) = \sum_k{\sum_l{W_{k,l}^2}}$
上面的表达中,将 $w$ 中所有元素平方后求和。注意:正则化函数不是数据的函数,仅基于权重。包含正则化惩罚后就能够给出完整的多类别 SVM 损失函数了,它由两个部分组成:数据损失(data loss),即所有样本的平均损失,以及正则化损失(regularization loss)。
$L=\frac{1}{N}\sum{L_i}+\lambda{R(W)}$
Softmax分类器
Softmax中将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。公式如下:
$L_i=-log{\frac{e^{f_y}}{\sum_j{e^{f_j}}}}$
这里我们可以对比下SVM的损失函数。
针对一个数据点,SVM和Softmax分类器的不同处理方式的例子。两个分类器都计算了同样的分值向量 f(本节中是通过矩阵乘来实现)。不同之处在于对 f 中分值的解释:SVM分类器将它们看做是分类评分,它的损失函数鼓励正确的分类(本例中是蓝色的类别2)的分值比其他分类的分值高出至少一个边界值。Softmax分类器将这些数值看做是每个分类没有归一化的对数概率,鼓励正确分类的归一化的对数概率变高,其余的变低。SVM的最终的损失值是1.58,Softmax的最终的损失值是0.452,但要注意这两个数值没有可比性。只在给定同样数据,在同样的分类器的损失值计算中,它们才有意义。
总结如下:
- 定义了从图像像素映射到不同类别的分类评分的评分函数。在本节中,评分函数是一个基于权重 和偏差 的线性函数。
- 与kNN分类器不同,参数方法的优势在于一旦通过训练学习到了参数,就可以将训练数据丢弃了。同时该方法对于新的测试数据的预测非常快,因为只需要与权重 进行一个矩阵乘法运算。
- 介绍了偏差技巧,让我们能够将偏差向量和权重矩阵合二为一,然后就可以只跟踪一个矩阵。
- 介绍了图像预处理操作,0均值与同方差操作。
- 定义了损失函数(介绍了SVM和Softmax线性分类器最常用的2个损失函数)。损失函数能够衡量给出的参数集与训练集数据真实类别情况之间的一致性。在损失函数的定义中可以看到,对训练集数据做出良好预测与得到一个足够低的损失值这两件事是等价的。