cs231n Lecture 3 线性分类笔记(二)

内容列表

  • 线性分类器简介
  • 线性评分函数
  • 阐明线性分类器
  • 损失函数
    • 多类SVM
    • Softmax分类器
    • SVM和Softmax的比较
  • 基于Web的可交互线性分类器原型
  • 小结

注:中文翻译出自知乎专栏“智能单元”,在其基础上增加了个人批注

损失函数 Loss function

在上一节定义了从图像像素值到所属类别的评分函数(score function),该函数的参数是权重矩阵***W***。在函数中,数据(xiyi)是给定的,不能修改。但是我们可以调整权重矩阵这个参数,使得评分函数的结果与训练数据集中图像的真实类别一致,即评分函数在正确的分类的位置应当得到最高的评分(score)。
批注:原文在这里用的是“are consistent with”,并不是“得到最高的评分”,我看了整集视频,没有任何一个地方明确地说是得分最高的表示最接近的类别,但是每一处都表现出,确实是得分最高的类别才是算法分类的类别)

回到之前那张猫的图像分类例子,它有针对“猫”,“狗”,“船”三个类别的分数。我们看到例子中权重值非常差,因为猫分类的得分非常低(-96.8),而狗(437.9)和船(61.95)比较高。我们将使用损失函数(Loss Function)(有时也叫代价函数Cost Function或目标函数Objective)来衡量我们对结果的不满意程度。直观地讲,当评分函数输出结果与真实结果之间差异越大,损失函数输出越大,反之越小。

多类支持向量机损失

Multiclass Support Vector Machine Loss

损失函数的具体形式多种多样。首先,介绍常用的多类支持向量机(SVM)损失函数。SVM的损失函数想要SVM在正确分类上的得分始终比不正确分类上的得分高出一个边界值 Δ \Delta Δ
。 我们可以把损失函数想象成一个人,这位SVM先生(或者女士)对于结果有自己的品位,如果某个结果能使得损失值更低,那么SVM就更加喜欢它。

让我们更精确一些。回忆一下,第i个数据中包含图像xi的像素和代表正确类别的标签yi。评分函数输入像素数据,然后通过公式
f ( x i , W ) f(x_i,W) f(xi,W)
来计算不同分类类别的分值。这里我们将分值简写为s。比如,针对第j个类别的得分就是第j个元素:
s j = f ( x i , W ) j s_j=f(x_i,W)_j sj=f(xi,W)j
。针对第i个数据的多类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+Δ)
批注:看原视频的时候,这个 sj 和 syj,越看越懵逼,其实很简单,syj是唯一的,它是对应分类目标在正确的类别下的打分,在Li的计算过程中,他是不变的,而sj是对应的其他的类别的打分,他是一个向量)

举例:用一个例子演示公式是如何计算的。假设有3个分类,并且得到了分值
s = [ 13 , − 7 , 11 ] s=[13,-7,11] s=[13,7,11]
,其中第一个类别是正确类别,即
y i = 0 y_i=0 yi=0
s y i = 13 s_{y_i}=13 syi=13
s j = [ − 7 , 11 ] s_j=[-7, 11] sj=[7,11]

。同时假设
Δ = 10 \Delta=10 Δ=10
(后面会详细介绍该超参数)。上面的公式是将所有不正确分类
j ̸ = y i j\not=y_i j̸=yi
加起来,所以我们得到两个部分:

L i = m a x ( 0 , − 7 − 13 + 10 ) + m a x ( 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)
批注:看到这里,我发现这个讲义和PPT不一致,视频中老师把这个Δ值叫做“安全边界”,它并不是我们常说的bias,视频中的安全边界取得是1,它是一个超参数,既然是超参数就是需要根据实际情况来进行调优的,调优的原理是啥,下面这一段做了讲解,这个值要怎么取,希望后面能讲解到,我们从上面的计算结果来看,安全边界的取值对是否有损失的影响很大。从SVM的原来来看,SVM是用一个超平面来分类,这个超平面距离每个分类都有一个边界,这两者是不是同一个东西?)

