专栏首页李智的专栏斯坦福CS231n - CNN for Visual Recognition(2)-lecture3(上)线性分类器、损失函数

斯坦福CS231n - CNN for Visual Recognition(2)-lecture3(上)线性分类器、损失函数

本节主要讲了线性分类器(svm和softmax),损失函数以及最优化(梯度下降)的问题

线性分类

  由于之前KNN分类器的缺点,让我们很自然地去寻找有更加强大地方法去完成图像分类任务,这种方法主要有两部分组成: 评分函数(score function),它是原始图像数据到类别分值的映射(f(x)=Wxf(x)=Wx)。 损失函数(loss function),它是用来量化预测分类标签的得分与真实标签之间一致性的。   这种方法其实最后可以转化成一个最优化问题,在最优化过程中,将通过更新评分函数的参数来最小化损失函数值。

1 评分函数

   评分函数,就是从图像到标签分值的参数化映射。举例来说,在CIFAR-10中,我们有一个N=50000的训练集,每个图像有D=32x32x3=3072个像素,而K=10,这是因为图片被分为10个不同的类别(狗,猫,汽车等)。我们现在定义评分函数为:f:RD→RKf:R^D\to R^K,该函数是原始图像像素到分类分值的映射。 线性分类器   一个线性映射:

f(xi,W,b)=Wxi+b

\displaystyle f(x_i,W,b)=Wx_i+b   在上式中,假设每个图像数据都被拉长为一个长度为D的列向量,大小为[D x 1]。其中大小为[K x D]的矩阵W和大小为[K x 1]列向量b为该函数的参数(parameters)。以CIFAR-10为例,将图像拉成[3072 x 1]的列向量,W为[10x3072],b为[10x1]。f(xi,W,b)f(x_i,W,b)输出为[10 x 1]的列向量(10个数字对应不同分类的分值)。 其中,参数W被称为权重(weights)。b被称为偏差向量(bias vector)。

补充说明:

  • 通过矩阵乘法WxiWx_i能并行地评估10个不同的分类器(每个分类器对应一个分类),其中每个类的分类器就是W的一个行向量。
  • 参数W和b是可控制改变的。我们的目标就是通过设置这些参数,使得计算出来的分类分值情况和训练集中图像数据的真实类别标签相符。
  • 该方法通过训练数据学习参数W和b,当训练完成,时训练数据可丢弃,留下学习到的参数即可。
  • 分类时只需要做一个矩阵乘法和一个矩阵加法就能对一个测试数据分类。

  上面例子中,原始像素点向量xi经过W和b映射为对应结果类别的得分f(xi,W,b)=Wxi+bf(xi,W,b)=Wxi+b。不过上面这组参数是不太恰当的,图片是猫,但是狗狗分最高,这样就很自然地引出参数优化问题了。

线性分类器另一种理解:将线性分类器看做模板匹配:关于权重W的另一个解释是它的每一行对应着一个分类的模板(有时候也叫作原型)。一张图像对应不同分类的得分,是通过使用内积(也叫点积)来比较图像和模板,然后找到和哪个模板最相似。

偏差和权重的合并技巧:它能够将我们常用的参数和合二为一。回忆一下,分类评分函数定义为:

f(xi,W,b)=Wxi+b

\displaystyle f(x_i,W,b)=Wx_i+b

  分开处理这两个参数(权重参数和偏差参数)有点笨拙,一般常用的方法是把两个参数放到同一个矩阵中,同时向量就要增加一个维度,这个维度的数值是常量1,这就是默认的偏差维度。这样新的公式就简化成下面这样:

f(xi,W,b)=Wxi

\displaystyle f(x_i,W,b)=Wx_i

  还是以CIFAR-10为例,那么的大小就变成[3073x1],而不是[3072x1]了,多出了包含常量1的1个维度。W大小就是[10x3073]了。中多出来的这一列对应的就是偏差值,具体见下图:

图像数据预处理:在机器学习中,对于输入的特征做归一化(normalization)处理是常见的套路。而在图像分类的例子中,图像上的每个像素可以看做一个特征。在实践中,对每个特征减去平均值来中心化数据是非常重要的。在这些图片的例子中,该步骤意味着根据训练集中所有的图像计算出一个平均图像值,然后每个图像都减去这个平均值,这样图像的像素值就大约分布在[-127, 127]之间了。下一个常见步骤是,让所有数值分布的区间变为[-1, 1]。零均值的中心化是很重要的。


