这是一篇2015年的cvpr,FaceNet: A UnifiedEmbedding for Face Recognition and Clustering,取得了当时人脸识别的state-of-the-art,论文主要提出了tripletloss这一思想。

如上图所示,简单的说,triplet就是一个由(Anchor ,Positive,Negative)组成的三元组。其中,Anchor(表示为Xa)为锚,表示从数据集中随机选择的一个样本,Positive(表示为Xp)表示和Anchor属于同一类别的样本,Negative(表示为Xn)表示和Anchor属于不同类别的样本。

   我们分别用下面的三个元素来表示其学习到的特征向量:

tripletloss的作用就是训练的过程中,使得Xa与Xp之间的距离尽可能小,Xa与Xn之间的距离尽可能大,为了绝对的区分开,真正做到discriminative,还要使得Xa与Xp的距离比Xa与Xn的距离小一个间隔,类似svm中的几何间隔。

triplet loss相应的目标函数为

即目标函数取0或者上面式子的最大值,当上面式子有值的时候,表示会产生损失,为0的时候表示没有产生损失。

在逆向传播的过程中,梯度按下面的公式计算:

具体在caffe中,triplet loss的实现,可以参考happynear在github上分享的他自己维护的caffe,里面有相应的实现。https://github.com/happynear/caffe-windows

另外CMU开源的openface中也用到了基于torch的tripletloss。

基于TensorFlow的facenet的实现,目前lfw识别率已经更新到了99.4%,https://github.com/davidsandberg/facenet