线性分类器-中篇

导读:

神经网络

反向传播算法

线性分类器-上篇

1

损失函数

在上一节定义了从图像像素值到所属类别的评分函数(score function),该函数的参数是权重矩阵。在函数中,数据是给定的,不能修改。但是我们可以调整权重矩阵这个参数,使得评分函数的结果与训练数据集中图像的真实类别一致,即评分函数在正确的分类的位置应当得到最高的评分(score)。

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

2

多类支持向量机损失

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

让我们更精确一些。回忆一下,第i个数据x[i]中包含图像的像素和代表正确类别的标签y[i]。评分函数输入像素数据,然后通过公式f(x[i], W)来计算不同分类类别的分值。这里我们将分值简写为s。比如,针对第j个类别的得分就是第j个元素:s[j] = f(x[i], W)[j]。针对第i个数据的多类SVM的损失函数定义如下:

举例

用一个例子演示公式是如何计算的。假设有3个分类,并且得到了分值s = [13, -7, 11]。其中第一个类别是正确类别,即y[i] = 0。同时假设delta是10(后面会详细介绍该超参数)。上面的公式是将所有不正确分类(j 不等于y[i])加起来,所以我们得到两个部分:

可以看到第一个部分结果是0,这是因为[-7-13+10]得到的是负数,经过函数处理后得到0。这一对类别分数和标签的损失值是0,这是因为正确分类的得分13与错误分类的得分-7的差为20,高于边界值10。而SVM只关心差距至少要大于10,更大的差值还是算作损失值为0。第二个部分计算[11-13+10]得到8。虽然正确分类的得分比不正确分类的得分要高(13>11),但是比10的边界值还是小了,分差只有2,这就是为什么损失值等于8。简而言之,SVM的损失函数想要正确分类类别的分数比不正确类别分数高,而且至少要高delta。如果不满足这点,就开始计算损失值。 那么在这次的模型中,我们面对的是线性评分函数(f(x[i], W) = W * x[i]),所以我们可以将损失函数的公式稍微改写一下:

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

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

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

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

3

正则化

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

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

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

将其展开完整公式是:

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

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

其中最好的性质就是对大数值权重进行惩罚,可以提升其泛化能力,因为这就意味着没有哪个维度能够独自对于整体分值有过大的影响。举个例子,假设输入向量x = [1,1,1,1],两个权重向量w[1] = [1, 0,0,0],w[2] =[0.25,0.25,0.25,0.25]。那么w[^T][1] *x = w[^T][2] = 1,两个权重向量都得到同样的内积,但是w[1]的L2惩罚是1.0,而w[2]的L2惩罚是0.25。因此,根据L2惩罚来看,w[2]更好,因为它的正则化损失更小。从直观上来看,这是因为w[2]的权重值更小且更分散。既然L2惩罚倾向于更小更分散的权重向量,这就会鼓励分类器最终将所有维度上的特征都用起来,而不是强烈依赖其中少数几个维度。在后面的课程中可以看到,这一效果将会提升分类器的泛化能力,并避免过拟合。

需要注意的是,和权重不同,偏差没有这样的效果,因为它们并不控制输入维度上的影响强度。因此通常只对权重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损失采取了一种特殊的方法,使得能够衡量对于训练数据预测分类和实际分类标签的一致性。还有,对训练集中数据做出准确分类预测和让损失值最小化这两件事是等价的。

4

实际考虑

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

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

其中,C是一个超参数,并且y[i] -->{-1, 1}。可以认为本章节介绍的SVM公式包含了上述公式,上述公式是多类支持向量机公式只有两个分类类别的特例。也就是说,如果我们要分类的类别只有两个,那么公式就化为二元SVM公式。这个公式中的C和多类SVM公式中的r都控制着同样的权衡,而且它们之间的关系是C与r成反比。

原文发布于微信公众号 - 机器学习算法与Python学习(guodongwei1991)

原文发表时间:2017-01-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习

机器学习、深度学习 知识点总结及面试题

一、反向传播思想: 1、计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,根据梯度方向更新权值。 (1)将训练集数据输入到ANN的输入层,经过隐...

3967
来自专栏人工智能

用PaddlePaddle和Tensorflow实现经典CNN网络GoogLeNet

前面讲了LeNet、AlexNet和Vgg,这周来讲讲GoogLeNet。GoogLeNet是由google的Christian Szegedy等人在2014年...

3279
来自专栏企鹅号快讯

模糊决策树算法FID3

Q A 用户 今天发布什么呢??? ? ? HHY 今天讲决策树算法哦,不同于清晰决策树,利用了模糊逻辑的模糊决策树算法哦! 模糊隶属度 ? (a)三角形隶属度...

4338
来自专栏IT派

最全的DNN概述论文:详解前馈、卷积和循环神经网络技术

本论文技术性地介绍了三种最常见的神经网络:前馈神经网络、卷积神经网络和循环神经网络。且该文详细介绍了每一种网络的基本构建块,其包括了基本架构、传播方式、连接方式...

3784
来自专栏大数据挖掘DT机器学习

机器学习、深度学习 知识点总结及面试题

1、反向传播思想: 计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,根据梯度方向更新权值。 (1)将训练集数据输入到ANN的输入层,经过隐藏...

1K8
来自专栏专知

【干货】对于回归问题,我们该怎样选择合适的机器学习算法

本文分别介绍:线性回归和多项式回归、神经网络、决策树和决策森林,并分别列出了其各自优缺点,相信有助于指导我们在特定工作中选择合适的算法。

4577
来自专栏机器学习算法工程师

【随笔记录】1*1卷积核的作用

之前只是知道1x1的卷积核用在Inception模块中具有降维的作用,并没有认真的思考它是怎么样实现降维的,以及它还有哪些作用。于是查阅了一些资料,并记录了它...

1805
来自专栏计算机视觉战队

每日一学——线性分类笔记(中)

损失函数 Loss function 在上一节定义了从图像像素值到所属类别的评分函数(score function),该函数的参数是权重矩阵 ? 。在函数中,...

3035
来自专栏人工智能头条

从CNN视角看在自然语言处理上的应用

3463
来自专栏计算机视觉战队

CNN的全面解析(带你简单轻松入门)

亲爱的关注者您好!真的是好久不见,上次与您相见还是8月18日的晚上,不知道35天的时间不见,你们都有了哪些成果?有了哪些成就?有了哪些offer?但是,本平台的...

3347

扫码关注云+社区

领取腾讯云代金券