分类评分函数 score function

从图像到标签分值的映射

一个线性映射:

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

其中,参数 WW 为权重(weights),bb 称为偏差向量(bias vector)

一个将图像映射到分类分值的例子:

  • 为了便于可视化,假设图像只有4个像素值,有3个分类。

  • 首先将图像像素拉伸为一个列向量,与 WW 进行矩阵乘,再加上偏置项 bb,得到各个分类的分值。

  • 需要注意的是,由于权值没有训练到位,猫分类的分值非常低。

多类 SVM 分类器

针对第 ii 个数据的 jj 类 SVM 的损失函数定义如下:

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

使用多类 SVM 分类时,正确分类的分数需要比其他不正确的分类分数高出 边界值 deltaΔ\Delta)。其他分类分数进入了红色的区域时,就开始计算损失。在红色区域之前,损失值为0。

SVM 评分函数中,将输出 sj=f(xi,W)js_j=f(x_i,W)_j 作为第 ii 个数据针对第 jj 个类别的得分,所以分类损失的详细定义为:

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

加上正则化项:

L=1Nij̸=yi[max(0,f(xi;W)jf(xi;W)yi+Δ)]+λklWk,l2L=\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}

其中:

  • max(0,)max(0,-) 函数,它常被称为 折叶损失(hinge loss)。有时候会听到人们使用 平方折叶损失SVM(即 L2-SVM),它使用的是 max(0,)2max(0,-)^2,将更强烈(平方地而不是线性地)地惩罚过界的边界值。可以通过交叉验证来决定到底使用哪个。

  • 在绝大多数情况下设置 Δ=1.0\Delta=1.0 都是安全的。超参数 Δ\Deltaλ\lambda 一起控制损失函数中的数据损失(data loss)和正则化损失(regularization loss)之间的权衡。

  • 不同分类分值之间的边界的具体值(比如 Δ=1\Delta=1Δ=100\Delta=100)从某些角度来看是没意义的,因为权重自己就可以控制差异变大和缩小。也就是说,真正的权衡是我们允许权重能够变大到何种程度,通过正则化强度 λ\lambda 来控制,详见:正则化方法

Softmax 分类器

Softmax 分类器可以理解为 逻辑回归分类器 面对多个分类的一般化归纳,输出归一化的分类概率。

在Softmax分类器中,函数映射 f(xi;W)=Wxif(x_i;W)=Wx_i 保持不变,但将这些评分值视为每个分类的未归一化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。公式如下:

Li=log(efyijefj)L_i=-log(\frac{e^{f_{y_i}}}{\sum_je^{f_j}})

或等价的:

Li=fyi+log(jefj)L_i=-f_{y_i}+log(\sum_je^{f_j})

其中:

  • 使用 fjf_j 来表示分类评分向量 ff 中的第 jj 个元素。

  • 函数 fj(z)=ezjkezkf_j(z)=\frac{e^{z_j}}{\sum_ke^{z_k}} 被称作 softmax 函数,其输入值是一个向量,向量中元素为任意实数的评分值(zz 中的),函数对其进行压缩,输出一个向量,其中每个元素值在 0 到 1 之间,且所有元素之和为 1。

对数的基本性质:

  • 函数拆分:
    ln(ab)=ln(a)+ln(b)\ln(ab)=\ln(a)+\ln(b)
  • log(xx) vs log(1/x1/x) :
    log(x)=log(1/x)log(x) = -log(1/x)
    图中,蓝线为 ln(1/x1/x) ,黑线为 ln(xx)

数值归一化:

  • 编程实现 softmax 函数计算的时候,中间项 efyie^{f_{y_i}}jefj\sum_j e^{f_j} 因为存在指数函数,所以数值可能非常大。

  • 除以大数值可能导致数值计算的不稳定,所以使用归一化非常重要。如果在分式的分子和分母都乘以一个常数 CC,并把它变换到求和之中,就能得到一个从数学上等价的公式:

efyijefj=CefyiCjefj=efyi+logCjefj+logC\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}}

  • 代码实现如下:
f = np.array([123, 456, 789]) # 例子中有3个分类,每个评分的数值都很大
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 和 Softmax的比较

损失函数的不同:

  • SVM 分类器使用的是 折叶损失(hinge loss),有时候又被称为 最大边界损失(max-margin loss)

  • Softmax 分类器使用的是 交叉熵损失(corss-entropy loss)

对分类分值的不同解释:

  • 针对一个数据点,两个分类器都计算了同样的分值向量 ff

  • SVM分类器将 ff 看做是分类评分,它的损失函数鼓励正确的分类(本例中是蓝色的类别2)的分值比其他分类的分值高出至少一个边界值。

  • Softmax分类器将 ff 看做是每个分类没有归一化的对数概率,鼓励正确分类的归一化的对数概率变高,其余的变低。

  • SVM的最终的损失值是 1.58,Softmax 的最终的损失值是 0.452,但要注意这两个数值没有可比性。只在给定同样数据,在同样的分类器的损失值计算中,它们才有意义。

在实际使用中,SVM 和 Softmax 经常是相似的:

  • 通常说来,两种分类器的表现差别很小。

  • 相对于 Softmax 分类器,SVM 更加局部目标化(local objective),这既可以看做是一个特性,也可以看做是一个劣势。

  • SVM 对于各个分类的得分细节并不关心:分数是 [10,100,100][10, -100, -100] 或者 [10,9,9][10, 9, 9],对于 SVM 来说没什么不同,只要分差超过边界值,那么损失值就等于 0,不会超过限制去细微地操作具体分数。

  • 对于 softmax 分类器,情况则不同。对于 [10,9,9][10, 9, 9] 来说,计算出的损失值就远远高于 [10,100,100][10, -100, -100] 的。换句话来说,softmax 分类器对于分数是永远不会满意的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章