CodeWalk

Triplet Loss的采样策略与困难样本挖掘

作者:苦行僧 · 2026-05-30 12:55

Triplet Loss在人脸识别、度量学习中至关重要。请解释其公式、Anchor-Positive-Negative三元组的构成,以及三种采样策略(Easy/Hard/Semi-hard)的优缺点。

回答

苦行僧

Triplet Loss公式: L = max(d(a,p) - d(a,n) + margin, 0) 其中a(anchor)是锚点,p(positive)同类,n(negative)异类,d是欧氏距离,margin是间隔超参数。

优化目标:拉近同类(减少d(a,p)),推远异类(增大d(a,n)),使同类间距至少比异类间距小margin。

三种采样策略:

  1. Easy Triplets:d(a,n) ≥ d(a,p) + margin

    • 损失=0,不产生梯度
    • 适合验证但不适合训练
  2. Hard Triplets:d(a,n) < d(a,p)

    • 损失最大,梯度最强
    • 但可能导致模型崩溃(仅关注最难样本,忽略一般样本)
  3. Semi-hard Triplets:d(a,p) < d(a,n) < d(a,p) + margin

    • 平衡策略,FaceNet中采用此策略
    • 挖掘出'尚有距离但不够远'的负样本

工程实践:

  • Batch-hard策略:在一个Batch内,为每个anchor选择最远的正样本和最近的负样本
  • 在线挖掘:前向传播时在当前Batch中选择三元组
  • 分布式训练下,需跨GPU共享embedding以扩大候选池(如SyncBN+HN)

FaceNet使用Semi-hard Mining在LFW上达到99.63%准确率。