CS231n课程笔记——线性分类

线性分类

在上一节中,我们介绍了图像分类问题,即从一组固定的类别中为图像分配单个标签的任务。此外,我们描述了 k k k-最近邻( k N N kNN kNN)分类器,该分类器通过将图像与来自训练集的(注释)图像进行比较来标记图像。正如我们所看到的, k N N kNN kNN有许多缺点:

  • k N N kNN kNN分类器必须记住所有的训练数据并存储起来,以便将来与测试数据进行比较。这是空间效率低下的,因为数据集的大小很容易达到千兆字节。
  • 对测试图像进行分类是高代价的,因为它需要与所有训练图像进行比较。

概述。我们现在将开发一种更强大的图像分类方法,并最终将其自然地扩展到整个神经网络和卷积神经网络。该方法有两个主要部分:一个将原始数据映射到类别分数的评分函数,一个量化预测分数和真实标签之间的一致性的损失函数。然后,我们将其转换为一个优化问题,在该问题中,我们将最小化和评分函数的参数相关的损失函数。

图像到标签分数的参数化映射

该方法的第一个组成部分是定义评分函数,将图像的像素值映射到每个类别的置信度分数。我们将用一个具体的例子来说明这种方法。和之前一样,我们假设图像训练数据集 x i ∈ R D x_i∈R^D xiRD,每个图像都与标签 y i y_i yi相关联。这里 i = 1... N i=1...N i=1...N y i ∈ 1... K y_i∈1...K yi1...K。也就是说,我们有 N N N个样本(每个样本的维度为 D D D)和 K K K个不同的类别。例如,在 C I F A R − 10 CIFAR-10 CIFAR10中,我们有一个 N = 50 , 000 N = 50,000 N=50,000张图像的训练集,每个图像有 D = 32 × 32 × 3 = 3072 D = 32 \times 32 \times 3 = 3072 D=32×32×3=3072个像素,以及 K = 10 K = 10 K=10,因为有 10 10 10个不同的类别(狗、猫、汽车等)。我们现在将定义评分函数 f : R D ↦ R K f:R^D ↦ R^K f:RDRK,它将原始图像像素映射到类别分数。

线性分类器。在本模块中,我们将从可能是最简单的函数——线性映射开始:
f ( x i , W , b ) = W x i + b f (x_i, W, b) = Wx_i + b f(xi,W,b)=Wxi+b
在上面的等式中,我们假设将图像 x i x_i xi的所有像素展平为形状为 [ D × 1 ] [D\times 1] [D×1]的单列向量。矩阵 W W W(大小为 [ K × D ] [K \times D] [K×D])和向量 b b b(大小为 [ K × 1 ] [K \times 1] [K×1])是函数的参数。在 C I F A R − 10 CIFAR-10 CIFAR10中, x i x_i xi包含第 i i i个图像中的所有像素,并平摊为 [ 3072 × 1 ] [3072 \times 1] [3072×1]的单列, W W W [ 10 × 3072 ] [10 \times 3072] [10×3072] b b b [ 10 × 1 ] [10 \times 1] [10×1],因此函数中输入 3072 3072 3072个数字(原始像素值),输出 10 10 10个数字(类别分数)。 W W W中的参数通常被称为权重, b b b被称为偏置向量,因为它会影响输出分数,但不会与实际数据 x i x_i xi交互。然而,你经常会听到人们交替使用权重和参数这两个术语。

有几点需要注意:

  • 首先,注意单个矩阵乘法 W x i Wx_i Wxi有效地并行评估 10 10 10个分类器(每个分类器对应一个类别),其中每个分类器是 W W W的一行。
  • 还要注意,我们考虑输入数据 ( x i , y i ) (xi,yi) (xi,yi)是给定且固定的,但我们可以控制参数 W W W b b b的设置。我们的目标是使计算出的分数与整个训练集的真实值标签相匹配。我们将更详细地介绍这是如何实现的,但从直觉上讲,我们希望正确类别的得分高于不正确类别的得分。
  • 这种方法的一个优点是使用训练数据来学习参数 W W W b b b,但是一旦学习完成,我们可以丢弃整个训练集,只保留学习到的参数。这是因为新的测试图像可以简单地通过函数向前计算,并根据计算出的分数进行分类。
  • 最后,请注意,对测试图像进行分类涉及单个矩阵的乘法和加法,这比将测试图像与所有训练图像进行比较要快得多。

铺垫:卷积神经网络将如上面所示那样精确地将图像像素映射到分数,但映射( f f f)将更复杂,包含更多参数。

线性分类器解释

请注意,线性分类器将类别分数计算为3个颜色通道的所有像素值的加权和。准确地说,取决于我们为这些权重设置的值,该函数可以喜欢或不喜欢图像中特定位置的特定颜色(取决于每个权重的符号)。例如,你可以想象,如果图像的两侧有很多蓝色(可能对应于水),则更有可能是“船”类。你可能会认为,“船”分类器的蓝色通道权重中有很多正权重(蓝色的出现会增加“船”的得分),而红/绿色通道中有很多负权重(红/绿色的出现会减少“船”的得分)。


imgpap

