CS231n课程笔记二 SVM softmax

线性分类

在上一节我们介绍了图像分类和KNN但是他有很多缺点:分类器必须记住所有的训练数据并且存储下来以备未来的比较,这一块是非常低效的并且容易造成内存爆炸,计算效率低。
现在我们用一种更加有力的方式来做图像分类,然后我们将进一步展开神经网络和卷积神经网络的介绍,在这个部分我们有两个地方值得介绍,一个score function 一个loss function。我们将用score function的参数来最优化loss function 并以此来解决最优化问题。

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

该方法的第一个组成部分是定义将图像的像素值映射到每个类的置信度得分的分数函数。我们将以具体的例子开发这种方法。像以前一样,我们假设一个图像xi∈RDxi∈RD的训练数据集,每个都与标签yiyi相关联。这里i = 1 ... Ni = 1 ... N和yi∈1...Kyi∈1... K。也就是说,我们有N个例子(每个都有维度D)和K个不同的类别。例如,在CIFAR-10中,我们有一组训练集N = 50,000图像,每个D = 32 x 32 x 3 = 3072像素,K = 10,因为有10个不同的类(狗,猫,汽车等) )。我们现在将定义分数函数f:RD↦RKf:RD↦RK,将原始图像像素映射到类分数。
线性分类器,在这块我们将用最简单的函数来做:
$f(x_i,W,b)=Wx_i+b$
在上述等式中,我们假设图像$x_i$将其所有像素平坦化为单个[Vx]形列列向量。矩阵W(尺寸[K×D])和向量b(尺寸[K×1])是函数的参数。在CIFAR-10中,$x_i$将第i个图像中的所有像素均匀化为单个[3072×1]列,W为[10 x 3072],b为[10 x 1],因此3072个数字进入该函数原始像素值)和10个数字(类分数)。 W中的参数通常称为权重,b称为偏置向量,因为它影响输出分数,但不与实际数据$x_i$进行交互。但是,您经常会听到人们可以互换使用术语权重和参数。
首先$Wx_i$可以有效的评估十个类别的得分,每个都是W的一行;其次输入的数据是固定的,我们必须控制参数;在学习的时候我们需要用到train的set但是学完了之后就可以把训练集丢掉了;最后分类牵扯到矩阵的相乘和相加;

将图像映射到类分数的示例。为了可视化,我们假设图像只有4个像素(4个单色像素,我们在这个例子中不考虑色彩通道,以简洁),我们有3个类(红色(猫),绿色(狗),蓝色(船)班)。 (说明:这里的颜色特别简单地表示3个类,与RGB通道无关。)我们将图像像素拉伸成一列,并执行矩阵乘法以得到每个类的分数。请注意,这个特定的一组权重W不是很好:权重分配我们的猫图像是一个非常低的猫分数。特别是,这套重量似乎相信它正在看着一只狗。
图像类似于高维点。由于图像被拉伸成高维列向量,我们可以将每个图像解释为该空间中的单个点(例如,CIFAR-10中的每个图像是32×32×3像素的3072维空间中的点)。类似地,整个数据集是一个(标记)的点集合。

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

损失函数

在上一节中,我们定义了从像素值到类得分的函数,由一组权重WW参数化。此外,我们看到我们无法控制数据($x_i$,$y_i$)($x_i$,$y_i$)(它是固定的和给定的),但是我们确实控制了这些权重,我们想设置它们,使得预测课程分数与训练数据中的实地标签一致。
例如,回到猫的示例图像及其分类“猫”,“狗”和“船”的分数,我们看到这个例子中的特定权重集不是很好:我们喂在描绘一只猫的像素中,与其他类别(狗得分437.9和船分数61.95)相比,猫分数非常低(-96.8)。我们将用失败函数(有时也被称为成本函数或目标)来衡量我们对于不幸的结果。直观地说,如果我们在对培训数据进行分类工作方面做得不好,那么损失将会很高,如果我们做得很好,这将会很低。

## 多类支持向量机损失

有几种方法来定义损失函数的细节。作为第一个例子,我们将首先开发一种称为多类支持向量机(SVM)损失的常用损失。 SVM损失被设置为使得SVM“想要”每个图像的正确类别具有高于不正确类别的分数一定的固定边际Δ。请注意,如上所述,有时有助于拟合损失函数:SVM“想要”某种结果,意味着结果将产生较低的损失(这是好的)。现在我们来更准确回想一下,对于第i个例子,我们给出了图像xixi的像素和指定正确类的索引的标签yiyi。分数函数采用像素并计算类分数的向量f(xi,W)f(xi,W),我们将缩写为ss(缩写为分数)。
CS231n课程笔记二 SVM softmax_第1张图片
这里写图片描述