2 损失函数

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

2.1 多类支持向量机(SVM)损失函数

  SVM的损失函数想要SVM在正确分类上的得分始终比不正确分类上的得分高出一个边界值Δ\Delta。 回忆一下,第i个数据中包含图像xix_i的像素和代表正确类别的标签yiy_i。评分函数输入像素数据,然后通过公式f(xi,W)f(x_i,W)来计算不同分类类别的分值。这里我们将分值简写为ss。比如,针对第j个类别的得分就是第j个元素:sj=f(xi,W)js_j=f(x_i,W)_j。针对第i个数据的多类SVM的损失函数定义如下:

Li=∑j≠yimax(0,sj−syi+Δ)

\displaystyle L_i=\sum_{j\not=y_i}max(0,s_j-s_{y_i}+\Delta)

  下面图片是一个具体地例子

  通过例子可以看出:SVM的损失函数想要正确分类类别yiy_i的分数比不正确类别分数高,而且至少要高Δ\Delta。如果不满足这点,就开始计算损失值。   考虑到我们现在面对的是线性评分函数(f(xi,W)=Wxif(x_i,W)=Wx_i),所以我们可以将损失函数的公式稍微改写一下(其中wjw_j是权重WW的第jj行):

Li=∑j≠yimax(0,wTjxi−wTyixi+Δ)

\displaystyle L_i=\sum_{j\not=y_i}max(0,w^T_jx_i-w^T_{y_i}x_i+\Delta)

  总的损失函数:

L=1N∑i=1N∑j≠yimax(0,wTjxi−wTyixi+Δ)

\displaystyle L=\frac{1}{N}\sum_{i=1}^N\sum_{j\not=y_i}max(0,w^T_jx_i-w^T_{y_i}x_i+\Delta)

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

2.1.1 正则化

引出:假设有一个数据集和一个权重集W能够正确地分类每个数据。问题在于这个W并不唯一:可能有很多相似的W都能正确地分类所有的数据。比如:如果W能够正确分类所有数据,即对于每个数据,损失值都是0。那么当时,任何数乘都能使得损失值为0,因为这个变化将所有分值的大小都均等地扩大了,所以它们之间的绝对差值也扩大了。

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

R(W)=∑k∑lW2k,l

R(W)=\sum\limits_k\sum_l W_{k,l}^2

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

L=1N∑iLi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=1N∑i∑j≠yi[max(0,f(xi;W)j−f(xi;W)yi+Δ)]+λ∑k∑lW2k,l

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

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

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

  要注意的是,和权重不同,偏差没有这样的效果,因为它们并不控制输入维度上的影响强度。因此实际中通常只对权重WW正则化,而不正则化偏差bb。

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

2.1.2 实际应用

设置Δ\Delta:该超参数在绝大多数情况下设为Δ=1.0\Delta=1.0是安全的。超参数Δ\Delta和λ\lambda看起来是两个不同的超参数,但实际上他们一起控制同一个权衡:即损失函数中的数据损失和正则化损失之间的权衡。这是因为权重WW的大小对于分类分值有直接影响(当然对他们的差异也有直接影响):当我们将WW中值缩小,分类分值之间的差异也变小,反之亦然。因此,不同分类分值之间的边界的具体值(比如Δ=1\Delta=1或Δ=100\Delta=100)从某些角度来看是没意义的,因为权重自己就可以控制差异变大和缩小。也就是说,真正的权衡是我们允许权重能够变大到何种程度(通过正则化强度来控制)。 其他多类SVM公式。需要指出的是,上面展示的多类SVM只是多种SVM公式中的一种。另一种常用的公式是One-Vs-All(OVA)SVM,它针对每个类和其他类训练一个独立的二元分类器。还有另一种更少用的叫做All-Vs-All(AVA)策略。