将图像映射到类别分数的一个示例。为了可视化,我们假设图像只有 4 4 4个像素( 4 4 4个单色像素,为简洁起见,在此示例中我们不考虑颜色通道),并且我们有 3 3 3个类别(红(猫)、绿(狗)、蓝(船)三类)。(说明:特别地,这里的颜色只是表示 3 3 3个类别,与 R G B RGB RGB通道无关。)我们将图像像素拉伸到一列中,并执行矩阵乘法以获得每个类别的分数。请注意,这个特定的权重 W W W根本不好:这些权重给我们的猫图像分配了一个非常低的猫分数。特别地,这组权重似乎确信它看到的是一只狗。


将图像类比为高维点。由于图像被拉伸为高维列向量,我们可以将每个图像解释为该空间中的单个点(例如, C I F A R − 10 CIFAR-10 CIFAR10中的每个图像是 32 × 32 × 3 32\times 32\times 3 32×32×3像素的 3072 3072 3072维空间中的一个点)。类似地,整个数据集是一组(带标签的)点。

由于我们将每个类别的得分定义为所有图像像素的加权和,因此每个类别得分是该空间上的线性函数。我们无法将 3072 3072 3072维的空间可视化,但如果我们将所有这些维度压缩到只有 2 2 2维,那么我们可以尝试可视化分类器可能做的事情:


pixelspace

图像空间的草图表示,其中每个图像是一个点,并可视化了三个分类器。以汽车分类器为例(红色部分),红线表示空间中汽车类得分为 0 0 0的所有点。红色箭头表示增加的方向,因此所有位于红线右侧的点得分均为正(且线性增加),而所有位于红线左侧的点得分均为负(且线性减少)。


正如我们上面看到的, W W W的每一行都是一个类别的分类器。这些数字的几何解释是,当我们改变 W W W的一行时,像素空间中相应的线将向不同的方向旋转。另一方面,偏差 b b b允许我们的分类器平移直线。特别地,注意如果没有偏置项,代入 x i = 0 x_i=0 xi=0,无论权重如何,分数总是 0 0 0,因此所有的线都将被迫穿过原点。

将线性分类器解释为模板匹配。权重 W W W的另一种解释是 W W W的每一行对应于其中一个类的模板(有时也称为原型)。然后,通过使用内积(或点积)逐一比较每个模板与图像,以找到最“适合”的模板,从而获得图像的每个类的分数。使用这个术语,线性分类器是在进行模板匹配,在其中学习模板。另一种思考方法是,我们仍然在有效地使用最近邻算法,但不是有数千个训练图像,而是每个类只使用一个图像(尽管我们会学习它,而且它不一定是训练集中的一个图像),并且我们使用(负)内积作为距离,而不是 L 1 L1 L1 L 2 L2 L2距离。


templates

跳过一下: C I F A R − 10 CIFAR-10 CIFAR10学习结束时的权重示例。例如,请注意,船的模板中包含了很多蓝色像素。因此,这个模板一旦通过内积匹配海洋上船只的图像,就会给出高分。


此外,请注意,马模板似乎包含一个双头马,这是由于数据集中既有左面马,也有右面马。线性分类器将数据中马的这两种模式合并到一个模板中。类似地,汽车分类器似乎将几个模式合并到一个模板中,该模板必须识别面向四面八方的所有颜色的汽车。特别是,这个模板最终是红色的,这意味着在 C I F A R − 10 CIFAR-10 CIFAR10数据集中红色的汽车比其他颜色的汽车更多。线性分类器太弱了,无法正确地解释不同颜色的汽车,但稍后我们将看到,神经网络将允许我们执行此任务。展望一下,神经网络将能够在其隐藏层中开发中间神经元,这些神经元可以检测特定的汽车类型(例如绿色汽车朝左,蓝色汽车朝前等),而下一层的神经元可以通过独立汽车检测器的加权和将这些神经元组合成更准确的汽车的分数。

偏置的技巧。在继续之前,我们想提一个常见的简化技巧,它将两个参数 W W W b b b表示为一个。回想一下,我们将评分函数定义为:
f ( x i , W , b ) = W x i + b f(x_i, W, b) = W x_i + b f(xi,W,b)=Wxi+b
当我们继续阅读这篇材料时,单独跟踪两组参数(偏置 b b b和权重 W W W)有点麻烦。一个常用的技巧是将两组参数组合到一个矩阵中,通过将向量 x i x_i xi扩展一个额外的维度,该维度的值始终保持常数 1 1 1——默认偏置维度,从而将两组参数组合为一个矩阵。增加维度后,新的评分函数将简化为单个矩阵乘法:
f ( x i , W ) = W x i f(x_i, W) = W x_i f(xi,W)=Wxi
在我们的 C I F A R − 10 CIFAR-10 CIFAR10示例中, x i x_i xi现在是 [ 3073 × 1 ] [3073 \times 1] [3073×1]而不是 [ 3072 × 1 ] [3072 \times 1] [3072×1] ——(额外维度的值保持常数1), W W W现在是 [ 10 × 3073 ] [10 \times 3073] [10×3073]而不是 [ 10 × 3072 ] [10 \times 3072] [10×3072]。额外的一列 W W W现在对应偏差 b b b。举例说明可能有助于阐明:


wb

偏置技巧的说明。进行矩阵乘法,然后添加一个偏置向量(左)等效于向所有输入向量添加一个常数为 1 1 1的偏置维度,并将权重矩阵扩展 1 1 1列——偏置列(右)。因此,如果我们通过向所有向量添加 1 1 1来预处理数据,我们只需要学习一个权重矩阵,而不是两个包含权重和偏置的矩阵。


图像数据预处理。简单说明一下,在上面的例子中,我们使用的是原始像素值(范围 [ 0 … 255 ] [0…255] [0255])。在机器学习中,对输入特征进行归一化(对于图像,每个像素都被认为是一个特征)是一种非常常见的做法。特别是,通过减去每个特征的平均值来中心化数据非常重要。对于图像,这相当于在训练图像中计算一个平均图像,并从每个图像中减去它,以得到像素范围约为 [ − 127 … 127 ] [-127…127] [127127]的图像。进一步常见的预处理是对每个输入特征进行缩放,使其值在 [ − 1 , 1 ] [- 1,1] [1,1]范围内。其中,零均值居中可以说是更重要的,说明其理由需要等到我们了解梯度下降的动力学。

损失函数

在上一节中,我们定义了一个从像素值到类别分数的函数,该函数由一组权重 W W W参数化。此外,我们还看到我们无法控制数据 ( x i , y i ) (x_i,y_i) (xi,yi)(它是固定且给定的),但我们确实可以控制这些权重,我们希望设置它们,以便预测的类别分数与训练数据中的真实标签一致。

例如,回到猫的示例图像及其在“猫”、“狗”和“船”类别中的得分,我们看到该示例中的特定权重集根本不好:我们输入了描述猫的像素,但与其他类别相比(狗得分 437.9 437.9 437.9,船得分 61.95 61.95 61.95),猫的得分非常低( − 96.8 -96.8 96.8)。我们将用损失函数(有时也称为成本函数或目标)来衡量我们对这样的结果的不满意。直觉上,如果我们对训练数据的分类工作做得很差,损失就会很高,如果我们做得很好,损失就会很低。

多类支持向量机损失

有几种方法可以定义损失函数的细节。作为第一个例子,我们将首先阐释一个常用的损失函数,称为多类支持向量机( S V M SVM SVM)损失函数。设置 S V M SVM SVM损失,以便 S V M SVM SVM“希望”每个图像的正确类别的分数比错误类别的分数高一些固定的间隔 Δ \Delta Δ。请注意,有时将损失函数拟人化是有帮助的,正如我们上面所做的那样: S V M SVM SVM“希望”某种结果,即该结果将产生较低的损失(这是好的)。

现在让我们得到更多细节。回想一下,对于第 i i i个例子,我们已知图像像素 x i x_i xi和指定了正确类别索引的标签 y i y_i yi。评分函数接收像素并计算类别分数的向量 f ( x i , W ) f(x_i,W) f(xi,W),我们将其缩写为 s s s ( s c o r e s scores scores的缩写)。例如,第 j j j个类别的分数是第 j j j个元素: s j = f ( x i , W ) j s_j=f(x_i,W)_j sj=f(xi,W)j。第 i i i个例子的多类 S V M SVM SVM损失形式如下:
L i = ∑ j ≠ y i max ⁡ ( 0 , s j − s y i + Δ ) L_i = \sum_{j\neq y_i} \max(0, s_j - s_{y_i} + \Delta) Li=j=yimax(0,sjsyi+Δ)
例子。让我们用一个例子来解析它,看看它是如何工作的。假设我们有三个类别,它们的得分 s = [ 13 , − 7 , 11 ] s=[13,−7,11] s=[13,7,11],并且第一个类别是真正的类别(即 y i = 0 y_i=0 yi=0)。还假设 Δ \Delta Δ 10 10 10(一个超参数,我们将很快详细地介绍它)。上述表达式对所有错误类别( j ≠ y i j≠y_i j=yi)求和,因此我们得到两项:
L i = max ⁡ ( 0 , − 7 − 13 + 10 ) + max ⁡ ( 0 , 11 − 13 + 10 ) L_i = \max(0, -7 - 13 + 10) + \max(0, 11 - 13 + 10) Li=max(0,713+10)+max(0,1113+10)
可以看到,第一项为零,因为 [ − 7 − 13 + 10 ] [-7-13+10] [713+10]为负数,然后 m a x ( 0 , − ) max(0,−) max(0,)函数将其阈值设置为零。对于这对,我们得到零损失,因为正确的类别分数( 13 13 13)比错误的类别分数( − 7 -7 7)至少大了 10 10 10。事实上,差值是 20 20 20,远远大于 10 10 10,但 S V M SVM SVM只关心差值至少为 10 10 10;任何超出间隔的差值都会被 m a x max max操作限制为零。第二项计算 [ 11 − 13 + 10 ] [11-13+10] [1113+10],结果为 8 8 8。也就是说,即使正确的类别比错误的类别得分更高( 13 > 11 13\gt 11 13>11),并没有超出 10 10 10的预期间隔。差值只有 2 2 2,这就是为什么损失是 8 8 8(即差值要高多少才能达到间隔)。总而言之, S V M SVM SVM损失函数希望正确类别 y i y_i yi的分数比错误类别的分数至少大 Δ \Delta Δ d e l t a delta delta)。如果不是这样,我们就会积累损失。