我们应该选择更小的权重这样使得过拟合的现象更加不明显,另一点很重要的是我们永远无法达到0损失,一般我们会给w加正则项而不会给b加。

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

实际应用

Delta的设定:Δ=1.0 实际上在任何情况下都是安全的设定,Δ与$\lambda$ 是两个不同的参数但是他们都控制同样的tradeoff,(正则损失和准确率的损失)。理解他的要点是W的量级对于score的效果有着直接的影响,当我们缩小W的时候,score也会降低,因此score的绝对值不重要,重要的是相对值。因此应该做差。

二元支持向量机,有以下的表达方法:
$L_i = C \max(0, 1 - y_i w^Tx_i) + R(W),y_i \in { -1,1 }$
此时有:$C \propto \frac{1}{\lambda}$

原始优化。如果你以前知道SVM来到这个课程,你可能还听说过内核,双重,SMO算法等。(和Neural Networks的情况一样),我们将一直与优化目标在其无约束的原始形式。这些目标中的许多在技术上是不可区分的(例如,max(x,y)函数不是因为当x = y时具有扭结),但实际上这不是问题,并且常见的是使用子梯形图。

多分类的支持向量机。值得提到的是本文提到的方式只是构造多分类的svm的一种方法,除此之外 one-vs-all也是一种常用方法,他是独立对各个类构造SVM。我们的构造遵循Weston和Watkins 1999版本,这是一个比OVA更强大的版本(在这个意义上,您可以构建多版本的数据集,其中该版本可以实现零数据丢失,但是OVA不能)。您可能会看到最后一个表达式是一个结构化SVM,它可以最大限度地提高正确类的得分和最高评分不正确的亚军类的得分。了解这些配方之间的差异超出了课堂的范围。这些说明中提供的版本是在实践中使用的一个安全的赌注,但可以说是最简单的OVA策略也可能会起作用(Rikin等人2004年“一维全部分类防御”

Softmax分类器

事实证明,SVM是两个常见的分类器之一。另一个受欢迎的选择是Softmax分类器,它具有不同的损耗函数。如果您以前听说过二进制逻辑回归分类器,那么Softmax分类器就是将它推广到多个类。不想SVM,softmax给了一些更加直观的输出液给了概率的输出。$f(x_i; W) = W x_i$是保持不变的,但是我们现在用了非标准化的log概率形式代替了之前的cross-entropy 的损失:
$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}$
从信息论的角度,熵表示真实的分布和估计分布:$H(p,q) = - \sum_x p(x) \log q(x)$而softmax就是最小化熵增,也就是最小化真实分布与估计分布。
从稳定性来看,由于加了一个指数分布,分子和分母都会非常大,所以这个相除就会很不稳定,因此要用标准化的技巧,所以我们就在上面乘上一个常数C并且把它加进去,我们可以自由的决定C的大小,所以我们可以用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}}$
在代码中:

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

确切地说,SVM分类器使用铰链损失,有时也称为最大余量损失。 Softmax分类器使用交叉熵损失。 Softmax分类器从softmax函数获取其名称,该函数用于将原始分数压缩为归一化的正值,总和为1,从而可以应用交叉熵损失。特别要注意的是,从技术上来说,谈论“softmax loss”是没有意义的,因为softmax只是压缩函数,但它是一个比较常用的简写。

二者不同

CS231n课程笔记二 SVM softmax_第2张图片
这里写图片描述

Softmax分类器为每个类提供“概率”。与计算未校准并且不容易解释所有类的分数的SVM不同,Softmax分类器允许我们计算所有标签的“概率”。例如,给定一个图像,SVM分类器可能给你的类“cat”,“dog”和“ship”的分数[12.5,0.6,-23.0]。 softmax分类器可以将三个标签的概率计算为[0.9,0.09,0.01],这使您能够解释其对每个类的信心。然而,我们将“概率”一词引入引号的原因是,这些概率的高峰或扩散性将直接取决于您作为系统输入的正则化强度λ。
SVM和softmax的差异一般很小,所以是可以做比较的。相比于softmax,SVM有一个更加local的目标函数,这是一个bug也是一个特点。

总结

  • 定义了一个score function,从pixel到scores
  • 不像knn,这种参数的方式是一丹我们学习了参数我们就可以丢弃掉训练数据
  • 介绍了bias 的trick
  • 我们定义了一个损失函数(我们为线性分类器引入了两个常用的损失:SVM和Softmax),它们测量给定参数集合与训练数据集中的地面真值标签的兼容性。我们还看到,损失函数的定义是对训练数据做出很好的预测,相当于损失小。

你可能感兴趣的:(CS231n课程笔记二 SVM softmax)