郑哲东的博客

计算机视觉 行人再识别 person re-ID

阅读小结:Large-Margin Softmax Loss for Convolutional Neural Networks

徐博最近一直在看我博客,肯定是想看我什么时候不更新,然后好嘲笑我。当然,不排除徐博已经爱上我的可能。



What:

改进SoftmaxLoss,显式的鼓励类间差异和类内相似,防止过拟合。 


在minist上的效果如下,可以看到用Lsoftmax的每一类的宽度小。(对应余弦距离小)




回顾SoftmaxLoss:

1. Softmax

就是一个 把一个向量归一到[0,1]的函数,输出也是向量。在matlab里就3行代码:

% X is input vector,  Y is output vector
E = exp(X - max(X,[],3));
L = sum(E,3);
Y = E/L;

2. Softmax Loss

前向

Loss = -log(Y(c_gt)); 

c_gt 是一个one-hot向量,比如[0,0,1,0,0,0,0,0],1的那一维就是正确类所在的序号,这里就是第3类。

所以Y(c_gt)就是ground truth那一类的softmax score。  这个score越接近1越好,对应的Loss越小越好

带入Y的softmax公式,那么可以化简为:Loss = -log(exp(X_gt-Xmax) / L) = -(X_gt-Xmax) + log(L) = Xmax + log(L) - X_gt;

其中Xmax就是向量X中最大值,X_gt 就是ground truth那一维上X的值, L同上面代码中的一样,是exp的和。

比如在minist上,我输入一张1的手写图片(gt_label=2,因为minist有0),最后得到向量是10维的,

[0.1,0.2,0.3,0.4,0,0,0,0]   那么Xmax =0.4, X_gt =0.2(在第二维)


反向bp

bp要输出和输入一样维度的向量。

Loss = Xmax + log(L) - X_gt;

Loss' = mt + E/L  - gt = mt + Y  - gt;  (mt,gt 是一个one-hot向量,比如[0,0,1,0,0,0,0,0],1的那一维就是之前max的那一维和gt_label的那一维)

matlab代码如下:

gradient = Y;
gradient(c_gt) = gradient(c_gt) -1;

其实我觉得mt应该也要加的,但我参考的matconvnet代码中没有加。不是很明白。


 3. Large-Margin Softmax Loss

目标函数的目标是要score高,所以感性上正确那一类的W会渐渐变成input同向,而其他W则会和input正交。

所以作者想出了一个办法,让它们同向或者正交没辣么容易。

就是加大夹角

m = 1就是原来的softmax。

使用下面这张图更好说明:

x到W1的夹角是 θ1,到W2的夹角是θ2

如果使用了Lsoftmax,相当于要求 W1到 Decision Boundary Class2的夹角 为 mθ1。


在实际使用时,cos(mθ)可以用 cos(θ)来表示。而cos(θ)可以用 Wx/ llWll llxll 来得到。






阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Layumi1993/article/details/52629480
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

阅读小结:Large-Margin Softmax Loss for Convolutional Neural Networks

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