请注意,在这个特定的模块中,我们使用线性评分函数( f ( x i ; W ) = W x i f(x_i;W)=Wx_i f(xi;W)=Wxi),因此我们也可以将损失函数重写为等价的形式:
L i = ∑ j ≠ y i max ⁡ ( 0 , w j T x i − w y i T x i + Δ ) L_i = \sum_{j\neq y_i} \max(0, w_j^T x_i - w_{y_i}^T x_i + \Delta) Li=j=yimax(0,wjTxiwyiTxi+Δ)
其中, w j w_j wj是将 W W W的第 j j j行转换为一列。然而,一旦我们开始考虑评分函数 f f f的更复杂形式,上述情况就不一定了。

在结束本节之前,我们要提到的最后一个术语是 0 0 0阈值 m a x ( 0 , − ) max(0,−) max(0,)函数,常称为铰链损失。你有时会听说有人使用平方铰链损失 S V M SVM SVM(或 L 2 − S V M L2-SVM L2SVM),它的形式是 m a x ( 0 , − ) 2 max(0,−)^2 max(0,)2,这样对违规间隔的惩罚会更强烈(用二次函数而不是线性函数)。未平方的版本更标准,但在某些数据集上平方铰链损失可以表现得更好。这可以在交叉验证期间确定。

损失函数量化我们对于训练集的预测的不满意程度


margin

多分类支持向量机“希望”正确类别的分数比所有其他类别的分数至少高出一个 d e l t a delta delta的间隔。如果任何类别的分数在红色区域内(或更高),则将出现累积损失。否则损失为零。我们的目标是找到同时满足训练数据中所有示例的约束条件的权重,并给出尽可能低的总损失。


正则化。我们上面介绍的损失函数有一个问题。假设我们有一个数据集和一组参数 W W W,它们可以正确分类每个样本(即所有分数都满足间隔,对所有 i i i L i = 0 L_i=0 Li=0)。问题是这个 W W W集合不一定是唯一的:可能有很多类似的 W W W可以正确分类样本。一个简单的验证方法是,如果某些参数 W W W对所有样本都正确分类(因此每个样本的损失为零),则这些参数的任意倍数 λ W , λ > 1 \lambda W, \lambda\gt1 λW,λ>1也将产生零损失,因为这种转换均匀地拉伸了所有分数幅度,因此也拉伸了它们的绝对差异。例如,如果正确的类别和最接近的错误类别之间的得分差是 15 15 15,那么将 W W W的所有元素乘以 2 2 2将使新的差值为 30 30 30

换句话说,我们希望编码对某一组权重 W W W的偏好,以消除这种模糊性。我们可以通过使用正则化惩罚 R ( W ) R(W) R(W)扩展损失函数来实现。最常见的正则化惩罚是 L 2 L2 L2平方范数,它通过对所有参数进行按元素的二次方惩罚来抑制较大的权重:
R ( W ) = ∑ k ∑ l W k , l 2 R(W) = \sum_k\sum_l W_{k,l}^2 R(W)=klWk,l2
在上面的表达式中,我们将 W W W的所有元素平方相加。请注意,正则化函数不是数据的函数,它仅基于权重。正则化惩罚项的加入完成了完整的多类支持向量机损失,它由两部分组成:数据损失(所有示例的损失 L i L_i Li的平均)和正则化损失。也就是说,完整的多类 S V M SVM SVM损失函数变为:
L = 1 N ∑ i L i ⏟ data loss + λ R ( W ) ⏟ regularization loss L = \underbrace{ \frac{1}{N} \sum_i L_i }_\text{data loss} + \underbrace{ \lambda R(W) }_\text{regularization loss} \\\\ L=data loss N1iLi+regularization loss λR(W)
或者把它的完整形式展开:
L = 1 N ∑ i ∑ j ≠ y i [ max ⁡ ( 0 , f ( x i ; W ) j − f ( x i ; W ) y i + Δ ) ] + λ ∑ k ∑ l W k , l 2 L = \frac{1}{N} \sum_i \sum_{j\neq y_i} \left[ \max(0, f(x_i; W)_j - f(x_i; W)_{y_i} + \Delta) \right] + \lambda \sum_k\sum_l W_{k,l}^2 L=N1ij=yi[max(0,f(xi;W)jf(xi;W)yi+Δ)]+λklWk,l2
其中 N N N是训练样本的数量。如你所见,我们将正则化惩罚附加到损失目标,由超参数 λ \lambda λ加权。没有简单的方法来设置这个超参数,通常通过交叉验证来确定。

除了上面提到的动机之外,加入正则化惩罚还有许多值得考虑的性质,其中的许多我们将在后面几节中讨论。例如,事实证明,加入 L 2 L2 L2惩罚会导致 S V M SVM SVM中有吸引人的最大间隔性质(如果你有兴趣,请参阅CS229的讲义了解完整的细节)。

最吸引人的特性是惩罚较大的权重往往会提高泛化能力,因为这意味着没有任何输入维度可以单独对分数产生很大影响。例如,假设我们有一个输入向量 x = [ 1 , 1 , 1 , 1 ] x=[1,1,1,1] x=[1,1,1,1]和两个权重向量 w 1 = [ 1 , 0 , 0 , 0 ] w1=[1,0,0,0] w1=[1,0,0,0] w 2 = [ 0.25 , 0.25 , 0.25 , 0.25 ] w2=[0.25,0.25,0.25,0.25] w2=[0.25,0.25,0.25,0.25]。那么 w 1 T x = w 2 T x = 1 w_1^Tx = w_2^Tx = 1 w1Tx=w2Tx=1,因此两个权重向量导致相同的点积,但 w 1 w_1 w1 L 2 L2 L2惩罚值为 1.0 1.0 1.0,而 w 2 w_2 w2 L 2 L2 L2惩罚值仅为 0.5 0.5 0.5。因此,根据 L 2 L2 L2惩罚,权重向量 w 2 w_2 w2将是首选,因为它实现了较低的正则化损失。直观地说,这是因为 w 2 w_2 w2中的权重更小,更分散。由于 L 2 L2 L2惩罚偏好更小和更分散的权重向量,因此鼓励最终分类器以较小的数量考虑所有输入维度,而不是格外地考虑少数输入维度。稍后我们会看到,这种效果可以提高分类器在测试图像上的泛化性能,减少过拟合