可以看到第一个部分结果是0,这是因为[-7-13+10]得到的是负数,经过max(0,-)函数处理后得到0。这一对类别分数和标签的损失值是0,这是因为正确分类的得分13与错误分类的得分-7的差为20,高于边界值10。而SVM只关心差距至少要大于10,更大的差值还是算作损失值为0。第二个部分计算[11-13+10]得到8。虽然正确分类的得分比不正确分类的得分要高(13>11),但是比10的边界值还是小了,分差只有2,这就是为什么损失值等于8。简而言之,SVM的损失函数想要正确分类类别 yi 的分数比不正确类别分数高,而且至少要高Δ (delta)。如果不满足这点,就开始计算损失值。

批注:这里,为什么明明打分预测是正确的,还要计算损失呢?仅仅是举个例子,还是说必须要这样?)

那么在这次的模型中,我们面对的是线性评分函数
f ( x i , W ) = W x i f(x_i,W)=Wx_i f(xi,W)=Wxi
,所以我们可以将损失函数的公式稍微改写一下:

L i = ∑ j ̸ = y i m a x ( 0 , w j T x i − w y i T x i + Δ ) L_i=\sum_{j\not=y_i}max(0,w^T_jx_i-w^T_{y_i}x_i+\Delta) Li=j̸=yimax(0,wjTxiwyiTxi+Δ)

其中 wj 是权重 W 的第j行,被转置为列向量。然而,一旦开始考虑更复杂的评分函数f公式,这样做就不是必须的了。

在结束这一小节前,还必须提一下的是关于阀值为0的函数:max(0,-),它常被称为折叶损失(hinge loss)。有时候会使用平方折叶损失SVM(即L2-SVM),它使用的是max(0, -)2,将更强烈(平方地而不是线性地)地惩罚过界的边界值(使损失的离散性增强)。不使用平方是更标准的版本,但是在某些数据集中,平方折叶损失会工作得更好。可以通过交叉验证来决定到底使用哪个。

我们对于预测训练集数据分类标签的情况总有一些不满意的,而损失函数就能将这些不满意的程度量化。


image

多类SVM希望正确类别的分类分数比其他不正确分类类别的分数要高,而且至少高出安全边界(delta)。如果其他分类分数进入了红色的区域,甚至更高,那么就开始计算损失。如果没有这些情况,损失值为0。我们的目标是找到一些权重,它们既能够让训练集中的数据样例满足这些限制,也能让总的损失值尽可能地低。

正则化(Regularization):上面损失函数有一个问题。假设有一个数据集和一个权重集W能够正确地分类每个数据(即所有的边界都满足,对于所有的i都有Li = 0)。问题在于这个***W***并不唯一:可能有很多相似的***W***都能正确地分类所有的数据。一个简单的例子:如果W能够正确分类所有数据,即对于每个数据,损失值都是0。那么当 λ > 1 时,任何数乘 λ***W*** 都能使得损失值为0,因为这个变化将所有分值的大小都均等地扩大了,所以它们之间的绝对差值也扩大了。举个例子,如果一个正确分类的分值和举例它最近的错误分类的分值的差距是15,对 W 乘以2将使得差距变成30。

