三元组损失是机器学习中用于度量学习的一种损失函数,由目标样本、正样本和负样本各一个组成一组输入,要求目标与正样本的距离比目标与负样本的距离小出一个设定的边界值。它把分类问题转化为特征空间中的相似度学习问题,使同类样本的嵌入向量彼此靠近、异类样本的嵌入向量彼此远离。该损失函数在人脸识别、行人重识别和图像检索等任务中被广泛采用,2015 年谷歌的 FaceNet 模型使用它训练人脸嵌入并取得当时领先的识别精度。
定义
三元组损失是一种基于距离的损失函数,用于学习数据在嵌入空间中的表示,使相似的输入样本在特征空间中相互靠近、不相似的样本相互远离[1]。它每次接收 3 个样本:目标样本(Anchor)、与目标同类的正样本(Positive)以及与目标不同类的负样本(Negative),因此得名三元组[2]。
其常见形式可写作 $L=\max(d(a,p)-d(a,n)+m,\,0)$,其中 $a$、$p$、$n$ 分别代表目标、正样本与负样本的嵌入向量,$d$ 为距离函数,通常取欧氏距离,$m$ 是控制正负距离最小间隔的边界超参数[2]。当目标与负样本的距离已经比目标与正样本的距离大出至少 $m$ 时,损失取 0,该组样本不再产生梯度[3]。也有文献采用平方欧氏距离的写法,把两段距离的差再加上边界值后取合页形式的最大值[4]。
与交叉熵等分类损失不同,三元组损失不要求网络为每个类别输出一个判别结果,而是约束样本之间的相对距离关系,因此属于度量学习的范畴[3]。这种设计使模型学到的嵌入可以用于训练时未出现过的类别,只需比较特征距离即可完成匹配[3]。
原理
训练时,3 个样本分别送入共享参数的同构网络,得到各自的嵌入向量,再计算目标与正样本、目标与负样本两组距离[5]。损失函数对这两组距离施加约束,通过梯度下降反向传播,拉近同类样本、推远异类样本,使嵌入空间逐渐按语义相似度组织起来[6]。
边界值 $m$ 的作用是要求两类距离之间留出余量:仅当目标与负样本的距离超出目标与正样本的距离至少 $m$ 时,才认为该组三元组已被满足[1]。与对比损失只处理样本对不同,三元组损失同时改变正负两侧的距离关系,因而能容忍一定程度的类内差异,不必把同类样本压缩到同一点[2]。
三元组的选取策略直接影响训练效果。按负样本与目标的距离,可分为难负样本(负样本比正样本更接近目标)、半难负样本(负样本比正样本远但仍在边界之内)和简单负样本(随机选取、条件已满足)[3]。使每个批次的数据产生多组有效三元组的过程称为三元组挖掘,常见做法包括批次内全部有效三元组、批次内最难样本以及半难样本挖掘[2]。
发展历程
三元组网络与三元组损失由埃拉德·霍弗和尼尔·艾隆在 2015 年发表的《Deep Metric Learning Using Triplet Network》中提出,该工作用 3 个共享参数的相同前馈网络输出两组距离,把度量学习表达为一个二分类式的比较问题[5]。同一年的谷歌 FaceNet 模型把三元组损失用于人脸识别,直接优化嵌入层,并用在线三元组挖掘生成训练用的匹配与非匹配人脸图像对[6]。该模型使用 128 维的人脸嵌入,在若干人脸识别基准上取得了当时最优的结果,使三元组损失成为度量学习中最知名、应用最广的损失函数之一[6]。
此后出现了多种改进形式。N 对损失(N-pair loss)把一次比较扩展到一个正样本与多个负样本,以加快收敛并改善优化结果[7]。四元组损失在原有三元组之外引入第二个负样本,进一步缩小类内差异、扩大类间差异。赫尔曼斯等人在 2017 年系统分析了三元组损失的设计空间,提出批次内最难样本挖掘,使不依赖额外难例挖掘的变体也能取得良好效果[8]。为降低训练复杂度,还出现了以类别代理向量替代真实正负样本的做法,以及能把训练复杂度降到与类别数成线性关系的方法[9]。
应用
人脸识别与验证是三元组损失最典型的应用场景。由于单个身份可用的样本往往很少,而类别总数极大,把识别当作分类问题并不合适,改用三元组损失学习嵌入后,只需比较新样本人脸与存档人脸的特征距离即可判定身份,新增身份也不必重新训练模型[3]。
在计算机视觉的其他检索类任务中同样常见,包括行人重识别、车辆检索与商品检索:这些任务需要判断不同摄像头或不同来源的图片是否属于同一目标,三元组损失提供的距离度量恰好满足这种需求。
三元组损失还被用于图像检索、文本相似度、异常检测和推荐系统等方向:通过让语义相近的文档、商品或行为的特征彼此靠近,可以按相似度排序返回结果[3]。在样本类别不均衡的文本重复检测等任务中,它也常被用来缓解配对损失带来的模型偏置。
局限
三元组损失对样本选取高度敏感。若训练批次中满足边界条件的三元组占多数,梯度会接近 0,收敛因此变得缓慢;在理想情况下可以枚举全部组合,但组合数量随样本数呈立方级增长,实际不可行。相关分析也指出,此类基于元组的损失容易收敛慢、陷入较差的局部最优,并需要代价较高的样本挖掘来提供有效样本[7]。
单次更新只比较一个负样本,意味着目标样本只被推离选中的那个负类,与其余类别之间的距离未必同时得到保证,因此单步更新可能不稳定[7]。边界值 $m$ 也需要谨慎调节:过小会导致难样本不足、收敛缓慢,过大则会产生过多的困难样本,可能引起过拟合[10]。
在工程实现上,三元组损失通常无法像分类损失那样直接给出可用的验证准确率,训练过程结束后往往还需再训练一个分类器或线性模型来完成判别,这增加了流程的复杂度和评估难度。此外,它需要大规模数据和较长的训练时间才能学到稳健的相似度特征,计算成本较高[3]。
参见
参考资料
- Triplet Loss Definition | Encord [引用日期2026-10-14]
- title: "Advanced Introduction to Triplet Loss" [引用日期2026-10-14]
- Introduction to Triplet Loss [引用日期2026-10-14]
- CN113191338A(PDF) [引用日期2026-10-14]
- Deep metric learning using Triplet network [引用日期2026-10-14]
- korea.ac.kr 上的 PDF 文件 [引用日期2026-10-14]
- Improved Deep Metric Learning with [引用日期2026-10-14]
- In Defense of the Triplet Loss for Person Re-Identification [引用日期2026-10-14]
- thecvf.com 上的 PDF 文件 [引用日期2026-10-14]
- similar [引用日期2026-10-14]