请注意,与权重不同,偏差没有相同的影响,它们不控制输入维度的影响强度。因此,通常只对权重 W W W进行正则化而不是偏置 b b b。但是,在实践中,这往往会产生微不足道的影响。最后,请注意,由于正则化惩罚,我们永远无法在所有样本上实现完全 0.0 0.0 0.0的损失,因为这只有在 W = 0 W=0 W=0的病态设置下才有可能。

代码。以下是 P y t h o n Python Python实现的损失函数(没有正则化),包括非向量化和半向量化两种形式:

def L_i(x, y, W):
  """
  unvectorized version. Compute the multiclass svm loss for a single example (x,y)
  - x is a column vector representing an image (e.g. 3073 x 1 in CIFAR-10)
    with an appended bias dimension in the 3073-rd position (i.e. bias trick)
  - y is an integer giving index of correct class (e.g. between 0 and 9 in CIFAR-10)
  - W is the weight matrix (e.g. 10 x 3073 in CIFAR-10)
  """
  delta = 1.0 # see notes about delta later in this section
  scores = W.dot(x) # scores becomes of size 10 x 1, the scores for each class
  correct_class_score = scores[y]
  D = W.shape[0] # number of classes, e.g. 10
  loss_i = 0.0
  for j in range(D): # iterate over all wrong classes
    if j == y:
      # skip for the true class to only loop over incorrect classes
      continue
    # accumulate loss for the i-th example
    loss_i += max(0, scores[j] - correct_class_score + delta)
  return loss_i

def L_i_vectorized(x, y, W):
  """
  A faster half-vectorized implementation. half-vectorized
  refers to the fact that for a single example the implementation contains
  no for loops, but there is still one loop over the examples (outside this function)
  """
  delta = 1.0
  scores = W.dot(x)
  # compute the margins for all classes in one vector operation
  margins = np.maximum(0, scores - scores[y] + delta)
  # on y-th position scores[y] - scores[y] canceled and gave delta. We want
  # to ignore the y-th position and only consider margin on max wrong class
  margins[y] = 0
  loss_i = np.sum(margins)
  return loss_i

def L(X, y, W):
  """
  fully-vectorized implementation :
  - X holds all the training examples as columns (e.g. 3073 x 50,000 in CIFAR-10)
  - y is array of integers specifying correct class (e.g. 50,000-D array)
  - W are weights (e.g. 10 x 3073)
  """
  # evaluate loss over all examples in X without using any for loops
  # left as exercise to reader in the assignment

本节的要点是, S V M SVM SVM损失函数采用了一种特殊的方法来测量训练数据上的预测值与真实值标签的一致性。此外,对训练集进行良好的预测等价于最小化损失。

我们现在要做的就是找到一种方法来获得使损失最小化的权重。

实际考虑

设置 Δ \Delta Δ。注意,我们忽略了超参数 Δ \Delta Δ以及它的设置。它应该设置为什么值,我们必须对它进行交叉验证吗?事实证明,在所有情况下,这个超参数都可以安全地设置为 Δ = 1.0 \Delta=1.0 Δ=1.0。超参数 Δ \Delta Δ λ \lambda λ似乎是两个不同的超参数,但实际上它们都控制着相同的权衡:目标中的数据损失和正则化损失之间的权衡。理解这一点的关键是权重 W W W的大小对分数(以及它们的差异)有直接影响:当我们缩小 W W W内的所有值时,分数差异将变得更小,而当我们扩大权重时,分数差异都将变得更高。因此,分数之间间隔的准确值(例如 Δ = 1 \Delta=1 Δ=1,或 Δ = 100 \Delta=100 Δ=100)在某种意义上是没有意义的,因为权重可以任意缩小或扩大差异。因此,唯一真正的权衡是我们允许权重增长多大(通过正则化强度 λ \lambda λ)。

与二值支持向量机的关系。你可能有过二值支持向量机的学习经验,其中第 i i i个样本的损失函数可以写成:
L i = C max ⁡ ( 0 , 1 − y i w T x i ) + R ( W ) L_i = C \max(0, 1 - y_i w^Tx_i) + R(W) Li=Cmax(0,1yiwTxi)+R(W)
其中 C C C为超参数, y i ∈ − 1 , 1 y_i∈{−1,1} yi1,1。你可以说服自己,我们在本节中给出的公式包含了一个只有两个类别的特殊情况——二值 S V M SVM SVM。也就是说,如果我们只有两个类别,那么损失将变弱为上面所示的二值 S V M SVM SVM。此外,这个公式中的 C C C和我们的公式中的 λ λ λ控制着相同的权衡,并且通过互反关系 C ∝ 1 λ C\propto\frac{1}{λ} Cλ1相联系。