换句话说,我们希望能向某些特定的权重 W 添加一些偏好,对其他权重则不添加,以此来消除模糊性。这一点是能够实现的,方法是向损失函数增加一个正则化惩罚(regularization penaltyR(W)部分。最常用的正则化惩罚是L2范式,L2范式通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重:
R ( W ) = ∑ k ∑ l W k , l 2 R(W)=\sum_k \sum_l W^2_{k,l} R(W)=klWk,l2

上面的表达式中,将 W 中所有元素平方后求和。注意正则化函数不是数据的函数,仅基于权重。包含正则化惩罚后,就能够给出完整的多类SVM损失函数了,它由两个部分组成:数据损失(data loss),即所有样例的的平均损失Li,以及正则化损失(regularization loss)。完整公式如下所示:

L = 1 N ∑ i L i ⎵ d a t a   l o s s + λ R ( W ) ⎵ r e g u l a r i z a t i o n   l o s s L=\underbrace{ \frac{1}{N}\sum_i L_i}_{data \ loss}+\underbrace{\lambda R(W)}_{regularization \ loss} L=data loss N1iLi+regularization loss λR(W)

将其展开完整公式是:

L = 1 N ∑ i ∑ j ̸ = y i [ m a x ( 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\not=y_i}[max(0,f(x_i;W)_j-f(x_i;W)_{y_i}+\Delta)]+\lambda \sum_k \sum_l W^2_{k,l} L=N1ij̸=yi[max(0,f(xi;W)jf(xi;W)yi+Δ)]+λklWk,l2

其中,N是训练集的数据量。现在正则化惩罚添加到了损失函数里面,并用超参数 λ 来计算其权重。该超参数无法简单确定,需要通过交叉验证来获取。

除了上述理由外,引入正则化惩罚还带来很多良好的性质,这些性质大多会在后续章节介绍。比如引入了L2惩罚后,SVM们就有了最大边界(max margin)这一良好性质。(如果感兴趣,可以查看CS229课程)。

其中最好的性质就是对大数值权重进行惩罚,可以提升其泛化能力,因为这就意味着没有哪个维度能够独自对于整体分值有过大的影响。

批注:是不是说用L2范式之后,大数就更大了?我只知道正则化是防止过拟合,而过拟合是因为样本的离散型导致的。原视频中,老师讲解的正则化的引入是把一个多项式的拟合曲线降幂,使之成为一个线性的拟合函数从而减小模型的复杂度。)

举个例子,假设输入向量
x = [ 1 , 1 , 1 , 1 ] x=[1,1,1,1] x=[1,1,1,1]
两个权重向量
w 1 = [ 1 , 0 , 0 , 0 ] w_1=[1,0,0,0] w1=[1,0,0,0]
w 2 = [ 0.25 , 0.25 , 0.25 , 0.25 ] w_2=[0.25,0.25,0.25,0.25] w2=[0.25,0.25,0.25,0.25]
那么

w 1 T x = w 2 T = 1 w^T_1x=w^T_2=1 w1Tx=w2T=1
两个权重向量都得到同样的内积,但是***W***1的L2惩罚是1.0,而***W***2的L2惩罚是0.25。因此,根据L2惩罚来看,W2更好,因为它的正则化损失更小。从直观上来看,这是因为***W***2的权重值更小且更分散。既然L2惩罚倾向于更小更分散的权重向量,这就会鼓励分类器最终将所有维度上的特征都用起来,而不是强烈依赖其中少数几个维度。在后面的课程中可以看到,这一效果将会提升分类器的泛化能力,并避免过拟合。

批注:关于这个例子。视频中有如下讲解:如果使用L1正则化,W1会好一些,如果使用L2范式,L2会好一点。但是老师没有延伸开将,只是说L1范式更关注的是稀疏解,它倾向于让大部分W元素接近0,即使少部分数据偏离于0较远也没关系,而L2考虑的是W的整体分布)

需要注意的是,和权重不同,偏
差没有这样的效果,因为它们并不控制输入维度上的影响强度。因此通常只对权重W正则化,而不正则化偏差b。在实际操作中,可发现这一操作的影响可忽略不计。最后,因为正则化惩罚的存在,不可能在所有的例子中得到0的损失值,这是因为只有当 W=0 的特殊情况下,才能得到损失值为0。

