上一课最我们介绍了图像分类的问题,任务是从一个固定的类别集合中选一个分配给待识别的图像。最后,我们描述了k-近邻(KNN)分类器,它通过将待标记的图像与训练集中已经标记好的图像进行比较来标记图像。KNN有许多缺点:
概述。我们现在要开发一种更强大的图像分类方法,最终会扩展到整个神经网络和卷积神经网络。该方法有两个主要组成部分:一个是评分函数(score function),它是原始图像数据到类别分值的映射。另一个是损失函数(loss function),它是用来量化预测分类标签的得分与真实标签之间一致性的。然后,我们将此作为一个优化问题处理,即调整评分函数的参数,去最小化损失函数的值。
这种方法的第一个组成部分是定义将图像的像素值映射到每个类的置信分数的评分函数。假设训练数据有N个样本,每个样本有D个特征,全部的类型有K个。比如CIFAR-10数据库,N为5万,D=32 x 32 x 3 = 3072像素,K=10,因为有10个分类(狗,猫,车,等)。现在需要定义一个评分函数,将像素数据映射到分类得分。 f:RD↦RK
线性分类器。这是一个最简单的评分函数:
f(xi,W,b)=Wxi+b
这个公式假设将每个图像的所有像素平坦化为一维向量(d x 1维),Xi代表第i个像素的值。矩阵W(k x d维)和向量b(k x 1维)是函数的参数。在CIFAR-10中,Xi包含第i个图像中的所有像素平坦化为单个列[ 3072×1 ],W是[10×3072 ],B是[10×1 ],因此有3072个数字进入函数(原始像素值)和10个数字出来(类分数)。W中的参数通常称为权重,B称为偏置向量,因为它影响输出分数,但不与实际数据Xi交互。权重也称为参数,是一个意思。
有一些值得注意的事项:
预报:卷积神经网络也是将像上面所示的那样精确地将图像像素映射到分数,但是映射(F)将更加复杂,并且将包含更多的参数。
线性分类器是通过计算所有3个颜色通道的所有像素值的加权和,来计算一个类的得分。根据我们为这些权重设置的具体的值,该函数具有在图像中的某些位置上喜欢或不喜欢(取决于每个权重的符号)某些颜色的能力。例如,如果图像的边上有很多蓝色(很可能对应于水),那么“船”类更可能出现。你可能会期望“船”分类器在蓝色通道权重更高(蓝色增加船只的分数)和红色/绿色通道中的权重更低(红色/绿色的存在降低了船的分数)。
将图像映射到类分数的示例。为了可视化,我们假设图像只有4个像素(简化为只有一个颜色通道),并且有3个分类(猫、狗、船)。我们将图像像素拉伸成一个列,并执行矩阵乘法以获得每个类的分数。请注意,这组特定的权重W根本不好:权重赋予这张猫图像非常低的CAT得分,这组权重似乎相信它到了一只狗。
将图像比喻为高维点。由于图像被拉伸成高维列向量,所以我们可以将每个图像解释为该空间中的单个点(例如,CIFAR-10中的每个图像是在32×32×3像素的3072维空间中的点)。类似地,整个数据集是一个标记好分类的点集。
由于我们定义了所有图像像素的加权和作为每个类的得分,每个类得分是在这个空间上的线性函数。我们不能想象3072维空间,但是如果我们想象将这些维度挤压成两个维度,那么我们可以尝试可视化分类器可能正在做什么:
图像空间的简易表示,其中每个图像是一个点,并且有三个分类器。使用汽车分类器(红色)的例子,红线上的所有点,为汽车类获得零分的位置。红色箭头表示增加的方向,所以红线右边的所有点都有正的(线性增加的)分数,并且左边的所有点都有负的(线性减小的)分数。
正如我们上面看到的,W的每一行都是一个类的分类器。这些数字的几何解释是,当我们改变W的某一行时,像素空间中的对应线将在不同的方向上旋转。偏值b,则允许我们平移分类器线。如果没有偏置项,无论权重如何,在Xi=0的位置都将给出零分,因此所有的分类线都将被迫穿过原点。
将线性分类器理解为模板匹配器。权重W的另一种解释是W的每一行对应于一个分类的模板(或有时也称为原型)。然后,通过将每个模板与图像一起使用内积(或点积)逐一进行比较,得到图像属于每一个类的得分,以找到最适合的一个分类。使用这个术语,线性分类器就是在进行模板匹配,其中模板是被学习得到的。另一种方法是,我们仍然有效地使用最近邻计算,但不是使用成千上万的训练图像,我们为每个分类只使用一个单一的图像(这个图像是学习得到的,它不一定是训练集中的某个图像),我们使用(负)内积作为距离而不是L1或L2距离。
略微往前看一步:这是在最后一个例子中从CIFAR-10学习得到的权重。你看,如预期的那样,船模板包含许多蓝色像素。因此,该模板一旦与海洋上的船只图像匹配,就会得到高分。
另外,你看,马分类器模板似乎包含双头马,这是因为数据集中的有马脸朝左,有点马脸朝右。线性分类器将数据中的这两种模式合并成单个模板。类似地,汽车分类器似乎已经将多个模式合并成一个单一模板,该模板必须从所有侧面和所有颜色识别汽车。特别是,这个模板最终是红色的,这暗示了CIFAR-10数据集中的红色小汽车比任何其他颜色都多。线性分类器太弱,不能正确地解释不同颜色的汽车,但我们将看到以后的神经网络将允许我们正确地解释不同颜色的汽车。向前看一点,神经网络将能够在隐藏层中开发中间神经元,可以检测特定的汽车类型(例如面向左边的蓝色汽车,面向前方的蓝色汽车等),并且下一层的神经元可以通过计算每个汽车分类器的加权总,组合成更精确的汽车分类得分。
处理偏值的技巧,在进一步学习前,要提一下这个经常使用的技巧,将两个参数W,b合并为一个。回想一下,我们把得分函数定义为:
f(xi,W,b)=Wxi+b
单独跟踪两组参数(偏差b和权重W)有点麻烦。一个常用的技巧是将两组参数组合成一个矩阵,将向量Xi增加一个维度即可,这个增加的维度的值总是保持常数1。这样,新的得分函数将简化为单个矩阵乘法:
f(xi,W)=Wxi
就我们的CIOFE10数据集来说,Xi现在是[3073×1 ]而不是[3072×1 ] -(增加保持常数1的一个特征),W现在是[10×3073 ]而不是[10×3072 ]。W中额外增加的列现在对应于原来的偏置b。如下图所示:
偏值处理技巧图示。做一个矩阵乘法,然后添加一个偏置向量(左),等价于将一个常数为1的偏置维数加到所有输入向量上,同时权重矩阵也增加一列 (偏置列,右)。如此,我们就只需要学习一个权重矩阵,而不是两个矩阵(权重和偏差)。
图像数据预处理。在上面的简明例子中,我们使用原始像素值(范围从[ 0…255 ] ]。在机器学习实践中,经常对输入特征做归一化处理,是非常普遍的做法(在图像的情况下,每个像素都被认为是一个特征)。从每个特征中减去均值来对数据进行中心化是很重要的。对应处理图像的场景,就是从训练图像中,计算得到一个平均图像,并从每个图像减去它,转换为像素在大约[-127…127 ]范围内的图像。通常更进一步的预处理是对每个输入特征进行缩放,使得其值取自[-1, 1 ]。其中,零均值中心可以说是非常重要的,等我们了解了梯度下降法后再详察之。
在前叙章节中,我们定义了从像素值到类分数的函数,该函数由一组权重W作为参数。此外,我们还发现我们对数据(Xi,Yi)没有控制(它是固定的和给定的),但是我们能控制这些权重,并且我们想要将它们调整到要这样的状态:让预测的类得分与训练数据中的实际标记一致为止。
例如,回到猫的示例图像及其对“猫”、“狗”和“船”类的得分,我们看到那个例子中的特定权重集合不是很好:我们输入一张猫图的像素,但是猫分类的得分很低(-96.8),其他类别倒是更高(狗评分437.9和船舶评分61.95)。这样的结果不爽,我们用损失函数(有时也被称为成本函数)来定量化这种不爽。直观地说,如果我们把训练数据分类的工作做得不好,损失就会很高,如果我们做得好的话,损失就会很低。
定义损失函数的方法很多。作为第一个例子,我们首先来开发一种常用的损失,称为多分类支持向量机(SVM)损失。SVM损失的目标是使用一些固定的余量Δ,“想要”每张图片在正确的分类上得分远高于在错误分类上的得分。
还是前述数据集,对于第i个样例,我们给出了图像Xi的像素和指定正确类的标签Yi。得分函数取像素并计算向量f(Xi,W)得到各分类的得分,记为S。例如,第j类的得分是:Sj= f(Xi,W)j。然后,将第i个示例的多类SVM损失记为如下所示:
举例。让我们用一个例子解释,看看它是如何工作的。假设我们有三个分类,计算得分s=(13,-7,11],并且第一个类是真类(即yi= 0)。同时假设Δ(我们将很快详细地讨论的一个超参数)是10。上面的表达式对所有不正确的类进行了求和(j≠yi),因此我们得到了两个公式:
Li=max(0,−7−13+10)+max(0,11−13+10)
你看,第一项给出零,因为[-7 - 13+10 ]给出负数,然后用最大(0,-)函数将其阈值化为零。这一项为0,因为正确的类得分(13)大于错误的类得分(-7)至少10的差距。事实上,差异是20,这远远大于10。但SVM只关心的差异是至少10,超过10以上都是0。第二项计算[ 11 - 13 + 10 ],给出8。也就是说,就算正确的分类得分高于不正确的分类(13>11),但不大于期望的10的差距(差异仅为2),还是有损失,这里损失达到8。总之,SVM损失函数希望正确的类Yi的分数至少比不正确的类分数大一个Δ这么多。否则就积累了损失。
这里我们使用线性得分数函数(f(Xi,w)=WXi),因此我们也可以用这种等价形式写损失函数:
其中Wj是W的第j行,转换为列。当然,如果我们开始考虑更复杂形式的得分函数,形式就不是这样的了。
在结束这一部分之前,我们将提到的最后一个术语是,函数max(0,-)通常称为铰链损失。有时也使用平方铰链损失SVM(或L2-SVM),它使用形式max(0,-)2,这样对于差异的反应更强烈(二次而不是线性)。非平方版本更常用,但在某些数据集中,平方铰链损失函数工作的更好。到底使用线性差异还是平方差异,可以用交叉验证的方式确定。
损失函数是对预测训练数据不爽程度的度量
多类支持向量机“希望”正确的类得分高于所有其他类得分至少一个增量Δ。如果任何一个分类在红色区域内得分(或更高),则会累积损失。否则损失将为零。我们的目标将是找到同时满足训练数据中所有示例的约束的权重,并给出尽可能低的总损失。
正则化。上面给出的损失函数有一个问题。假设我们有一个数据集和一组参数W,它正确地对每个示例进行分类(即所有的分数都是满足所有的边界条件,并且对于所有i都是Li=0)。问题是,这组W不一定是唯一的:可能有许多类似的W,都能正确地分类的样本数据。比如,如果一组参数W对所有的样本数据能正确地进行分类(因此每个样本的损失为零),那么这些参数的任何一个倍数λW(λ>1)也将给出零损失,因为这个变换均匀地延伸所有的分数值及其差异的绝对值。例如,如果正确的类和最近的不正确类之间的分数的差值为15,那么将W的所有元素乘以2将使新差值为30。
换言之,我们希望对某些权重W的偏好进行编码,以消除这种歧义。我们可以通过用正则化惩罚R(W)来扩展损失函数。最常见的正则化惩罚是L2范数,它通过在所有参数上施加一个平方惩罚来阻止大的权重:
在上面的表达式中,我们对W的所有元素求平方和。注意正则化函数不是针对数据的函数,它仅基于权重。包含正则化惩罚的多分类支持向量机损失,它由两个部分组成:数据损失(这是所有样本中的平均损失Li)和正则化损失:
将它以完整的形式展开:
其中N是训练样本的数目。如上所示,我们将正则化惩罚附加到损失目标,由超参数λ加权。通常通过交叉验证来确定这个超参数λ。
最吸引人的特性是惩罚大的权重能够提高模型的泛化能力,因为没有哪个维度能够对最终得分有很大的影响。例如,假设我们有一些输入向量x= [1,1,1,1]和两个权重向量W1= [1,0,0,0],W2= [0.25,0.25,0.25,0.25]。然后W1TX=W2TX=1,因此两个权重向量都导致相同的点积,但是W1的L2惩罚为1,而W2的L2惩罚仅为0.25。因此,根据L2惩罚,权重向量W2将是优选的,因为它实现了较低的正则化损失。直观地说,这是因为W2中的权重较小且更舒缓。由于L2惩罚倾向于更小且更舒缓的权重向量,因此最终分类器倾向于考虑让所有输入特征都做出贡献,而不是只考虑少量特征(重团队精神,而不是个人英雄主义,^_^)。后续课堂会讲到,这种效果可以提高分类器在测试图像上的泛化性能,减少过拟合。
注意,偏值不具有相同的效果,因为不同于权重,它们对输入维数的强度没影响。因此,通常只对权重w进行调整,而不是对偏差B进行正则化。然而,在实践中,这种影响很少。最后,由于正则化惩罚,我们不能在所有的样例中获得精确的0的损失,因为这只有在W=0这种不理智的设置下才是可能。
代码(登录青星人工智能研究中心下载)
SVM损失的目标就是采取一种特定的方法来测量预测标签与实际标签的一致性。对训练集做出良好的预测等同于最小化损失。
所以,剩下所要做的就是想出一种方法来找到最小化该损失的权重 。
设置Δ。请注意,我们忽略了超参数Δ及其设置。它应该设置什么值,必须交叉验证它吗?事实证明,在所有情况下,这个超参数可以被安全地设置为Δ=1。超参数Δ和λ看起来像两个不同的超参数,但实际上它们都控制数据损失和正则损失之间的平衡。理解这一点的关键是权重W的量级直接影响得分(这也是它们的差异):当我们缩小W内的所有值时,得分差异将变小,并且当我们扩大权重时,得分差异将变得更高。因此,得分之间的余量(例如,Δ=1,或Δ=100)的确切值在某种意义上是没有意义的,因为权重可以任意地缩小或拉伸差异。因此,唯一真正需要权衡的是我们允许权重增长多少(通过正则化强度λ)。
与二分类支持向量机的关系。可能你以前接触过二分类支持向量机,其中第i个例子的损失这样表示:
其中C是一个超参数,并且是yi∈{−1,1}。这就是上述提出的多分类SVM在只有两个分类情况下的特列。此外,在这个公式中的C和我们的公式中的λ 起到相同的作用,他们的关系是 C∝1λ。
基于原始形态的优化。如果你以前接触过支持向量机分类方法,你可能也听过内核,对偶,SMO等算法。在神经网络课程,我们将始终在无约束的原始形态上优化目标。许多这些目标在技术上是不可微的(例如,max(x,y)函数就不可微,因为x=y时有扭结。实际上这不是一个问题,通常使用梯度下降法就可以解决。
其它的多分类SVM形式:值得注意的是,在本节中提出的多类SVM是在多个类上建立SVM的几种方法之一。另一种常用的形式是一对多(One-Vs-All,简称OVA)SVM,它为每个类和所有其他类训练一个独立的二分类SVM。相应地,也有在实践中不太常见的所有对所有(All-Vs-All,简称AVA)策略。我们的公式遵循 Weston和沃特金斯 1999论文,这是一个比OVA更强大的版本(该版本可以实现零数据损失,但OVA不能。详情可参阅论文)。你可以看到的最后一个公式是结构化的SVM,它最大化了正确分类得分与不正确分类中得分最高的得分之间的差距。
SVM是两种常见的分类器之一。另一个流行的选择是Softmax分类器,它具有不同的损失函数。如果你以前听说过二元逻辑回归分类器,那么二元逻辑回归分类器泛化到多个类就是Softmax分类器。不同于SVM将F(Xi,W)的输出作为每个类的得分(未校准和可能难以解释),Softmax分类器给出了更直观的输出(归一化分类概率),还有一个概率解释,后面马上描述。在Softmax分类器的函数映射也是F(Xi;W)=WXi,但是我们现在将这些分数解释为每个类的未标准化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。损失函数改为交叉熵损失:
fjb表示第j个分类得分。全部的损失包括所有训练样本的损失的平均数加上正则化项R(W)。函数 fj(z)=ezj∑kezk
称为softmax 函数:它需要向量的任意实值分数(Z),并将其压制成0到1之间的向量,向量的所有的值加起来合计为1。如果你第一次看到它,那么softmax函数中的全交叉熵损失函数可能看起来吓人,但它实际上比较容易理解。
信息论观点。"真"分布P与估计分布Q之间的交叉熵定义为:
Softmax分类器因此最小化了估计的类概率(如上面所示的q=efyi/∑jefj)和“真”分布之间的交叉熵。
在这个解释中,“真实”分布就是所有概率密度都分布在正确的类别上(比如:p=[0,...1,...,0]中在的位置就有一个单独的1)。还有,既然交叉熵可以写成熵和相对熵(Kullback-Leibler divergence),并且delta函数的熵是0,那么就能等价的看做是对两个分布之间的相对熵做最小化操作。换句话说,交叉熵损失函数“想要”预测分布的所有概率密度都在正确分类上。
译者注:Kullback-Leibler差异(Kullback-Leibler Divergence)也叫做相对熵(Relative Entropy),它衡量的是相同事件空间里的两个概率分布的差异情况。
概率论解释。先看下面的公式:
P(yi∣xi;W)=efyi∑jefj
可以解释为是给定图像数据Xi,以为参数,分配给正确分类标签的归一化概率。为了理解这点,请回忆一下Softmax分类器将输出向量中的评分值解释为没有归一化的对数概率。那么以这些数值做指数函数的幂就得到了没有归一化的概率,而除法操作则对数据进行了归一化处理,使得这些概率的和为1。从概率论的角度来理解,我们就是在最小化正确分类的负对数概率,这可以看做是在进行最大似然估计(MLE)。该解释的另一个好处是,损失函数中的正则化部分可以被看做是权重矩阵的高斯先验,这里进行的是最大后验估计(MAP)而不是最大似然估计。提及这些解释只是为了让读者形成直观的印象,具体细节就超过本课程范围了。
实操事项:数值稳定。编程实现softmax函数计算的时候,中间项efyi因为和 ∑jefjj
因为存在指数函数,所以数值可能非常大。除以大数值可能导致数值计算的不稳定,所以学会使用归一化技巧非常重要。如果在分式的分子和分母都乘以一个常数C,并把它变换到求和之中,就能得到一个从数学上等价的公式:
efyi∑jefj=CefyiC∑jefj=efyi+logC∑jefj+logC
C的值可自由选择,不会影响计算结果,通过使用这个技巧可以提高计算中的数值稳定性。通常将设为。该技巧简单地说,就是应该将向量中的数值进行平移,使得最大值为0。代码实现如下:
f = np.array([123, 456, 789]) # 例子中有3个分类,每个评分的数值都很大
p = np.exp(f) / np.sum(np.exp(f)) # 不妙:数值问题,可能导致数值爆炸
# 那么将f中的值平移到最大值为0:
f -= np.max(f) # f becomes [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # 现在OK了,将给出正确结果
让人迷惑的命名规则:精确地说,SVM分类器使用的是折叶损失(hinge loss),有时候又被称为最大边界损失(max-margin loss)。Softmax分类器使用的是交叉熵损失(corss-entropy loss)。Softmax分类器的命名是从softmax函数那里得来的,softmax函数将原始分类评分变成正的归一化数值,所有数值和为1,这样处理后交叉熵损失才能应用。注意从技术上说“softmax损失(softmax loss)”是没有意义的,因为softmax只是一个压缩数值的函数。但是在这个说法常常被用来做简称。
4.6 SVM vs. Softmax
下图可能有助于阐明SOFTMax和SVM分类器之间的区别
SVM和Softmax分类器的不同处理方式的例子。两个分类器都计算了同样的分值向量f(本节中是通过矩阵乘来实现)。不同之处在于对f中分值的解释:SVM分类器将它们看做是分类评分,它的损失函数鼓励正确的分类(本例中是蓝色的类别2)的分值比其他分类的分值高出至少一个边界值。Softmax分类器将这些数值看做是每个分类没有归一化的对数概率,鼓励正确分类的归一化的对数概率变高,其余的变低。SVM的最终的损失值是1.58,Softmax的最终的损失值是1.04(注意这个1.04 用的是自然对数,不是以2,也不是以10为底),但要注意这两个数值没有可比性。只在给定同样数据,在同样的分类器的损失值计算中,它们才有意义。
Softmax分类器为每个分类提供了“可能性”:SVM的计算是无标定的,而且难以针对所有分类的评分值给出直观解释。Softmax分类器则不同,它允许我们计算出对于所有分类标签的可能性。举个例子,针对给出的图像,SVM分类器可能给你的是一个[12.5, 0.6, -23.0]对应分类“猫”,“狗”,“船”。而softmax分类器可以计算出这三个标签的”可能性“是[0.9, 0.09, 0.01],这就让你能看出对于不同分类准确性的把握。为什么我们要在”可能性“上面打引号呢?这是因为可能性分布的集中或离散程度是由正则化参数λ直接决定的,λ是你能直接控制的一个输入参数。举个例子,假设3个分类的原始分数是[1, -2, 0],那么softmax函数就会计算:
现在,如果正则化参数λ更大,那么权重W就会被惩罚的更多,然后他的权重数值就会更小。这样算出来的分数也会更小,假设小了一半吧[0.5, -1, 0],那么softmax函数的计算就是:
现在看起来,概率的分布就更加分散了。还有,随着正则化参数λ不断增强,权重数值会越来越小,最后输出的概率会接近于均匀分布。这就是说,softmax分类器算出来的概率最好是看成一种对于分类正确性的自信。和SVM一样,数字间相互比较得出的大小顺序是可以解释的,但其绝对值则难以直观解释。
在实际使用中,SVM和Softmax经常是相似的:通常说来,两种分类器的表现差别很小,不同的人对于哪个分类器更好有不同的看法。相对于Softmax分类器,SVM更加“局部目标化(local objective)”,这既可以看做是一个特性,也可以看做是一个劣势。考虑一个评分是[10, -2, 3]的数据,其中第一个分类是正确的。那么一个SVM()会看到正确分类相较于不正确分类,已经得到了比边界值还要高的分数,它就会认为损失值是0。SVM对于数字个体的细节是不关心的:如果分数是[10, -100, -100]或者[10, 9, 9],对于SVM来说没设么不同,只要满足超过边界值等于1,那么损失值就等于0。
对于softmax分类器,情况则不同。对于[10, 9, 9]来说,计算出的损失值就远远高于[10, -100, -100]的。换句话来说,softmax分类器对于分数是永远不会满意的:正确分类总能得到更高的可能性,错误分类总能得到更低的可能性,损失值总是能够更小。但是,SVM只要边界值被满足了就满意了,不会超过限制去细微地操作具体分数。这可以被看做是SVM的一种特性。举例说来,一个汽车的分类器应该把他的大量精力放在如何分辨小轿车和大卡车上,而不应该纠结于如何与青蛙进行区分,因为区分青蛙得到的评分已经足够低了。
小结
总结如下:
现在我们知道了如何基于参数,将数据集中的图像映射成为分类的评分,也知道了两种不同的损失函数,它们都能用来衡量算法分类预测的质量。但是,如何高效地得到能够使损失值最小的参数呢?这个求得最优参数的过程被称为最优化,将在下节课中进行介绍。
斯坦福大学计算机视图课程,青星人工智能研究中心翻译整理
1、数据驱动的图像分类方法
2、最近邻分类器
3、k - 最近邻分类器及使用验证集取得超参数
4、线性分类: SVM, Softmax
5、优化方法:随机梯度下降法
6、反向传播
7、神经网络一: 建立网络架构
8、神经网络二:设置数据和损失
9、神经网络 三:学习与评价
10、神经网络案例学习
11、卷积神经网络:结构、卷积/汇集层
12、理解与可视化卷积神经网络
13、传承学习与卷积神经网络调谐
原文地址 CS231n Convolutional Neural Networks for Visual Recognition