您的位置:首页 > 其它

cs231n:SVM线性分类器

2016-11-08 22:13 218 查看

线性分类器:为了简单,下面只讨论二分类问题(cs231n)学习笔记

1.1 SVM: 从图像角度理解SVM

假设我们把一张图像的rgb三通道展开为一个vector,用x表示。
这样,我们的数据从Image1 ,2 ... N 变到 x1 ,2,...N。xi是向量
我们就可以用如下函数进行线性分类:
f(x,W,b)= Wx + b;  //liner classifier


1.2 如何判断我的模型:W、b的好坏呢?

lose function : 基本原则,分类界限好,希望损失小。
分类界限不好,甚至错误,希望损失大。
我们用Li表示第i个样本的数据损失:
Li = LossFunction(f(xi,W,b),yi)  注:在svm中f(xi,W,b)是一个score

这个值不是越小越好,因为可能对于你当前的数据集,这个值非常小。
但是对于别的数据集肯能非常不好。原因是出现了过拟合。把噪音也进行了拟合。

因此加上一个正则项R(W),来调整 .

综上:Li = LossFunction(f(xi,W,b),yi)+ lamda*(R(W))

对于整体数据集合:我们简单的采用平均:
L = 1/N *(sigma(Li):i form 1 to N) + lamda * R(w);


1.3 那如何选取W,b呢?

定义合适的loss function 。


1.4 有哪些loss function?

1.4.1 hinge Loss - 折页损失

hinge loss = LossFunction(f(xi,W,b),yi)
= max(0 , 1-f(xi)*yi)

make it clear
if(f(xi)*yi <=1)
loss =  1-f(xi)*yi;
else loss = 0;
analysis:假设 yi = 1; 那么 f(xi)只要大于1,loss都是0;
f(xi)不大于1 ,那么产生损失,距离1越远,说明分的越离谱,产生的loss越大。


1.4.2 cross-entropy loss -交叉熵损失

我们这里的二分类标签是yi = {-1,1}
ti = (1+yi)/2
P(yi|xi) = 1/(1+exp(-f(xi)*yi))
P(yi = 1| xi) = P(ti = 1| xi) = 1/(1+exp(-f(xi)))
P(yi = -1|xi) = P(ti = 0| xi) = 1/(1+exp(f(xi)))

因此P可以表示成一个等式:
P(ti|xi) = P(ti = 1|xi)exp(ti) * (1-P(ti=1|xi))exp(1-ti)




1.4.3 logistic loss :

注:我们在这里的二分类标签是yi={-1,1}
P(yi|xi) = 1/(1+exp(-f(xi)*yi))

make it clear
P(yi = 1| xi) = 1/(1+exp(-f(xi)))
P(yi = -1|xi) = 1/(1+exp(f(xi)))


Q&A:

1、cross-entropy loss 和softmax loss 有啥区别?

只能说没有区别。其实我们经常在论文中看到softmax loss这个词。但是这个词实际上指的就是cross-entropy loss。



[softmax function] (j代表第j个样本,Zj代表第j个样本socre ,分母k是元素个数,j form 1 to k) 这个函数的输入就是一个实数评分向量,假设输入z=【5,8,2,-8】,那么他的输出就是【4.73%,95.03%,0.235%,0.0001%】

2、softmax 与 cross-entropy loss 什么关系?

Softmax分类器的命名是从softmax函数那里得来的,softmax函数将原始分类评分变成正的归一化数值(看Q&A 1的例子),所有数值和为1,这样处理后交叉熵损失才能应用。


3、softmax 与SVM 什么关系?

首先,他们都是线性分类器,都用的同样的分值向量:




但是,他们用的损失函数不一致。


分析:svm用的是hinge loss ,但是softmax 用的是cross-entropy loss;

这也使得二者对于分类结果的解释不同,svm给出的分数向量是难以直观解释的。例如[12.5, 0.6, -23.0]代表“船”“猫”“狗”;

但是,softmax给出的是归一化的概率向量。给出每个类别的概率。[0.9, 0.09, 0.01]代表“船””猫”“狗”的概率。

python code :

f = np.array([123, 456, 789])
# example with 3 classes and each having large scores
p = 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:
#这一步至关重要,如果不减去,那么指数的幂爆炸式增长。导致double数据类型都得溢出。必须的减去max。
#caffe源码也是这样做的
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


code from cs231n http://cs231n.github.io/linear-classify/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: