FaceNet: A Unified Embedding for Face Recognition and Clustering
https://www.sentiance.com/2018/05/03/loc2vec-learning-location-embeddings-w-triplet-loss-networks/
本篇主要是用于人脸识别的“三重损失”——triplet,博客中的例子也用到三重损失,所以简单整理一下
本文将人脸“图片”以粗匹配组和不匹配组组成“三元组”样本,通过“深度卷积网络”嵌入到128维的欧式空间中,使人脸图片可欧式距离度量,实现人脸识别(KNN)、验证和聚类(K-means)任务。
通常人脸识别问题用CNN训练,PCA降维,SVM分类
triplet loss
三重损失的思想在于在嵌入空间中,使Anchor样本和Positive样本尽可能近、与Negative样本尽可能远,其中 α α 是强制约束正负样本对之间的最小距离, []+ [ ] + 表示max(0,value)
xai(anchor);xpi(positive);xni(negative) x i a ( a n c h o r ) ; x i p ( p o s i t i v e ) ; x i n ( n e g a t i v e )
‖f(xai)−f(xpi)‖22+α<‖f(xai)−f(xni)‖22 ‖ f ( x i a ) − f ( x i p ) ‖ 2 2 + α < ‖ f ( x i a ) − f ( x i n ) ‖ 2 2
所以,损失即最小化
L=∑iN[‖f(xai)−f(xpi)‖22−‖f(xai)−f(xni)‖22+α]+ L = ∑ i N [ ‖ f ( x i a ) − f ( x i p ) ‖ 2 2 − ‖ f ( x i a ) − f ( x i n ) ‖ 2 2 + α ] +本文中在每个mini-batch中采样了40张脸,并随机采样负样本
选择难区分的正负样本可以更快收敛,但也容易陷入局部最优,本文随机选择了较多的半难的样本对于好判断的样本,损失为负,所以损失设置最小值为0,即[]+;对于难判断的样本,一般损失为正;对于略高于正样本的负样本,为了有效学习,添加间隔 α α ,也是期望anchor和positive的距离要比anchor和negative距离多至少 α α 间隔,则正负样本不会挨得很近。
(盗了个图)
- 本文中每个batch用了1800样本,AdaGrad,初始学习率0.05,随机初始化模型, α=0.2 α = 0.2
https://zhuanlan.zhihu.com/p/35560666
easy triplets(简单三元组): triplet对应的损失为0的三元组d(a,n)>d(a,p)+margin d ( a , n ) > d ( a , p ) + m a r g i n
hard triplets(困难三元组): negative example 与anchor距离小于anchor与positive example的距离d(a,n)<d(a,p) d ( a , n ) < d ( a , p )
semi-hard triplets(一般三元组): negative example 与anchor距离大于anchor与positive example的距离,但还不至于使得loss为0,
d(a,p)<d(a,n)<d(a,p)+margin d ( a , p ) < d ( a , n ) < d ( a , p ) + m a r g i n
softPN
这个主要参考了loc2vec的博客,里面除了三重损失外,引用了该损失函数(大概思路,具体见博客)
三重损失的主要思想是
对于难分离的负样本,通过添加偏置要求到正负样本间有一定距离
有可能导致a和p,n都很远的情况,因此考虑np的距离,实现的d(a,n)和d(n,p)都比较大
