原作者的github code:https://github.com/rksltnl/Deep-Metric-Learning-CVPR16
What:
这是一篇讲图像retrieval的工作,其实也可以用运用于细力度(finegrain)的分类问题。也就是通过一张图片去搜索相关图片。比较直观的问题在于图像的传统问题
-类内差异 (比如同一物体在不同pose下的照片,可能一点都不像) -类间相似(比如不同物体在同一pose下的照片,反倒是很像)
然后比较diao的地方是,zero-shot learning没有学习过,直接test(和以前我们常用的vgg模型提取特征的感觉一样,先在一个大数据集上统计学习了一下,随后应用到了新问题上的感觉)
Motivation:
1.传统的分类算法克服不了 多分类(由于模型复杂度和分类数量相关,会过于复杂)和数据bias(比如某一类数据特别少的问题)
2.metric learning可以克服第二个问题,因为学到的是每一类的general concept,所以数据少也能学。
3.deeplearning可以克服第一个问题。但deeplearning在类内差异做的比较好,类间相似不能take full advantage(其实softmax loss有类间差异,因为分母有所有的类)
4.提出的算法lift每个batch中的差异从O(m)到O(m^2),设计了一个新的loss目标。
在摘要中写到:
In this paper, we describe analgorithm for taking full advantage of the training batchesin the neural network trainingby lifting the vector of pair-wise distances within the batch to the matrix of pairwisedistances.
说到底就是要更discriminative!
Review:首先我们回顾一下几个东西:
1.contrast embeding
作者给出了一个公式:input是一对数据xi和xj
y是这一对的groundtruth,比方说xi,xj是不是同一类,那么y就对应的是0或者1.
f()是xi和xj的运算(比如把x输入神经网络,取出fc层的结果,这么一个函数)
D是f(xi)和f(xj)的欧式距离。那么优化这个loss,min(J),当xi和xj是同一类的时候,yij是1,那么Dij应该越小越好;如果不是同一类,yij是0,Dij应该约大越好。
2.triplet loss
这次输入为三元组{xa,xp,xn}
xa和xp是同一类,和xn不同类。所以Dap应该越小越好,Dan越大越好。所以也是优化min(J)
然后下面是一张有趣的图,说明了作者Lift与前两种的不同。(前两种loss在刻画关系上是不足的)
对应的Loss如下:
先看下面的公式:
后一项为数据i,j之间的距离,
前一项为数据i最难区分的k和数据j最难区分的数据l的距离中较大者。。(比较绕,但看公式比较容易明白,找最难分辨的一条边,而之前triplet loss固定了这条边)
所以
1.每次train的时候都是最难的边或者说pair(容易混淆的两个东西)
2.利用了整的minibatch的信息而不是固定pair
相当于O(m)变为了现在的O(m^2)pairs 一个完全图
一般来说,接下去,我们写了一个矩阵运算,就是 (x1-x2)^2 = x1^2+x2^2-2x1x2 以矩阵的形式表达,然后每次求一下最close的negative是谁就好了。
但作者又提出说,batch是随机切的,那么信息是有限的。大多数情况下,minibatch中没有那些最难的。
所以作者没有使用random的batch,而是采用随机的取出一些positive pair,然后动态的找他们最难的边(因为模型也在调整)。
然后为了防止过拟合将max函数换成log和exp(依旧是增函数)