Sentence Transformer中的损失函数(Loss Function)
损失函数表
损失函数在微调模型的性能中起着关键作用。可惜的是,并没有一种“通用”的损失函数。理想情况下,下面的表格可以帮助你根据数据格式选择合适的损失函数。
注意:
你通常可以将一种训练数据格式转换为另一种,从而使更多的损失函数适用于你的场景。例如,带有类别标签的(sentence_A, sentence_B)对可以通过采样相同或不同类别的句子转换为(anchor, positive, negative)三元组。
| 输入格式 | 标签类型 | 合适的损失函数 |
|---|---|---|
单个句子 |
类别 |
BatchAllTripletLoss、BatchHardSoftMarginTripletLoss、BatchHardTripletLoss、BatchSemiHardTripletLoss |
单个句子 |
无 |
ContrastiveTensionLoss、DenoisingAutoEncoderLoss |
(anchor, anchor) 对 |
无 |
ContrastiveTensionLossInBatchNegatives |
(破损句子, 原始句子) 对 |
无 |
DenoisingAutoEncoderLoss |
(句子A, 句子B) 对 |
类别 |
SoftmaxLoss |
(anchor, positive) 对 |
无 |
MultipleNegativesRankingLoss、CachedMultipleNegativesRankingLoss、MultipleNegativesSymmetricRankingLoss、CachedMultipleNegativesSymmetricRankingLoss、MegaBatchMarginLoss、GISTEmbedLoss、CachedGISTEmbedLoss |
(anchor, positive/negative) 对 |
正为1,负为0 |
ContrastiveLoss、OnlineContrastiveLoss |
(句子A, 句子B) 对 |
0到1之间的浮点相似度得分 |
CoSENTLoss、AnglELoss、CosineSimilarityLoss |
(anchor, positive, negative) 三元组 |
无 |
MultipleNegativesRankingLoss、CachedMultipleNegativesRankingLoss、TripletLoss、CachedGISTEmbedLoss、GISTEmbedLoss |
(anchor, positive, negative_1, ..., negative_n) |
无 |
MultipleNegativesRankingLoss、CachedMultipleNegativesRankingLoss、CachedGISTEmbedLoss |
损失函数修饰器
这些损失函数可以视为修饰器:它们基于标准损失函数进行工作,但通过不同方式应用这些损失函数,以向嵌入模型注入有益特性。
例如,使用 MatryoshkaLoss 训练的模型所生成的嵌入在被截断尺寸时仍保持良好性能;使用 AdaptiveLayerLoss 的模型在去除模型层以加速推理时依然表现良好。
| 文本类型 | 标签类型 | 合适的损失函数 |
|---|---|---|
| 任意 | 任意 | MatryoshkaLoss、AdaptiveLayerLoss、Matryoshka2dLoss |
知识蒸馏损失函数
这些损失函数专为模型蒸馏而设计。例如,当你希望微调一个小模型使其行为更像一个更大更强的模型时,或让模型变为多语言模型时使用。
| 输入文本 | 标签类型 | 合适的损失函数 |
|---|---|---|
单句子 |
模型句子嵌入 |
MSELoss |
句子1, 句子2, ..., 句子N |
模型句子嵌入 |
MSELoss |
(query, passage_one, passage_two) 三元组 |
gold_sim(query, one) - gold_sim(query, two) |
MarginMSELoss |
(query, positive, negative_1, ..., negative_n) |
[gold_sim(query, pos) - gold_sim(query, neg_i)] |
MarginMSELoss |
(query, positive, negative) |
[gold_sim(query, pos), gold_sim(query, neg)] |
DistillKLDivLoss |
(query, positive, negative_1, ..., negative_n) |
[gold_sim(query, pos), gold_sim(query, neg_i)...] |
DistillKLDivLoss |
常用损失函数
在实践中,并非所有损失函数使用频率相同。最常见的情况包括:
-
(anchor, positive)对,没有标签:
MultipleNegativesRankingLoss(又名 InfoNCE 或 in-batch negatives loss)常用于训练表现最佳的嵌入模型。该类数据获取成本较低,模型性能通常也很出色。为了提升性能,常用CachedMultipleNegativesRankingLoss增加批量大小。 -
(句子A, 句子B)对,带有浮点相似度评分:
传统上使用CosineSimilarityLoss,但现在常用CoSENTLoss或AnglELoss作为效果更好的替代。

浙公网安备 33010602011771号