声明,这个系列基本是我本身的一些学习过程,方便我本身后期复习的!html
线性分类器主要由两个部分组成:算法
该线性分类器能够转化成为一个最优化问题,在最优化过程当中,经过更新score function的参数来最小化loss function。机器学习
评分函数将图像夫人像素值集合最终映射为各个分类类别的得分,得分高低表明图像属于该类别的可能性高低。例如,有训练集$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),误差影响输出值,但并不和原始数据产生关联。优化
须要注意的是:spa
线性分类器计算图像中3个颜色通道中全部像素值与 权重的矩阵乘法,从而获得分类分值。根据咱们对权重设置的值,对于图像中某些位置的某些颜色,函数表现出喜爱或者厌恶(根据每一个权重的符号而定)。举个例子,能够想象“船”分类就是被大量的蓝色包围(对应的就是水)。那么“船”分类器在蓝色通道上的权重就有不少的正权重(它们的出现提升了“船”分类的分值),而在绿色和红色通道上的权重为负的就比较多(它们的出现下降了“船”分类的分值)。orm
上面是一个简单的将图像 映射到分类分值得例子。为了便于可视化,假设图像只有4个像素(都是黑白像素,这里不考虑RGB通道),有三个分类(红色表明猫,绿色表明狗,蓝色表明船,注意,这里的红、绿和蓝3种颜色仅表明分类,和RGB通道没有关系)。首先将图像像素拉伸为一个列向量,与进行矩阵乘,而后获得各个分类的分值。须要注意的是,这个一点也很差:猫分类的分值很是低。从上图来看,算法却是以为这个图像是一只狗。htm
实际操做中,咱们经常将 $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]。零均值的中心化是很重要的。
这并无改变你的图像信息,并且更利于数值优化。
上面咱们定义来从图像像素值到所属类别的评分函数(score function),该函数的参数是权重矩阵$W$。在函数中,数据 $(x_i,y_i$ 是给的的,不能修改。但咱们能够调整权重矩阵这个参数,使得评分函数的结果与训练数据集中图像的真实类别一致,既评分函数在正确的分类位置应当获得最高的评分(score)。
回到以前那张猫的图像分类例子,它有针对“猫”,“狗”,“船”三个类别的分数。咱们看到例子中权重值很是差,由于猫分类的得分很是低(-96.8),而狗(437.9)和船(61.95)比较高。咱们将使用损失函数(loss function)/代价函数(cost function)来衡量咱们对结果的不满意程度。直观地讲,当评分函数输出结果与真实结果之间差别越大,损失函数输出越大,反之越小。
损失函数的具体形式多种多样。这里,咱们介绍了经常使用的多类别支持向量机(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.咱们的目标是找到一些权重,它们可以让训练集中的数据样例知足这些限制,也可以让总的损失值尽量的低。
上面的损失函数有一个问题。假设有一个数据集和一个权重 $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中将折叶损失(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,但要注意这两个数值没有可比性。只在给定一样数据,在一样的分类器的损失值计算中,它们才有意义。
总结以下: