简介
谷歌的论文FaceNet: A Unified Embedding for Face Recognition and Clustering最早将triplet loss应用到人脸识别中。
在监督学习中,我们通常都有一个有限大小的样本类别集合,因此可以使用softmax和交叉熵来训练网络。但是,有些情况下,我们的样本类别集合很大,比如在人脸识别中,标签集很大,而我们的任务仅仅是判断两个未见过的人脸是否来自同一个人。
Triplet loss就是专为上述任务设计的。它可以帮我们学习一种人脸嵌入embedding,使得同一个人的人脸在嵌入空间中尽量接近,不同人的人脸在嵌入空间中尽量远离。
总结而言,不用softmax的原因如下:
- softmax最终的类别数是确定的,而Triplet loss学到的是一个好的embedding
- 相似的图像在embedding空间里是相近的,可以判断是否是同一个人脸。
原理
输入是一个三元组<a, p, n>
:
- a: anchor
- p: positive, 与 a 是同一类别的样本
- n: negative, 与 a 是不同类别的样本
我们的优化目标是:
- 拉近
a, p
的距离, 拉远a, n
的距离 - 使具有相同标签的样本在嵌入空间中尽量接近,使具有不同标签的样本在嵌入空间中尽量远离
- 值得注意的一点是,如果只遵循以上两点,最后嵌入空间中相同类别的样本可能collapse到一个很小的圈子里,即同一类别的样本簇中样本间的距离很小,不同类别的样本簇之间也会偏小。加入间隔(margin)的概念——,只要不同类别样本簇简单距离大于这个间隔就阔以了。
综合以上的信息,我们可以引出Triplet Loss的损失函数:
$$ L=max(d(a,p)−d(a,n)+margin,0) $$
easy triplets
: $L=0$ 即 $d(a,p)+margin<d(a,n)$,这种情况不需要优化,天然a, p的距离很近, a, n的距离远,是容易分辨的三元组hard triplets
: $d(a,n)<d(a,p)$, 即a, p的距离远,非常容易会误识别的三元组semi-hard triplets
: $d(a,p)<d(a,n)<d(a,p)+margin$, a, n的距离靠的很近,但是有一个margin,即处在模糊区域(关键区域)的三元组,而处于Semi-hard的negatives样本对我们网络模型的训练至关重要。
训练方法
OFFLINE
- 训练集所有数据经过计算得到对应的
embeddings
, 可以得到 很多<i, j, k>
的三元组,然后再计算triplet loss
- 但是这个方法效率不高,因为需要过一遍所有的数据得到三元组,然后训练反向更新网络
ONLINE
从训练集中抽取B
个样本,然后计算 B
个embeddings
,可以产生 $B^3$ 个 triplets (当然其中有不合法的,因为需要的是<a, p, n>)
online triplet loss
实际使用中采用此方法,又分为两种策略 (是在一篇行人重识别的论文中提到的 In Defense of the Triplet Loss for Person Re-Identification),假设 $Batch=P*K$, 其中$P$个身份的人,每个身份的人$K$张图片(一般$K$取 4)
- Batch All: 计算batch_size中所有valid的的hard triplet 和 semi-hard triplet, 然后取平均得到Loss
- 注意因为很多 easy triplets的情况,所以平均会导致Loss很小,所以是对所有 valid 的所有求平均 (下面代码中会介绍)
- 可以产生 $P * K * (K−1) * (P * K−K)$ 个 Triplets
- $P*K$个 anchor
- $K-1$ 个 positive
- $P*K-K$ 个 negative
- Batch Hard: 对于每一个anchor, 选择距离最小的$d(a, p)$ 和 距离最大的 $d(a, n)$
所以一共有 $PK$ 个三元组triplets
- 本文作者: Jason
- 本文链接: https://caicaijason.github.io/2019/12/05/triplet_loss解析/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!