triplet loss 是深度学习的一种损失函数,指的是最小化锚点和具有相同身份的正样本之间的距离,最小化锚点和具有不同身份的负样本之间的距离。
术语「三元组」是指三个数据点:锚点、正点和负点。锚点是要学习嵌入的中心数据点,正点是与锚点相似的数据点(例如同一个体的图像),负点是与锚点完全不同的数据点。与锚点不同(例如,不相关个体的图像)。
从数学上讲,三重态损失可以表示为:
- f() 表示负责生成嵌入的函数。
- a = 锚图像
- p 表示正像
- n 表示负像
- Ɑ 表示边距超参数,设置正负嵌入距离之间的间隔下限。
三元组损失函数的核心在于边距 α,这是一个超参数,用于设置正锚嵌入和负锚嵌入的平方距离之间所需的最小差异。通过施加这个余量,损失函数鼓励正距离和负距离之间的理想分布,创造一个有利于学习有意义的表示的环境。这些正距离和负距离是使用距离度量(通常是欧氏距离)计算的。
Triplet Loss 的基础是学习嵌入突出数据点之间的内在关系的基本目标。这与传统的损失函数不同,传统的损失函数主要是为分类或价值预测等任务而设计的。在人脸识别等场景中,面部特征的细微差别至关重要,能够以原始像素不易实现的方式区分个体的嵌入(或编码)是非常宝贵的。
Triplet Loss 的出现是解决这一挑战的方法。通过鼓励神经网络根据相对于锚实例的正例和负例的上下文来学习嵌入,打开了获取区分特征的大门,这些特征本质上捕获了数据关系的本质。
三元组选择策略
选择合适的三元组对于 Triplet Loss 的有效性至关重要。在实践中,随机选择三元组可能会导致收敛缓慢或不是最优解。因此,采用多种策略来有效地选择信息丰富的三元组:
- 在线三元组挖掘:在线三元组挖掘不是使用所有可能的三元组,而是根据损失值选择三元组。只有最具挑战性的三元组,即损失值接近于零的三元组,才用于梯度计算。这种方法加速了收敛,并将学习过程集中在困难的例子上。
- Hard Negative Mining:为三元组选择的负样本应该比正样本更难与锚点区分开来。硬负挖掘涉及选择最违反边际的负样本,从而确保网络从具有挑战性的实例中更有效地学习。
- 半硬负片挖掘:旨在在随机选择的负片和硬负片之间取得平衡。半硬负片是比正片距离锚点更远但仍然具有正损失值的负片。它们提供了一个中间立场,帮助网络更好地泛化,而不会收敛到一个简单的解决方案。
Triplet Loss 的变体
Triplet Loss 的基本公式已经产生了一些变化和增强,以提高其有效性:
- Batch Hard Triplet Loss:该方法不是为每个锚定正对选择最难的负例,而是考虑一批训练示例中最难的负例。这考虑了批次内的变化并且可以提高计算效率。
- 对比损失:三元组损失可以看作是对比损失的扩展,其中考虑的不是三元组,而是锚定正例和锚定负例对。
- 四元组损失:此扩展涉及向三元组添加第二个正例,进一步强调锚点和正例之间的关系。
- 基于代理的损失:基于代理的方法涉及学习一组代表不同类别的代理向量。这些代理充当嵌入空间中的地标,使得更容易形成三元组并学习有意义的表示。
Triplet Loss 的应用
Triplet Loss 在各个领域都有应用,特别是在学习有意义的嵌入至关重要的情况下:
- 人脸识别: Triplet Loss 最早的应用之一是在计算机视觉领域,特别是人脸识别。通过学习最小化个人内部差异和最大化人际差异的嵌入,Triplet Loss 有助于创建稳健且具有区分性的面部嵌入。
- 图像检索: Triplet Loss 可用于构建基于内容的图像检索系统。图像被编码为嵌入,检索相似图像就变成了查找与查询图像的嵌入接近的嵌入的问题。
- 人员重新识别:在视频监控等场景中,三重态损失可用于开发模型,即使在不同的照明和姿势下,也能在不同的摄像机视图中识别同一个人。
- 信息检索:在自然语言处理中,三元组损失可以适应学习文本文档的嵌入,从而实现基于相似性的搜索和聚类。
参考来源
【1】https://encord.com/glossary/triplet-loss-definition/