旁白:优化原始形式。如果你来上课之前已经有了 S V M SVM SVM的知识,你可能也听说过核函数、对偶函数、 S M O SMO SMO算法等。在本课程中(就像一般的神经网络一样),我们将始终以无约束的原始形式处理优化目标。这些目标中的许多在技术上是不可微的(例如 m a x ( x , y ) max(x,y) max(x,y)函数不能微,因为当 x = y x=y x=y时它有一个扭结),但在实践中这不是问题,通常使用次梯度。

旁白:其他多类SVM公式。值得注意的是,本节介绍的多类 S V M SVM SVM是描述多类 S V M SVM SVM的少数几种方法之一。另一种常用的形式是一对多( O V A OVA OVA S V M SVM SVM,它为每个类别相对于所有其他类别训练一个独立的二元 S V M SVM SVM。与之相关,但在实践中不太常见的还有多对多( A V A AVA AVA)策略。我们的公式遵循韦斯顿和沃特金斯 1999 1999 1999 年( p d f pdf pdf的版本,这是一个比 O V A OVA OVA更强大的版本(从某种意义上说,您可以构建多类数据集,该版本可以实现零数据损失,但 O V A OVA OVA不能。如果有兴趣,请参阅论文中的详细信息)。你可能看到的最后一个公式是结构化的 S V M SVM SVM,它最大化了正确类别的分数与排名第二的最高分数的错误类别的分数之间的差距。理解这些公式之间的差异超出了本课程的范围。这些笔记中提出的版本是在实践中使用的稳妥选择,但可以说最简单的 O V A OVA OVA策略可能也有同样的效果(里金等人 2004 2004 2004年在《捍卫一对多分类》( p d f pdf pdf中也提出了这一观点)。

Softmax分类器

事实证明, S V M SVM SVM是两个常见的分类器之一。另一个流行的选择是** S o f t m a x Softmax Softmax分类器**,它具有不同的损失函数。如果你以前听说过二分类逻辑回归分类器,那么 S o f t m a x Softmax Softmax分类器就是它对多个类别的泛化。不像 S V M SVM SVM将输出 f ( x i , W ) f(x_i,W) f(xi,W)作为每个类别(未校准且可能难以解释)的分数, S o f t m a x Softmax Softmax分类器给出了稍微更直观的输出(归一化的类别概率),并且还有一个概率解释,我们稍后将进行描述。在 S o f t m a x Softmax Softmax分类器中,映射函数 f ( x i ; W ) = W x i f(x_i;W)=Wx_i f(xi;W)=Wxi保持不变,但我们现在将这些分数解释为每个类别的未归一化对数概率,并将铰链损失替换为交叉熵损失,如下所示:
L i = − log ⁡ ( e f y i ∑ j e f j ) or equivalently L i = − f y i + log ⁡ ∑ j e f j L_i = -\log\left(\frac{e^{f_{y_i}}}{ \sum_j e^{f_j} }\right) \hspace{0.5in} \text{or equivalently} \hspace{0.5in} L_i = -f_{y_i} + \log\sum_j e^{f_j} Li=log(jefjefyi)or equivalentlyLi=fyi+logjefj
这里我们使用符号 f j f_j fj来表示类别分数 f f f向量的第 j j j个元素。和之前一样,数据集的完整损失是所有训练样本 L i L_i Li的均值加上正则项 R ( W ) R(W) R(W)。函数 f j ( z ) = e z j ∑ k e z k f_j(z) = \frac{e^{z_j}}{\sum_k e^{z_k}} fj(z)=kezkezj称为 s o f t m a x softmax softmax函数:它接受一个任意实值分数的向量( z z z),并将其压缩为一个值介于 0 0 0 1 1 1之间的向量,其和为 1 1 1。如果你第一次看到涉及 s o f t m a x softmax softmax函数的完整交叉熵损失,可能会觉得可怕,但它相对容易理解。

信息论观点。一个“真实”分布 p p p和估计分布 q q q之间的交叉熵定义为:
H ( p , q ) = − ∑ x p ( x ) log ⁡ q ( x ) H(p,q) = - \sum_x p(x) \log q(x) H(p,q)=xp(x)logq(x)
因此, S o f t m a x Softmax Softmax分类器是最小化估计分类概率(如上所示, q = e f y i / ∑ j e f j q = e^{f_{y_i}} / \sum_j e^{f_j} q=efyi/jefj)和“真实”分布之间的交叉熵,在这种解释中,“真实”分布是所有概率质量都在正确的类上的分布(即 p = [ 0 , … 1 , … , 0 ] p=[0,…1,…,0] p=[0,1,,0]在第 i i i个位置包含一个 1 1 1)。此外,由于交叉熵可以写成熵和 K u l l b a c k − L e i b l e r Kullback-Leibler KullbackLeibler散度的形式: H ( p , q ) = H ( p ) + D K L ( p ∣ ∣ q ) H(p,q)=H(p)+D_{KL}(p||q) H(p,q)=H(p)+DKL(p∣∣q),以及 d e l t a delta delta函数 p p p的熵为零,这也等价于最小化两个分布之间的 K L KL KL散度(距离的度量)。换句话说,交叉熵目标希望预测分布的所有质量都集中在正确的答案上。

概率解释。看看这个表达式,我们看到
P ( y i ∣ x i ; W ) = e f y i ∑ j e f j P(y_i \mid x_i; W) = \frac{e^{f_{y_i}}}{\sum_j e^{f_j} } P(yixi;W)=jefjefyi
可以解释为给定图像 x i x_i xi并由 W W W参数化时分配给正确标签 y i y_i yi的(归一化)概率。为了看到这一点,请记住, S o f t m a x Softmax Softmax分类器将输出向量 f f f中的分数解释为未归一化的对数概率。因此,对这些量取幂就得到了(未归一化的)概率,而除法执行了归一化,使概率的和为 1 1 1。因此,在概率解释中,我们最小化正确类别的负对数可能性,这可以解释为执行最大似然估计 M L E MLE MLE)。该观点的一个很好的特点是,我们现在还可以将整个损失函数中的正则化项 R ( W ) R(W) R(W)解释为来自权重矩阵 W W W上的高斯先验,其中,我们执行的是最大后验 M A P MAP MAP)估计,而不是 M L E MLE MLE。我们提到这些解释是为了帮助你的直觉,但这种推导的完整细节超出了本课的范围。

实际问题:数值稳定性。当你编写实际计算 S o f t m a x Softmax Softmax函数的代码时,中间项 e f y i e^{f_{y_i}} efyi Σ j e f j \Sigma_je^{f_j} Σjefj由于指数的存在,可能非常大。大数相除在数值上可能是不稳定的,因此使用归一化技巧很重要。请注意,如果我们将分数的上下分别乘以一个常数 C C C,并将其代入求和中,我们将得到以下(数学上等效的)表达式:
e f y i ∑ j e f j = C e f y i C ∑ j e f j = e f y i + log ⁡ C ∑ j e f j + log ⁡ C \frac{e^{f_{y_i}}}{\sum_j e^{f_j}} = \frac{Ce^{f_{y_i}}}{C\sum_j e^{f_j}} = \frac{e^{f_{y_i} + \log C}}{\sum_j e^{f_j + \log C}} jefjefyi=CjefjCefyi=jefj+logCefyi+logC
我们可以自由选择 C C C的值。这不会改变任何结果,但我们可以使用这个值来提高计算的数值稳定性。 C C C的一个常见选择是设置 log ⁡ C = − max ⁡ j f j \log C = -\max_j f_j logC=maxjfj。简单来说,我们应该将值移动到向量 f f f的内部,使最大值为 0 0 0。代码:

f = np.array([123, 456, 789]) # example with 3 classes and each having large scores
p = np.exp(f) / np.sum(np.exp(f)) # Bad: Numeric problem, potential blowup

# instead: first shift the values of f so that the highest number is 0:
f -= np.max(f) # f becomes [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # safe to do, gives the correct answer

可能会混淆的命名约定。准确地说, S V M SVM SVM分类器使用铰链损失,有时也称为最大间距损失 S o f t m a x Softmax Softmax分类器使用交叉熵损失 S o f t m a x Softmax Softmax分类器得名于 S o f t m a x Softmax Softmax函数,该函数用于将原始的类别分数压缩为归一化的正值,使其之和为 1 1 1,以便应用交叉熵损失。特别是,请注意,从技术上讲,谈论“ s o f t m a x softmax softmax损失”是没有意义的,因为 s o f t m a x softmax softmax只是一个压缩函数,但它是一个相对常用的缩写。

SVM对比Softmax

下面的图片可能有助于阐明 S o f t m a x Softmax Softmax S V M SVM SVM分类器之间的区别:


svmvssoftmax

S V M SVM SVM S o f t m a x Softmax Softmax分类器在一个数据点上的差异示例。在这两种情况下,我们计算相同的分数向量 f f f(例如本节中的矩阵乘法)。区别在于对 f f f中的分数的解释: S V M SVM SVM将这些解释为类别分数,其损失函数鼓励正确的类别(类别 2 2 2,蓝色)的分数比其他类别分数高一些。 S o f t m a x Softmax Softmax分类器将每个类别的分数解释为(未归一化)对数概率,然后鼓励正确类别的(归一化)对数概率较高(相当于它的负概率较低)。在这个例子中, S V M SVM SVM的最终损失值是 1.58 1.58 1.58,而 S o f t m a x Softmax Softmax分类器的最终损失值是 1.04 1.04 1.04(注意,对于自然对数,这是 1.04 1.04 1.04,而不是以 2 2 2 10 10 10为底),但请注意,这些数字是不可比较的;只有在与相同分类器和相同数据下计算的损失相关联时,它们才有意义。


S o f t m a x Softmax Softmax分类器为每个类别提供“概率”。与 S V M SVM SVM计算未校准且不易解释的所有类别分数不同, S o f t m a x Softmax Softmax分类器允许我们计算所有标签的“概率”。例如,给定一个图像, S V M SVM SVM分类器可能会给出“猫”、“狗”和“船”的分数 [ 12.5 , 0.6 , − 23.0 ] [12.5,0.6,-23.0] [12.5,0.6,23.0] s o f t m a x softmax softmax分类器可以计算三个标签的概率为 [ 0.9 , 0.09 , 0.01 ] [0.9,0.09,0.01] [0.9,0.09,0.01],这允许你解释它在每个类别中的置信度。然而,我们将“概率”一词放在引号内的原因是,这些概率的峰值或分散程度直接取决于正则化强度 λ \lambda λ——你负责将其作为系统的输入。例如,假设三个类别的非标准化对数概率为 [ 1 , − 2 , 0 ] [1,-2,0] [1,2,0] s o f t m a x softmax softmax函数将计算:
[ 1 , − 2 , 0 ] → [ e 1 , e − 2 , e 0 ] = [ 2.71 , 0.14 , 1 ] → [ 0.7 , 0.04 , 0.26 ] [1, -2, 0] \rightarrow [e^1, e^{-2}, e^0] = [2.71, 0.14, 1] \rightarrow [0.7, 0.04, 0.26] [1,2,0][e1,e2,e0]=[2.71,0.14,1][0.7,0.04,0.26]
所采取的步骤是取幂并归一化,使总和为 1 1 1。现在,如果正则化强度 λ \lambda λ更高,权重 W W W将受到更多的惩罚,这将导致较小的权重。例如,假设权重变小了一半( [ 0.5 , − 1 , 0 ] [0.5,- 1,0] [0.5,1,0])。 s o f t m a x softmax softmax现在会计算:

[ 0.5 , − 1 , 0 ] → [ e 0.5 , e − 1 , e 0 ] = [ 1.65 , 0.37 , 1 ] → [ 0.55 , 0.12 , 0.33 ] [0.5, -1, 0] \rightarrow [e^{0.5}, e^{-1}, e^0] = [1.65, 0.37, 1] \rightarrow [0.55, 0.12, 0.33] [0.5,1,0][e0.5,e1,e0]=[1.65,0.37,1][0.55,0.12,0.33]
这里的概率变得更分散了。此外,在由于非常强的正则化强度 λ \lambda λ而使权重趋向于小数字的极限中,输出概率将接近均匀。因此, S o f t m a x Softmax Softmax分类器计算的概率最好被认为是置信度,与 S V M SVM SVM类似,分数的顺序是可以解释的,但绝对数字(或它们的差异)在技术上是不可解释的。

在实践中, S V M SVM SVM S o f t m a x Softmax Softmax通常是可比较的 S V M SVM SVM S o f t m a x Softmax Softmax之间的性能差异通常很小,不同的人会对哪个分类器更好有不同的看法。与 S o f t m a x Softmax Softmax分类器相比, S V M SVM SVM是一个更局部的目标,它可以被认为是一个漏洞或特征。考虑一个得分为 [ 10 , 2 , 3 ] [10,2,3] [10,2,3]的例子,其中第一个分类是正确的。 S V M SVM SVM(例如,期望间隔 Δ = 1 \Delta=1 Δ=1)将看到正确的类别与其他类别相比已经具有高于间距的分数,并且它将计算损失为零。 S V M SVM SVM不关心个体分数的细节:如果它们是 [ 10 , − 100 , − 100 ] [10,-100,-100] [10,100,100] [ 10 , 9 , 9 ] [10,9,9] [10,9,9] S V M SVM SVM将同等对待,因为满足间距 1 1 1,因此损失为零。然而,这些场景在 S o f t m a x Softmax Softmax分类器中并不等同,后者对分数 [ 10 , 9 , 9 ] [10,9,9] [10,9,9]的累积损失要比 [ 10 , − 100 , − 100 ] [10,-100,-100] [10,100,100]的损失高得多。换句话说, S o f t m a x Softmax Softmax分类器永远不会对它产生的分数完全满意:正确的类别总是会有更高的概率,错误的类别总是会有更低的概率,损失总是会变得更好。然而,一旦边界满足, S V M SVM SVM就会很满意,并且它不会对超出此约束的准确分数进行微观管理。这可以直观地认为是一个特征:例如,一个汽车分类器可能将大部分“精力”花在区分汽车和卡车的困难问题上,它不应该受到青蛙示例的影响,它已经给青蛙示例分配了非常低的分数,并且这些示例可能围绕在数据云的完全不同的一侧。

交互式网页演示


classifydemo

我们编写了一个交互式网页演示程序,以帮助你直观地使用线性分类器。该演示使用二维数据上的简单3路分类将本节中讨论的损失函数可视化。该演示程序还会稍微提前执行优化,我们将在下一节中详细讨论。


总结

总之,

  • 我们定义了一个从图像像素到类别分数的评分函数(在本节中,一个依赖于权重 W W W和偏置 b b b的线性函数)。

  • 与kNN分类器不同,这种参数化方法的优势在于,一旦我们学习了参数,我们就可以丢弃训练数据。此外,对新测试图像的预测是快速的,因为它只需要与 W W W进行单个矩阵乘法,而不是与每个训练示例进行详尽的比较。

  • 我们介绍了偏置技巧,它允许我们将偏置向量折叠到权重矩阵中,以便只需要跟踪一个参数矩阵。

  • 我们定义了一个损失函数(我们介绍了线性分类器常用的两种损失函数: S V M SVM SVM S o f t m a x Softmax Softmax),它衡量了给定参数集与训练数据集中真实标签的兼容性。我们还看到,损失函数的定义方式是这样的,即对训练数据进行良好的预测等同于损失较小。

现在,我们看到了一种获取图像数据集并根据一组参数将每个图像映射到类别分数的方法,我们还看到了两个损失函数的例子,我们可以使用它们来衡量预测的质量。但是我们如何有效地确定提供最佳(最低)损失的参数?这个过程就是优化,这是下一节的主题。

进一步阅读

这些阅读是可选的,包含感兴趣点。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值