代码:下面是一个无正则化部分的损失函数的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 xrange(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

在本小节的学习中,一定要记得SVM损失采取了一种特殊的方法,使得能够衡量对于训练数据预测分类和实际分类标签的一致性。还有,对训练集中数据做出准确分类预测和让损失值最小化这两件事是等价的。

接下来要做的,就是找到能够使损失值最小化的权重了。

实际考虑

设置Delta:你可能注意到上面的内容对超参数 Δ 及其设置是一笔带过,那么它应该被设置成什么值?需要通过交叉验证来求得吗?现在看来,该超参数在绝大多数情况下设为 Δ =1.0 都是安全的。超参数 Δ 和 λ 看起来是两个不同的超参数,但实际上他们一起控制同一个权衡:即损失函数中的数据损失和正则化损失之间的权衡。理解这一点的关键是要知道,权重 W 的大小对于分类分值有直接影响(当然对他们的差异也有直接影响):当我们将 W 中值缩小,分类分值之间的差异也变小,反之亦然。因此,不同分类分值之间的边界的具体值(比如Δ=1或Δ=100)从某些角度来看是没意义的,因为权重自己就可以控制差异变大和缩小。也就是说,真正的权衡是我们允许权重能够变大到何种程度(通过正则化强度 λ 来控制)。

与二元支持向量机(Binary Support Vector Machine)的关系:在学习本课程前,你可能对于二元支持向量机有些经验,它对于第i个数据的损失计算公式是:

L i = C m a x ( 0 , 1 − y i w T x i ) + R ( W ) L_i=Cmax(0,1-y_iw^Tx_i)+R(W) Li=Cmax(0,1yiwTxi)+R(W)

其中,C是一个超参数,并且

y i ∈ { − 1 , 1 } y_i\in\{-1,1\} yi{1,1}
可以认为本章节介绍的SVM公式包含了上述公式,上述公式是多类支持向量机公式只有两个分类类别的特例。也就是说,如果我们要分类的类别只有两个,那么公式就化为二元SVM公式。这个公式中的C和多类SVM公式中的 λ 都控制着同样的权衡,而且它们之间的关系是

C ∝ 1 λ C\propto\frac{1}{\lambda} Cλ1
批注:正比关系)

备注:在初始形式中进行最优化。如果在本课程之前学习过SVM,那么对kernels,duals,SMO算法等将有所耳闻。在本课程(主要是神经网络相关)中,损失函数的最优化的始终在非限制初始形式下进行。很多这些损失函数从技术上来说是不可微的(比如当x=y时,max(x,y)函数就不可微分),但是在实际操作中并不存在问题,因为通常可以使用次梯度。

批注:这里就不是很明白了)

备注:其他多类SVM公式。需要指出的是,本课中展示的多类SVM只是多种SVM公式中的一种。另一种常用的公式是One-Vs-All(OVA)SVM,它针对每个类和其他类训练一个独立的二元分类器。还有另一种更少用的叫做All-Vs-All(AVA)策略。我们的公式是按照Weston and Watkins 1999 (pdf)版本,比OVA性能更强(在构建有一个多类数据集的情况下,这个版本可以在损失值上取到0,而OVA就不行。感兴趣的话在论文中查阅细节)。最后一个需要知道的公式是Structured SVM,它将正确分类的分类分值和非正确分类中的最高分值的边界最大化。理解这些公式的差异超出了本课程的范围。本课程笔记介绍的版本可以在实践中安全使用,而被论证为最简单的OVA策略在实践中看起来也能工作的同样出色(在 Rikin等人2004年的论文In Defense of One-Vs-All Classification (pdf)中可查)。

Softmax分类器

SVM是最常用的两个分类器之一,而另一个就是Softmax分类器,它的损失函数与SVM的损失函数不同。对于学习过二元逻辑回归分类器的读者来说,Softmax分类器就可以理解为逻辑回归分类器面对多个分类的一般化归纳。SVM将输出
f ( x i , W ) f(x_i,W) f(xi,W)
作为每个分类的评分(因为无定标,所以难以直接解释)。与SVM不同,Softmax的输出(归一化的分类概率)更加直观,并且从概率上可以解释,这一点后文会讨论。在Softmax分类器中,函数映射
f ( x i ; W ) = W x i f(x_i;W)=Wx_i f(xi;W)=Wxi
保持不变,但将这些评分值视为每个分类的未归一化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。公式如下:

L i = − l o g ( e f y i ∑ j e f j ) Li=-log(\frac{e^{f_{y_i}}}{\sum_je^{f_j}}) Li=log(jefjefyi)
或等价的
L i = − f y i + l o g ( ∑ j e f j ) L_i=-f_{y_i}+log(\sum_je^{f_j}) Li=fyi+log(jefj)

批注:关于log函数,一般文献里面直接写log有可能底数是2、10、e,从这个等价关系来看,这里的底是e,但是我在看视频时,发现使用的底数是10,是不是说这个交叉熵函数用什么底数都可以呢?)

在上式中,使用 fj 来表示分类评分向量 f 中的第 j 个元素。和之前一样,整个数据集的损失值是数据集中所有样本数据的损失值 Li 的均值与正则化损失***R***(W)之和。其中函数
f j ( z ) = e z j ∑ k e z k f_j(z)=\frac{e^{z_j}}{\sum_ke^{z_k}} fj(z)=kezkezj
被称作 softmax 函数:其输入值是一个向量,向量中元素为任意实数的评分值(z中的),函数对其进行压缩,输出一个向量,其中每个元素值在0到1之间,且所有元素之和为1。所以,包含softmax函数的完整交叉熵损失看起唬人,实际上还是比较容易理解的。

信息理论视角:在“真实”分布p和估计分布q之间的交叉熵定义如下:

H ( p , q ) = − ∑ x p ( x ) l o g q ( x ) H(p,q)=-\sum_xp(x) logq(x) H(p,q)=xp(x)logq(x)

因此,Softmax分类器所做的就是最小化在估计分类概率(就是上面的
e f y i ∑ j e f j \frac{e^{f_{y_i}}}{\sum_je^{f_j}} jefjefyi
)和“真实”分布之间的交叉熵,在这个解释中,“真实”分布就是所有概率密度都分布在正确的类别上(比如:p=[0,…1,…,0]中在 yi 的位置就有一个单独的1)。还有,既然交叉熵可以写成熵和相对熵(Kullback-Leibler divergence)
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(pq)
,并且delta函数p的熵是0,那么就能等价的看做是对两个分布之间的相对熵做最小化操作。换句话说,交叉熵损失函数“想要”预测分布的所有概率密度都在正确分类上。

译者注:Kullback-Leibler差异(Kullback-Leibler Divergence)也叫做相对熵(Relative Entropy),它衡量的是相同事件空间里的两个概率分布的差异情况。

概率论解释:先看下面的公式:

P ( y i ∣ x i , W ) = e f y i ∑ j e f j P(y_i|x_i,W)=\frac{e^{f_{y_i}}}{\sum_je^{f_j}} P(yixi,W)=jefjefyi

可以解释为是给定图像数据 xi ,以W为参数,分配给正确分类标签 yi 的归一化概率。为了理解这点,请回忆一下Softmax分类器将输出向量 f 中的评分值解释为没有归一化的对数概率。那么以这些数值做指数函数的幂就得到了没有归一化的概率,而除法操作则对数据进行了归一化处理,使得这些概率的和为1。从概率论的角度来理解,我们就是在最小化正确分类的负对数概率,这可以看做是在进行最大似然估计(MLE)。该解释的另一个好处是,损失函数中的正则化部分R(W)可以被看做是权重矩阵 W 的高斯先验,这里进行的是最大后验估计(MAP)而不是最大似然估计。提及这些解释只是为了让读者形成直观的印象,具体细节就超过本课程范围了。

批注:softmax函数的取值范围是0~1,而交叉熵损失函数的取值范围是0~正无穷,曲线是一个向下的单调函数,它其实是log函数的翻转)

实操事项:数值稳定。编程实现softmax函数计算的时候,中间项
e f y i e^{f_{y_i}} efyi

∑ j e f j \sum_j e^{f_j} jefj
因为存在指数函数,所以数值可能非常大。除以大数值可能导致数值计算的不稳定,所以学会使用归一化技巧非常重要。如果在分式的分子和分母都乘以一个常数C,并把它变换到求和之中,就能得到一个从数学上等价的公式
e f y i ∑ j e f j = C e f y i C ∑ j e f j = e f y i + l o g C ∑ j e f j + l o g C \frac{e^{f_{y_i}}}{\sum_je^{f_j}}=\frac{Ce^{f_{y_i}}}{C\sum_je^{f_j}}=\frac{e^{f_{y_i}+logC}}{\sum_je^{f_j+logC}} jefjefyi=CjefjCefyi=jefj+logCefyi+logC

C的值可自由选择,不会影响计算结果,通过使用这个技巧可以提高计算中的数值稳定性。通常将C设为
l o g C = − m a x j f j logC=-max_jf_j logC=maxjfj
。该技巧简单地说,就是应该将向量f中的数值进行平移,使得最大值为0。代码实现如下:

#例子中有3个分类,每个评分的数值都很大
f = np.array([123, 456, 789])
#不妙:数值问题,可能导致数值爆炸
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只是一个压缩数值的函数。但是在这个说法常常被用来做简称。

批注:下面这段代码是numpy写的一段计算交叉熵损失的例子)

np_s=np.array([3.2, 5.1, -1.7])
#np_s是通过W计算出的得分 array([ 3.2,  5.1, -1.7])

np_exp=np.exp(np_s)
#np_exp是指数化之后的结果 array([ 24.5325302 , 164.0219073 ,   0.18268352])

np_normal=np_exp/np.sum(np_exp)
#np_normal是归一化之后的结果 array([0.12998254, 0.86904954, 0.00096793])

np_loss=-np.log10(np_normal)
#np_loss array([0.88611498, 0.06095547, 3.01415795])

SVM和Softmax的比较

下图有助于区分这 Softmax和SVM这两种分类器:


image

针对一个数据点,SVM和Softmax分类器的不同处理方式的例子。两个分类器都计算了同样的分值向量f(本节中是通过矩阵乘来实现)。不同之处在于对f中分值的解释:SVM分类器将它们看做是分类评分,它的损失函数鼓励正确的分类(本例中是蓝色的类别2)的分值比其他分类的分值高出至少一个安全边界值。Softmax分类器将这些数值看做是每个分类没有归一化的对数概率,鼓励正确分类的归一化的对数概率变高,其余的变低。SVM的最终的损失值是1.58,Softmax的最终的损失值是1.04(这里的1.04是用自然对数e来计算的,2017年春季之后的课程用的是10为底数的对数,计算出来是0.452),但要注意这两个数值没有可比性。只在给定同样数据,在同样的分类器的损失值计算中,它们才有意义。

Softmax分类器为每个分类提供了“可能性”:SVM的计算是无标定的,而且难以针对所有分类的评分值给出直观解释。Softmax分类器则不同,它允许我们计算出对于所有分类标签的可能性。举个例子,针对给出的图像,SVM分类器可能给你的是一个[12.5, 0.6, -23.0]对应分类“猫”,“狗”,“船”。而softmax分类器可以计算出这三个标签的”可能性“是[0.9, 0.09, 0.01],这就让你能看出对于不同分类准确性的把握。为什么我们要在”可能性“上面打引号呢?这是因为可能性分布的集中或离散程度是由正则化参数λ直接决定的,λ是你能直接控制的一个输入参数。举个例子,假设3个分类的原始分数是[1, -2, 0],那么softmax函数就会计算:

[ 1 , − 2 , 0 ] → [ e 1 , e − 2 , e 0 ] = [ 2.71 , 0.14 , 1 ] → [ 0.7 , 0.04 , 0.26 ] [1,-2,0]\to[e^1,e^{-2},e^0]=[2.71,0.14,1]\to[0.7,0.04,0.26] [1,2,0][e1,e2,e0]=[2.71,0.14,1][0.7,0.04,0.26]

现在,如果正则化参数λ更大,那么权重W就会被惩罚的更多,然后他的权重数值就会更小。这样算出来的分数也会更小,假设小了一半吧[0.5, -1, 0],那么softmax函数的计算就是:

[ 0.5 , − 1 , 0 ] → [ e 0.5 , e − 1 , e 0 ] = [ 1.65 , 0.73 , 1 ] → [ 0.55 , 0.12 , 0.33 ] [0.5,-1,0]\to[e^{0.5},e^{-1},e^0]=[1.65,0.73,1]\to[0.55,0.12,0.33] [0.5,1,0][e0.5,e1,e0]=[1.65,0.73,1][0.55,0.12,0.33]
现在看起来,概率的分布就更加分散了。还有,随着正则化参数λ不断增强,权重数值会越来越小,最后输出的概率会接近于均匀分布。这就是说,softmax分类器算出来的概率最好是看成一种对于分类正确性的自信。和SVM一样,数字间相互比较得出的大小顺序是可以解释的,但其绝对值则难以直观解释。

批注:上面这个例子就表明了一个信息:正则化是直接作用于权重的,加入正则化之后所有的权重 W 会发生相应的变化)

在实际使用中,SVM和Softmax经常是相似的:通常说来,两种分类器的表现差别很小,不同的人对于哪个分类器更好有不同的看法。相对于Softmax分类器,SVM更加“局部目标化(local objective)”,这既可以看做是一个特性,也可以看做是一个劣势。考虑一个评分是[10, -2, 3]的数据,其中第一个分类是正确的。那么一个SVM(Δ = 1)会看到正确分类相较于不正确分类,已经得到了比边界值还要高的分数,它就会认为损失值是0。SVM对于数字个体的细节是不关心的:如果分数是[10, -100, -100]或者[10, 9, 9],对于SVM来说没设么不同,只要满足超过边界值等于1,那么损失值就等于0

对于softmax分类器,情况则不同。对于[10, 9, 9]来说,计算出的损失值就远远高于[10, -100, -100]的。换句话来说,softmax分类器对于分数是永远不会满意的:正确分类总能得到更高的可能性,错误分类总能得到更低的可能性,损失值总是能够更小。但是,SVM只要边界值被满足了就满意了,不会超过限制去细微地操作具体分数。这可以被看做是SVM的一种特性。举例说来,一个汽车的分类器应该把他的大量精力放在如何分辨小轿车和大卡车上,而不应该纠结于如何与青蛙进行区分,因为区分青蛙得到的评分已经足够低了。

交互式的网页Demo

image

我们实现了一个交互式的网页原型,来帮助读者直观地理解线性分类器。原型将损失函数进行可视化,画面表现的是对于2维数据的3种类别的分类。原型在课程进度上稍微超前,展现了最优化的内容,最优化将在下一节课讨论。


小结

总结如下:

  • 定义了从图像像素映射到不同类别的分类评分的评分函数。在本节中,评分函数是一个基于权重 W 和偏差 b 的线性函数。
  • 与kNN分类器不同,参数方法的优势在于一旦通过训练学习到了参数,就可以将训练数据丢弃了。同时该方法对于新的测试数据的预测非常快,因为只需要与权重 W 进行一个矩阵乘法运算。
  • 介绍了偏差技巧,让我们能够将偏差向量和权重矩阵合二为一,然后就可以只跟踪一个矩阵。
  • 定义了损失函数(介绍了SVM和Softmax线性分类器最常用的2个损失函数)。损失函数能够衡量给出的参数集与训练集数据真实类别情况之间的一致性。在损失函数的定义中可以看到,对训练集数据做出良好预测与得到一个足够低的损失值这两件事是等价的。

现在我们知道了如何基于参数,将数据集中的图像映射成为分类的评分,也知道了两种不同的损失函数,它们都能用来衡量算法分类预测的质量。但是,如何高效地得到能够使损失值最小的参数呢?这个求得最优参数的过程被称为最优化,将在下节课中进行介绍。

拓展阅读

下面的内容读者可根据兴趣选择性阅读。

Deep Learning using Linear Support Vector Machines
一文的作者是Tang Charlie,论文写于2013年,展示了一些L2SVM比Softmax表现更出色的结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值