多分类svm损失
损失函数: Li=∑j≠yimax(0,sj−syi+Δ) 解释: SVM想要正确分类的分数syi比不正确分类的分数sj至少要高Δ。 举例来说:假设通过分类我们得到一个分数向量,s=[13,−7,11],正确的分类是第一个, Δ 是10,那么损失等于: Li=max(0,−7−13+10)+max(0,11−13+10) 第二个分类的损失是0,因为[-7 - 13 + 10]=-10<0,正确的分类13得分比不正确的分类得分-7要高20,大于10,因此损失是0. 第三个分类的损失是8,因为[11 - 13 + 10]=8>0,正确的分类13得分比不正确的分类得分11要高2,小于10,因此损失是8. 也就是说,SVM想要正确分类的分数syi比不正确分类的分数sj至少要高Δ。

Multiclass SVM 想要正确分类的分数syi比不正确分类的分数sj至少要高Δ。如果某一类的得分落在红色区域,或者是大于正确分类得分,则产生损失,如果再绿色区域,则不产生损失。
正则化
这种损失函数有一个bug。假设我们有了一个W,可以使得损失是0,但是任何λW(λ>1)都会使得损失等于0,例如正确的分类比不正确分类得分高10,那么使得W变成2W,那么正确的分类比不正确分类得分高20,因此损失还是0.也就是说,W不唯一。为了使得W唯一,我们可以将损失函数加上正则化惩罚。通常是L2范式,它会惩罚过大的权重: L=1N∑iLi+λ∑k∑lW2k,l 防止过拟合
交叉熵损失
交叉熵损失通常适用于Softmax 分类器。损失函数: Li=−log(efyi∑jefj) 举例,和上一个例子一样通过分类器得到分数向量s=[13,−7,11],正确的分类是第一个。首先将得分取指数,然后归一化,假如得到[0.3,0.1,0.6],则损失是−log(0.3)。我们可以看出如果第一个分类的得分是1,其他两个分类得分是0,则损失是0.因此,这个损失函数想要正确分类的得分越高越好。 交叉熵函数是衡量真实分布p与假设分布q之间的不一致性:
H(p,q)=−∑xp(x)logq(x) 真实分布p=[0,…1,…,0],假设分布q=efyi/∑jefj,因为H(p,q)=H(p)+DKL(p||q),而H(p)=0,因此最小化交叉熵损失和最小化KL散度一样。 实战技巧: 因为efyi和∑jefj可能很大,所以实际中乘以一个C: efyi∑jefj=CefyiC∑jefj=efyi+logC∑jefj+logC 通常logC=−maxjfj. 代码:
f = np.array([123, 456, 789]) # example with 3 classes and each having large scoresp = np.exp(f) / np.sum(np.exp(f)) # Bad: Numeric PRoblem, potential blowup# instead: first shift the values of f so that the highest number is 0:f -= np.max(f) # f becomes [-666, -333, 0]p = np.exp(f) / np.sum(np.exp(f)) # safe to do, gives the correct answer比较

SVM和Softmax之间的性能差异通常很小,不同的人对于哪个分类器工作得更好会有不同的意见。与Softmax分类器相比,SVM是一个更局部的目标,可以被认为是一个错误或一个特征。考虑一个实现分数[10,-2,3]和第一类是正确的例子。 SVM(例如,具有期望的余量Δ=1)将看到,与其他类相比,正确的类已经具有高于余量的分数,并且它将计算零损失。 SVM不关心个别分数的细节:如果它们改为[10,-100,-100]或[10,9,9],则SVM将是无关的,因为满足1的余量,因此损失是零。然而,这些情况不等同于Softmax分类器,它将为分数[10,9,9]比[10,-100,-100]积累更高的损失。换句话说,Softmax分类器从不完全满意它产生的分数:正确的类可以总是具有较高的概率,并且不正确的类总是较低的概率,并且损失将总是变得更好。然而,一旦满足边缘,SVM就ok了,并且它不会精确地超越该约束的精确得分。这可以直观地被认为是一个特征:例如,可能花费大部分“努力”在将车辆与卡车分离的困难问题上的汽车分类器不应该受到青蛙例子的影响,其已经指定非常低分数到,并且可能聚集在数据的完全不同侧。
原文地址