从图像到标签分值的映射
一个线性映射:
其中,参数 为权重(weights), 称为偏差向量(bias vector)
一个将图像映射到分类分值的例子:
-
为了便于可视化,假设图像只有4个像素值,有3个分类。
-
首先将图像像素拉伸为一个列向量,与 进行矩阵乘,再加上偏置项 ,得到各个分类的分值。
-
需要注意的是,由于权值没有训练到位,猫分类的分值非常低。
多类 SVM 分类器
针对第 个数据的 类 SVM 的损失函数定义如下:
使用多类 SVM 分类时,正确分类的分数需要比其他不正确的分类分数高出 边界值 delta()。其他分类分数进入了红色的区域时,就开始计算损失。在红色区域之前,损失值为0。
SVM 评分函数中,将输出 作为第 个数据针对第 个类别的得分,所以分类损失的详细定义为:
加上正则化项:
其中:
-
函数,它常被称为 折叶损失(hinge loss)。有时候会听到人们使用 平方折叶损失SVM(即 L2-SVM),它使用的是 ,将更强烈(平方地而不是线性地)地惩罚过界的边界值。可以通过交叉验证来决定到底使用哪个。
-
在绝大多数情况下设置 都是安全的。超参数 和 一起控制损失函数中的数据损失(data loss)和正则化损失(regularization loss)之间的权衡。
-
不同分类分值之间的边界的具体值(比如 或 )从某些角度来看是没意义的,因为权重自己就可以控制差异变大和缩小。也就是说,真正的权衡是我们允许权重能够变大到何种程度,通过正则化强度 来控制,详见:正则化方法 。
Softmax 分类器
Softmax 分类器可以理解为 逻辑回归分类器 面对多个分类的一般化归纳,输出归一化的分类概率。
在Softmax分类器中,函数映射 保持不变,但将这些评分值视为每个分类的未归一化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。公式如下:
或等价的:
其中:
-
使用 来表示分类评分向量 中的第 个元素。
-
函数 被称作 softmax 函数,其输入值是一个向量,向量中元素为任意实数的评分值( 中的),函数对其进行压缩,输出一个向量,其中每个元素值在 0 到 1 之间,且所有元素之和为 1。
对数的基本性质:
- 函数拆分:
- log() vs log() :
图中,蓝线为 ln() ,黑线为 ln()
数值归一化:
-
编程实现 softmax 函数计算的时候,中间项 和 因为存在指数函数,所以数值可能非常大。
-
除以大数值可能导致数值计算的不稳定,所以使用归一化非常重要。如果在分式的分子和分母都乘以一个常数 ,并把它变换到求和之中,就能得到一个从数学上等价的公式:
- 代码实现如下:
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)。
对分类分值的不同解释:
-
针对一个数据点,两个分类器都计算了同样的分值向量
-
SVM分类器将 看做是分类评分,它的损失函数鼓励正确的分类(本例中是蓝色的类别2)的分值比其他分类的分值高出至少一个边界值。
-
Softmax分类器将 看做是每个分类没有归一化的对数概率,鼓励正确分类的归一化的对数概率变高,其余的变低。
-
SVM的最终的损失值是 1.58,Softmax 的最终的损失值是 0.452,但要注意这两个数值没有可比性。只在给定同样数据,在同样的分类器的损失值计算中,它们才有意义。
在实际使用中,SVM 和 Softmax 经常是相似的:
-
通常说来,两种分类器的表现差别很小。
-
相对于 Softmax 分类器,SVM 更加局部目标化(local objective),这既可以看做是一个特性,也可以看做是一个劣势。
-
SVM 对于各个分类的得分细节并不关心:分数是 或者 ,对于 SVM 来说没什么不同,只要分差超过边界值,那么损失值就等于 0,不会超过限制去细微地操作具体分数。
-
对于 softmax 分类器,情况则不同。对于 来说,计算出的损失值就远远高于 的。换句话来说,softmax 分类器对于分数是永远不会满意的。