本节主要讲了线性分类器(svm和softmax),损失函数以及最优化(梯度下降)的问题
由于之前KNN分类器的缺点,让我们很自然地去寻找有更加强大地方法去完成图像分类任务,这种方法主要有两部分组成:
评分函数(score function),它是原始图像数据到类别分值的映射( f(x)=Wx )。
损失函数(loss function),它是用来量化预测分类标签的得分与真实标签之间一致性的。
这种方法其实最后可以转化成一个最优化问题,在最优化过程中,将通过更新评分函数的参数来最小化损失函数值。
评分函数,就是从图像到标签分值的参数化映射。举例来说,在CIFAR-10中,我们有一个N=50000的训练集,每个图像有D=32x32x3=3072个像素,而K=10,这是因为图片被分为10个不同的类别(狗,猫,汽车等)。我们现在定义评分函数为: f:RD→RK ,该函数是原始图像像素到分类分值的映射。
线性分类器
一个线性映射:
补充说明:
上面例子中,原始像素点向量xi经过W和b映射为对应结果类别的得分 f(xi,W,b)=Wxi+b 。不过上面这组参数是不太恰当的,图片是猫,但是狗狗分最高,这样就很自然地引出参数优化问题了。
线性分类器另一种理解:将线性分类器看做模板匹配:关于权重W的另一个解释是它的每一行对应着一个分类的模板(有时候也叫作原型)。一张图像对应不同分类的得分,是通过使用内积(也叫点积)来比较图像和模板,然后找到和哪个模板最相似。
偏差和权重的合并技巧:它能够将我们常用的参数和合二为一。回忆一下,分类评分函数定义为:
分开处理这两个参数(权重参数和偏差参数)有点笨拙,一般常用的方法是把两个参数放到同一个矩阵中,同时向量就要增加一个维度,这个维度的数值是常量1,这就是默认的偏差维度。这样新的公式就简化成下面这样:
还是以CIFAR-10为例,那么的大小就变成[3073x1],而不是[3072x1]了,多出了包含常量1的1个维度。W大小就是[10x3073]了。中多出来的这一列对应的就是偏差值,具体见下图:
图像数据预处理:在机器学习中,对于输入的特征做归一化(normalization)处理是常见的套路。而在图像分类的例子中,图像上的每个像素可以看做一个特征。在实践中,对每个特征减去平均值来中心化数据是非常重要的。在这些图片的例子中,该步骤意味着根据训练集中所有的图像计算出一个平均图像值,然后每个图像都减去这个平均值,这样图像的像素值就大约分布在[-127, 127]之间了。下一个常见步骤是,让所有数值分布的区间变为[-1, 1]。零均值的中心化是很重要的。
回到之前那张猫的图像分类例子,它有针对“猫”,“狗”,“船”三个类别的分数。我们看到例子中权重值非常差,因为猫分类的得分非常低(-96.8),而狗(437.9)和船(61.95)比较高。我们将使用损失函数(Loss Function)(有时也叫代价函数Cost Function或目标函数Objective)来衡量我们对结果的不满意程度。直观地讲,当评分函数输出结果与真实结果之间差异越大,损失函数输出越大,反之越小。
SVM的损失函数想要SVM在正确分类上的得分始终比不正确分类上的得分高出一个边界值 Δ 。
回忆一下,第i个数据中包含图像 xi 的像素和代表正确类别的标签 yi 。评分函数输入像素数据,然后通过公式 f(xi,W) 来计算不同分类类别的分值。这里我们将分值简写为 s 。比如,针对第j个类别的得分就是第j个元素: sj=f(xi,W)j 。针对第i个数据的多类SVM的损失函数定义如下:
下面图片是一个具体地例子
通过例子可以看出:SVM的损失函数想要正确分类类别 yi 的分数比不正确类别分数高,而且至少要高 Δ 。如果不满足这点,就开始计算损失值。
考虑到我们现在面对的是线性评分函数( f(xi,W)=Wxi ),所以我们可以将损失函数的公式稍微改写一下(其中 wj 是权重 W 的第 j 行):
总的损失函数:
折叶损失(hinge loss):这是一个关于0的阀值: max(0,−) 。有时候会听到人们使用平方折叶损失SVM(即L2-SVM),它使用的是 max(0,−)2 ,将更强烈(平方地而不是线性地)地惩罚过界的边界值。不使用平方是更标准的版本,但是在某些数据集中,平方折叶损失会工作得更好。可以通过交叉验证来决定到底使用哪个。
2.1.1 正则化
引出:假设有一个数据集和一个权重集W能够正确地分类每个数据。问题在于这个W并不唯一:可能有很多相似的W都能正确地分类所有的数据。比如:如果W能够正确分类所有数据,即对于每个数据,损失值都是0。那么当时,任何数乘都能使得损失值为0,因为这个变化将所有分值的大小都均等地扩大了,所以它们之间的绝对差值也扩大了。
我们希望能向某些特定的权重W添加一些偏好,对其他权重则不添加,以此来消除模糊性。这一点是能够实现的,方法是向损失函数增加一个正则化惩罚(regularization penalty) R(W) 部分。最常用的正则化惩罚是L2范式,L2范式通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重:
上面的表达式中,将所有元素平方后求和。注意正则化函数不是数据的函数,仅基于权重。包含正则化惩罚后,就能够给出完整的多类SVM损失函数了,它由两个部分组成:数据损失(data loss),即所有样例的的平均损失,以及正则化损失(regularization loss)。完整公式如下所示:
也可以展开,得到更具体的完整形式:
其中,N是训练集的数据量。现在正则化惩罚添加到了损失函数里面,并用超参数 λ 来计算其权重。该超参数无法简单确定,需要通过交叉验证来获取。
引入正则化惩罚最好的性质就是对大数值权重进行惩罚,可以提升其泛化能力,避免过拟合。因为这就意味着没有哪个维度能够独自对于整体分值有过大的影响。
举个例子,假设输入向量 x=[1,1,1,1] ,两个权重向量 w1=[1,0,0,0],w2=[0.25,0.25,0.25,0.25] ,那么 wT1x=wT2x=1 ,两个权重向量都得到同样的内积,但是 w1 的L2惩罚是1.0,而 w2 的L2惩罚是0.25。因此,根据L2惩罚来看, w2 更好,因为它的正则化损失更小。从直观上来看,这是因为的权重值更小且更分散。既然L2惩罚倾向于更小更分散的权重向量,这就会鼓励分类器最终将所有维度上的特征都用起来,而不是强烈依赖其中少数几个维度。
要注意的是,和权重不同,偏差没有这样的效果,因为它们并不控制输入维度上的影响强度。因此实际中通常只对权重 W 正则化,而不正则化偏差 b 。
接下来要做的,就是找到能够使损失值最小化的权重了。
2.1.2 实际应用
设置 Δ :该超参数在绝大多数情况下设为 Δ=1.0 是安全的。超参数 Δ 和 λ 看起来是两个不同的超参数,但实际上他们一起控制同一个权衡:即损失函数中的数据损失和正则化损失之间的权衡。这是因为权重 W 的大小对于分类分值有直接影响(当然对他们的差异也有直接影响):当我们将 W 中值缩小,分类分值之间的差异也变小,反之亦然。因此,不同分类分值之间的边界的具体值(比如 Δ=1 或 Δ=100 )从某些角度来看是没意义的,因为权重自己就可以控制差异变大和缩小。也就是说,真正的权衡是我们允许权重能够变大到何种程度(通过正则化强度来控制)。
其他多类SVM公式。需要指出的是,上面展示的多类SVM只是多种SVM公式中的一种。另一种常用的公式是One-Vs-All(OVA)SVM,它针对每个类和其他类训练一个独立的二元分类器。还有另一种更少用的叫做All-Vs-All(AVA)策略。
Softmax分类器就可以理解为逻辑回归分类器面对多个分类的一般化归纳。SVM将输出 f(xi,W) 作为每个分类的评分(因为无定标,所以难以直接解释)。与SVM不同,Softmax的输出(归一化的分类概率)更加直观,并且从概率上可以解释。在Softmax分类器中,函数映射 f(xi,W)=Wxi 保持不变,但将这些评分值视为每个分类的未归一化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。公式如下:
其实可以看做给定图片数据 xi 和类别 yi 以及参数 W 之后的归一化概率。在概率的角度理解,我们在做的事情,就是最小化错误类别的负log似然概率,也可以理解为进行最大似然估计Maximum Likelihood Estimation (MLE)。这个理解角度还有一个好处,这个时候我们的正则化项 R(W) 有很好的解释性,可以理解为整个损失函数在权重矩阵 W 上的一个高斯先验,所以其实这时候是在做一个最大后验估计Maximum a posteriori (MAP)。
数值稳定
编程实现softmax函数计算的时候,中间项 efyi 和 ∑jefj 因为存在指数函数,所以数值可能非常大。除以大数值可能导致数值计算的不稳定,所以学会使用归一化技巧非常重要。如果在分式的分子和分母都乘以一个常数 C ,并把它变换到求和之中,就能得到一个从数学上等价的公式:
C 的值可自由选择,不会影响计算结果,通过使用这个技巧可以提高计算中的数值稳定性。通常将 C 设为 logC=−maxjfj 。该技巧简单地说,就是应该将向量 f 中的数值进行平移,使得最大值为0。
两个分类器都计算了同样的分值向量 f 。不同之处在于对 f 中分值的解释:SVM分类器将它们看做是分类评分,它的损失函数鼓励正确的分类(本例中是蓝色的类别2)的分值比其他分类的分值高出至少一个边界值。Softmax分类器将这些数值看做是每个分类没有归一化的对数概率,鼓励正确分类的归一化的对数概率变高,其余的变低。SVM的最终的损失值是1.58,Softmax的最终的损失值是0.452。
SVM分类器中,我们得到的类别得分,大小顺序表示着所属类别的排序,但是得分的绝对值大小并没有特别明显的物理含义。而Softmax分类器中,结果的绝对值大小表征属于该类别的概率。
Softmax中拿到的概率,其实和正则化参数 λ 有很大的关系,因为 λ 实际上在控制着 W 的伸缩程度,所以也控制着最后得分,这会直接影响最后概率向量中概率的分散度,比如说某个 λ 下,我们得到的得分和概率可能如下:
在实际使用中,SVM和Softmax经常是相似的:通常说来,两种分类器的表现差别很小。
SVM更加“局部目标化(local objective)”,这既可以看做是一个特性,也可以看做是一个劣势。考虑一个评分是 [10,−2,3] 的数据,其中第一个分类是正确的,那么一个SVM( Δ=1 )会看到正确分类相较于不正确分类,已经得到了比边界值还要高的分数,它就会认为损失值是0。SVM对于数字个体的细节是不关心的:如果分数是 [10,−100,−100] 或者 [10,9,9] ,对于SVM来说没什么不同,只要满足超过边界值等于1,那么损失值就等于0。这可以被看做是SVM的一种特性。举例说来,一个汽车的分类器应该把他的大量精力放在如何分辨小轿车和大卡车上,而不应该纠结于如何与青蛙进行区分,因为区分青蛙得到的评分已经足够低了。
而对于softmax分类器,对于[10, 9, 9]来说,计算出的损失值就远远高于 [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