2.2 Softmax分类器

  Softmax分类器就可以理解为逻辑回归分类器面对多个分类的一般化归纳。SVM将输出f(xi,W)f(x_i,W)作为每个分类的评分(因为无定标,所以难以直接解释)。与SVM不同,Softmax的输出(归一化的分类概率)更加直观,并且从概率上可以解释。在Softmax分类器中,函数映射f(xi,W)=Wxif(x_i,W)=Wx_i保持不变,但将这些评分值视为每个分类的未归一化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。公式如下:

Li=−log⎛⎝⎜⎜efyi∑jefj⎞⎠⎟⎟或者Li=−fyi+log∑jefj

L_i = -\log\left(\frac{e^{f_{y_i}}}{ \sum\limits_j e^{f_j} }\right) \hspace{1in} \text{或者} \hspace{1in} L_i = -f_{y_i} + \log\sum\limits_j e^{f_j}   我们使用fjf_j来代表得分向量ff的第jj个元素值。和前面提到的一样,总体的损失也是LiL_i遍历训练集之后的均值,再加上正则化项R(W)R(W),而函数fj(z)=ezj∑kezkf_j(z) = \frac{e^{z_j}}{\sum\limits_k e^{z_k}}被称之为softmax函数信息论解释   在”真实“分布p和估计分布q之间的交叉熵定义如下:

H(p,q)=−∑xp(x)logq(x)

H(p,q) = - \sum_x p(x) \log q(x)   Softmax分类器所做的就是最小化估计分类概率(efyi/∑jefj e^{f_{y_i}} / \sum_j e^{f_j})和“真实“分布之间交叉熵。 概率论解释

P(yi∣xi;W)=efyi∑jefj

P(y_i \mid x_i; W) = \frac{e^{f_{y_i}}}{\sum_j e^{f_j} }

  其实可以看做给定图片数据xix_i和类别yiy_i以及参数WW之后的归一化概率。在概率的角度理解,我们在做的事情,就是最小化错误类别的负log似然概率,也可以理解为进行最大似然估计Maximum Likelihood Estimation (MLE)。这个理解角度还有一个好处,这个时候我们的正则化项R(W)R(W)有很好的解释性,可以理解为整个损失函数在权重矩阵WW上的一个高斯先验,所以其实这时候是在做一个最大后验估计Maximum a posteriori (MAP)。

数值稳定   编程实现softmax函数计算的时候,中间项efyie^{f_{y_i}} 和∑jefj\sum\limits_j e^{f_j}因为存在指数函数,所以数值可能非常大。除以大数值可能导致数值计算的不稳定,所以学会使用归一化技巧非常重要。如果在分式的分子和分母都乘以一个常数CC,并把它变换到求和之中,就能得到一个从数学上等价的公式:

efyi∑jefj=CefyiC∑jefj=efyi+logC∑jefj+logC

\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}}

CC的值可自由选择,不会影响计算结果,通过使用这个技巧可以提高计算中的数值稳定性。通常将CC设为logC=−maxjfjlogC=-max_jf_j。该技巧简单地说,就是应该将向量ff中的数值进行平移,使得最大值为0。


3 SVM与Softmax分类器比较

  两个分类器都计算了同样的分值向量ff。不同之处在于对ff中分值的解释:SVM分类器将它们看做是分类评分,它的损失函数鼓励正确的分类(本例中是蓝色的类别2)的分值比其他分类的分值高出至少一个边界值。Softmax分类器将这些数值看做是每个分类没有归一化的对数概率,鼓励正确分类的归一化的对数概率变高,其余的变低。SVM的最终的损失值是1.58,Softmax的最终的损失值是0.452。

  SVM分类器中,我们得到的类别得分,大小顺序表示着所属类别的排序,但是得分的绝对值大小并没有特别明显的物理含义。而Softmax分类器中,结果的绝对值大小表征属于该类别的概率。

  Softmax中拿到的概率,其实和正则化参数λ\lambda有很大的关系,因为λλ实际上在控制着WW的伸缩程度,所以也控制着最后得分,这会直接影响最后概率向量中概率的分散度,比如说某个λλ下,我们得到的得分和概率可能如下:

[1,−2,0]→[e1,e−2,e0]=[2.71,0.14,1]→[0.7,0.04,0.26]

[1,−2,0]→[e1,e−2,e0]=[2.71,0.14,1]→[0.7,0.04,0.26]   而我们加大λλ,提高其约束能力后,那么权重W就会被惩罚的更多,数值就会更小,这时分数也更小,假设变为一半:

[0.5,−1,0]→[e0.5,e−1,e0]=[1.65,0.37,1]→[0.55,0.12,0.33]

[0.5,−1,0]→[e0.5,e−1,e0]=[1.65,0.37,1]→[0.55,0.12,0.33]   现在看来,最后得到的结果概率分布更加分散了。

  在实际使用中,SVM和Softmax经常是相似的:通常说来,两种分类器的表现差别很小。   SVM更加“局部目标化(local objective)”,这既可以看做是一个特性,也可以看做是一个劣势。考虑一个评分是[10,−2,3][10, -2, 3]的数据,其中第一个分类是正确的,那么一个SVM(Δ=1\Delta=1)会看到正确分类相较于不正确分类,已经得到了比边界值还要高的分数,它就会认为损失值是0。SVM对于数字个体的细节是不关心的:如果分数是[10,−100,−100][10, -100, -100]或者[10,9,9][10, 9, 9],对于SVM来说没什么不同,只要满足超过边界值等于1,那么损失值就等于0。这可以被看做是SVM的一种特性。举例说来,一个汽车的分类器应该把他的大量精力放在如何分辨小轿车和大卡车上,而不应该纠结于如何与青蛙进行区分,因为区分青蛙得到的评分已经足够低了。   而对于softmax分类器,对于[10, 9, 9]来说,计算出的损失值就远远高于[10,−100,−100][10, -100, -100]的。换句话来说,softmax分类器对于分数是永远不会满意的:正确分类总能得到更高的可能性,错误分类总能得到更低的可能性,损失值总是能够更小。


参考资料

链接:http://cs231n.github.io/linear-classify/ 链接:https://zhuanlan.zhihu.com/p/20918580?refer=intelligentunit https://zhuanlan.zhihu.com/p/20945670?refer=intelligentunit https://zhuanlan.zhihu.com/p/21102293?refer=intelligentunit 链接:http://blog.csdn.net/han_xiaoyang/article/details/49999583

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 斯坦福CS231n - CNN for Visual Recognition(5)-lecture5激活函数、神经网络结构

      在线性分类中,我们使用s=Wxs=Wx计算类别的评分函数,其中WW为一个矩阵,xx为一个列向量,输出表示类别的评分向量。而在神经网络中,最常用的是s=W2m...

    李智
  • 斯坦福CS231n - CNN for Visual Recognition(3)-lecture3(下)最优化

      上节我们已经介绍了图像分类的两个关键部分:评分函数与损失函数,接下来就是最优化的问题了,即如何寻找使得损失函数值最小的WW。 对于SVM 得分函数:...

    李智
  • 斯坦福CS231n - CNN for Visual Recognition(6)-lecture5预处理、正则化、损失函数

    关于数据预处理我们有3种常用的方式,假设数据矩阵XX,假设其尺寸是[N,D][N ,D](NN是数据样本的数量,DD是数据的维度)。

    李智
  • Python函数基础知多少

    函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。Python中的函数在其他语言中也叫做过程或子例程,那么这些被...

    1846122963
  • 机器学习笔记——Logistic回归算法

    logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。

    阳光罗诺
  • C语言可重入函数和不可重入函数

      在函数中如果我们使用静态变量了,导致产生中断调用别的函数的 过程中可能还会调用这个函数,于是原来的 静态变量被在这里改变了,然后返回主体函数,用着的那个静态...

    心跳包
  • JavaScript 高阶函数快速入门 [每日前端夜话0x3A]

    之所以是高阶,是因为它并非字符串、数字或布尔值,而是从更高层次来操作函数。漂亮的元。

    疯狂的技术宅
  • 从underscore源码看如何实现map函数

    经常会看到这样的面试题,让面试者手动实现一个 map 函数之类的,嗯,貌似并没有什么实际意义。但是对于知识探索的步伐不能停止,现在就来分析下如何实现 map 函...

    桃翁
  • Java知识点总结

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

    大黄大黄大黄
  • java常用对象

    boolean b=Pattern.matches("(86)*0*1\\d{10}",mobile);//大陆手机号码的匹配 日期类 Date date =...

    用户1171305

扫码关注云+社区

领取腾讯云代金券