评分(score)函数:原始的图像数据到类别分值的映射
损失(loss)函数:量化预测分类标签的得分与真实类别之间一致性
这两个函数将配合实现最优化, 训练出最优的参数:
即在最优化过程中,将通过更新评分函数的参数来最小化损失函数值。
线性分类器
f(xi,W,b)=Wxi+b
f
(
x
i
,
W
,
b
)
=
W
x
i
+
b
线性函数
在编程的时候可以将b加入到W中,然后输入X最后加一行值为1的即可将公式中b简化。
即
f(xi,W,b)=Wxi
f
(
x
i
,
W
,
b
)
=
W
x
i
如下图
多类支持向量机损失Multiclass Support Vector Machine Loss
SVM的损失函数,要SVM在正确分类上的得分始终比不正确的分类上的得分高出一个边界值
△
△
实例
已知,3个分类,评分结果为s = [13,-7,11],即第一个类别为正确的,即 yi=0 y i = 0 ,同时假设 △=10 △= 10
Li=max(0,−7−13+10)+max(0,11−13+10)=8 L i = m a x ( 0 , − 7 − 13 + 10 ) + m a x ( 0 , 11 − 13 + 10 ) = 8
第一部分结果是0,因为正确分类的得分13与错误的得分-7的差为20,高于边界值10。
第二部分结果是8,因为正确分类的得分13与错误的得分11的差为2,小于边界值10,需要计算损失值。
SVM只关心差距至少要大于10,否则就要计算损失值。
折叶损失函数(hinge loss): max(0,−) m a x ( 0 , − )
平方折叶损失SVM(L2-SVM): max(0,−)2 m a x ( 0 , − ) 2
平方后会更强烈的惩罚过界的边界值。
可以通过交叉验证集来决定到底使用哪个。
正则化
之前的loss function 有一个问题,假设有一个数据集和一个权重集W能够正确的分类每个数据(即所有的边界都满足,对于所有的i都有
Li=0
L
i
=
0
)。问题在于W并不唯一:可能很多相似的W都能正确的分类所有的数据。
例子:
如果W能够正确的分类所有数据,即对于每个数据,损失值都是0。那么当
λ
λ
>1时,任何数乘
λW
λ
W
都能使得损失值为0,因为这个变化将所有分值的大小都均等地扩大了,所以它们之间的绝对差值也扩大了。比如一个正确分类的分值和举例它最近的错误分类的分值的差距是15,对W乘以2将使得差距变成30。
我们希望能向某些特定的权重W添加偏好,对其他不添加,以此来消除模糊性。
方法就是向损失函数增加一个正则化惩罚(Regularition Penalty)
R(W)
R
(
W
)
部分。
最常用的
R(W)
R
(
W
)
是L2范式,L2范式通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重:
R(W)=∑k∑lW2k,l
R
(
W
)
=
∑
k
∑
l
W
k
,
l
2
(将所有元素平方后求和)
比如[1,2,3,4]
R(W)
R
(
W
)
= 1 + 4+ 9 +16 = 40
完整的SVM损失函数:数据损失,即
Li
L
i
+ 正则化损失
L=1N∑iLi+λR(W)
L
=
1
N
∑
i
L
i
+
λ
R
(
W
)
展开为:
L=1N∑i∑j≠yimax(0,sj−syi+△)+∑k∑lW2k,l
L
=
1
N
∑
i
∑
j
≠
y
i
m
a
x
(
0
,
s
j
−
s
y
i
+
△
)
+
∑
k
∑
l
W
k
,
l
2
其中λ需要加交叉验证来获取。
引入正则化惩罚最好的性质,就是对大数值权重进行惩罚,可以提升其泛化能力。
假设输入向量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=wT2=1 w 1 T x = w 2 T = 1 ,两个权重向量都得到同样的内积,但是 w1 w 1 的L2惩罚是1.0,而 w2 w 2 的L2惩罚是0.25。因此,根据L2惩罚来看, w2 w 2 更好,因为它的正则化损失更小。
从直观上来看,这是因为 w2 w 2 的权重值更小且更分散。既然L2惩罚倾向于更小更分散的权重向量,这就会鼓励分类器最终将所有维度上的特征都用起来,而不是强烈依赖其中少数几个维度。在后面的课程中可以看到,这一效果将会提升分类器的泛化能力,并避免过拟合。
注意:偏差没有这样的效果,因此只对权重正则化,不对b正则化。
对训练集数据做出准确分类预测和损失最小化是等价的!!!
实际考虑
△
△
如何设置?
该超参数在绝大多数情况下设为都是安全的。超参数
Δ
Δ
和
λ
λ
看起来是两个不同的超参数,但实际上他们一起控制同一个权衡:即损失函数中的数据损失和正则化损失之间的权衡。
理解这一点的关键是要知道,权重W的大小对于分类分值有直接影响(当然对他们的差异也有直接影响):当我们将W中值缩小,分类分值之间的差异也变小,反之亦然。因此,不同分类分值之间的边界的具体值(比如
Δ=1
Δ
=
1
或
Δ=100
Δ
=
100
)从某些角度来看是没意义的,因为权重自己就可以控制差异变大和缩小。也就是说,真正的权衡是我们允许权重能够变大到何种程度(通过正则化强度
λ
λ
来控制)。
二元支持向量机(Binary Support Vector Machine)的关系:
对于第 i 个数据损失计算公式是:
Li=Cmax(0,1−yiwTxi)+R(W)
L
i
=
C
m
a
x
(
0
,
1
−
y
i
w
T
x
i
)
+
R
(
W
)
其中C是一个超参数,并且
yi
y
i
∈{-1,1}。
上述公式是多类支持向量机公式只有两个分类类别的特例。也就是说,如果我们要分类的类别只有两个,那么公式就化为二元SVM公式。这个公式中的C和多类SVM公式中的\lambda都控制着同样的权衡,而且它们之间的关系是
C∝1λ
C
∝
1
λ
(
∝
∝
表示成正比)
Softmax分类器
SVM和softmax时最常用的两个分类器之一,它的损失函数与SVM损失函数不同。将折叶损失替换为交叉熵损失。公式为:
Li=−log(efyj∑jefj)
L
i
=
−
l
o
g
(
e
f
y
j
∑
j
e
f
j
)
或等价函的
Li=−fyi+log(∑jefj)
L
i
=
−
f
y
i
+
l
o
g
(
∑
j
e
f
j
)
使用
fj
f
j
表示分类评分向量
f
f
中的第个元素。和之前一样,整个数据集的损失值是数据集中所有样本数据的损失值
Li
L
i
的均值与正则化损失R(W)之和。其中函数
fj(z)=ezj∑kezk
f
j
(
z
)
=
e
z
j
∑
k
e
z
k
称为Softmax函数:其输出值是一个向量,向量中元素为任意实数的评分值,函数对其进行压缩,输出一个向量,其中每个元素值在0-1之间,且所有元素之和为1。
实际操作:需要数值稳定
编程实现softmax计算的时候,中间项
efyi
e
f
y
i
和
∑jefj
∑
j
e
f
j
因为存在指数函数,可能数值很大。除以大数值可能导致数值计算的不稳定,所以学会使用归一化技巧非常重要。如果在分式的分子和分母都乘以一个常数C,可得到一个等价公式:
efyi∑jefj=CefyiC∑jefj=efyi+logC∑jefj+logC
e
f
y
i
∑
j
e
f
j
=
C
e
f
y
i
C
∑
j
e
f
j
=
e
f
y
i
+
l
o
g
C
∑
j
e
f
j
+
l
o
g
C
C可以自由选择,不会影响计算结果。通常设为
logC=−maxfj
l
o
g
C
=
−
m
a
x
f
j
简单说就是将
f
f
的数值进行平移,使得最大值为0。
命名规则
SVM使用的是折叶损失(hinge loss),有时候又称为最大边界损失(max-margin loss)
softmax使用的是交叉熵损失(cross-entropy loss):softmax函数将原始分类评分变成正的归一化数值,所有数值为1,这样处理后交叉熵损失才能应用。
注意:从技术上说,softmax损失是没有意义的,因为是一个压缩数值的函数。
SVM和Softmax比较
对于相同值的,输入进SVM和Softmax,解读是不同的:
SVM将它看做分类评分,损失函数鼓励正确的分类的分值(蓝色的类别2)比其他分值高出至少一个边界值。
Softmax分类器将这些数值看做是每个分类没有归一化的对数概率,鼓励正确分类的归一化的对数变高,其余的变低。
SVM的最终损失值是1.58,Softmax的最终损失值是0.452,注意这两个数值没有可比性。
Softmax为每个分类提供了可能性:
SVM的计算是无标定的,而且难以针对所有分类的评分值给出直观解释。Softmax分类器则不同,它允许我们计算出对于所有分类标签的可能性。
示例:
对应分类{“猫”,“狗”,”船”}
SVM可能评分结果为[12.5,0.6,-23.0]
Softmax分类器可以计算出这三个标签的“可能性”是[0.9,0.09,0.01],可以看出对于不同分类准确性的把握
但是有一点需要注意,Softmax的可能性分布的集中或离散程度是由正则化参数λ直接决定的,λ是你能直接控制的一个输入参数。
示例
假设3个分类的原始分数是[1, -2, 0],那么softmax函数就会计算:
[1,-2,0] —> [ e1,e−2,e0 e 1 , e − 2 , e 0 ] = [2.71,0.14,1] –>[0.7,0.04,0.26]
现在,如果正则化参数λ更大,那么权重W就会被惩罚的更多,然后他的权重数值就会更小。这样算出来的分数也会更小,假设小了一半吧[0.5, -1, 0],那么softmax函数的计算就是:
[0.5,-1,0] –>[ e0.5,e−1,e0 e 0 .5 , e − 1 , e 0 ] = [1.65,0.73,1] –>[0.55,0.12,0.33]
现在看起来,概率的分布就更加分散了。
还有,随着正则化参数λ不断增强,权重数值会越来越小,最后输出的概率会接近于均匀分布。这就是说,softmax分类器算出来的概率最好是看成一种对于分类正确性的自信。和SVM一样,数字间相互比较得出的大小顺序是可以解释的,但其绝对值则难以直观解释。
实际使用中,SVM和Softmax经常是相似的:
通常说来,两种分类器的表现差别很小,不同的人对于哪个分类器更好有不同的看法。相对于Softmax分类器,SVM更加“局部目标化(local objective)”,这既可以看做是一个特性,也可以看做是一个劣势。
比如一个评分是[10, -2, 3]的数据,其中第一个分类是正确的。那么一个SVM(\Delta =1)会看到正确分类相较于不正确分类,已经得到了比边界值还要高的分数,它就会认为损失值是0。SVM对于数字个体的细节是不关心的:如果分数是[10, -100, -100]或者[10, 9, 9],对于SVM来说没设么不同,只要满足超过边界值等于1,那么损失值就等于0。
对于softmax分类器,情况则不同。对于[10, 9, 9]来说,计算出的损失值就远远高于[10, -100, -100]的。换句话来说,softmax分类器对于分数是永远不会满意的:正确分类总能得到更高的可能性,错误分类总能得到更低的可能性,损失值总是能够更小。
但是,SVM只要边界值被满足了就满意了,不会超过限制去细微地操作具体分数。这可以被看做是SVM的一种特性。举例说来,一个汽车的分类器应该把他的大量精力放在如何分辨小轿车和大卡车上,而不应该纠结于如何与青蛙进行区分,因为区分青蛙得到的评分已经足够低了。
总结
●定义了从图像像素映射到不同类别的分类评分的评分函数。在本节中,评分函数是一个基于权重W和偏差b的线性函数。
●与kNN分类器不同,参数方法的优势在于一旦通过训练学习到了参数,就可以将训练数据丢弃了。同时该方法对于新的测试数据的预测非常快,因为只需要与权重W进行一个矩阵乘法运算。
●定义了损失函数(介绍了SVM和Softmax线性分类器最常用的2个损失函数)。损失函数能够衡量给出的参数集与训练集数据真实类别情况之间的一致性。在损失函数的定义中可以看到,对训练集数据做出良好预测与得到一个足够低的损失值这两件事是等价的。
现在我们知道了如何基于参数,将数据集中的图像映射成为分类的评分,也知道了两种不同的损失函数,它们都能用来衡量算法分类预测的质量。但是,如何高效地得到能够使损失值最小的参数呢?