损失概述

损失函数在你的微调模型性能中起着关键作用。遗憾的是,没有一种“一刀切”的损失函数。理想情况下,此表应通过将损失函数与你的数据格式匹配来帮助缩小损失函数的选择范围。

备注

你通常可以将一种训练数据格式转换为另一种格式,从而使更多的损失函数适用于你的场景。例如,(sentence_A, sentence_B) pairs 带有 class 标签可以通过采样相同或不同类别的句子转换为 (anchor, positive, negative) triplets

Inputs Labels Appropriate Loss Functions
single sentences class BatchAllTripletLoss
BatchHardSoftMarginTripletLoss
BatchHardTripletLoss
BatchSemiHardTripletLoss
single sentences none ContrastiveTensionLoss
DenoisingAutoEncoderLoss
(anchor, anchor) pairs none ContrastiveTensionLossInBatchNegatives
(damaged_sentence, original_sentence) pairs none DenoisingAutoEncoderLoss
(sentence_A, sentence_B) pairs class SoftmaxLoss
(anchor, positive) pairs none MultipleNegativesRankingLoss
CachedMultipleNegativesRankingLoss
MultipleNegativesSymmetricRankingLoss
CachedMultipleNegativesSymmetricRankingLoss
MegaBatchMarginLoss
GISTEmbedLoss
CachedGISTEmbedLoss
(anchor, positive/negative) pairs 1 if positive, 0 if negative ContrastiveLoss
OnlineContrastiveLoss
(sentence_A, sentence_B) pairs float similarity score CoSENTLoss
AnglELoss
CosineSimilarityLoss
(anchor, positive, negative) triplets none MultipleNegativesRankingLoss
CachedMultipleNegativesRankingLoss
TripletLoss
CachedGISTEmbedLoss
GISTEmbedLoss

损失修饰符

这些损失函数可以看作是损失修饰器:它们在标准损失函数之上工作,但以不同的方式应用这些损失函数,试图在训练的嵌入模型中灌输有用的属性。

例如,使用 MatryoshkaLoss 训练的模型产生的嵌入可以在不显著损失性能的情况下被截断,而使用 AdaptiveLayerLoss 训练的模型在为了更快推理而移除模型层时仍然表现良好。

Texts Labels Appropriate Loss Functions
any any MatryoshkaLoss
AdaptiveLayerLoss
Matryoshka2dLoss

蒸馏

这些损失函数专门设计用于在将知识从一个模型蒸馏到另一个模型时使用。例如,在微调一个小模型以使其行为更像一个更大、更强的模型时,或在微调一个模型以使其成为多语言模型时。

Texts Labels Appropriate Loss Functions
sentence model sentence embeddings MSELoss
sentence_1, sentence_2, ..., sentence_N model sentence embeddings MSELoss
(query, passage_one, passage_two) triplets gold_sim(query, passage_one) - gold_sim(query, passage_two) MarginMSELoss

常用的损失函数

在实践中,并非所有损失函数都同样常用。最常见的场景是:

自定义损失函数

高级用户可以创建并使用自己的损失函数进行训练。自定义损失函数只有几个要求:

  • 它们必须是 :class:torch.nn.Module 的子类。

  • 它们在构造函数中必须将 model 作为第一个参数。

  • 他们必须实现一个 forward 方法,该方法接受 sentence_featureslabels。前者是一个分词批次的列表,每个列对应一个元素。这些分词批次可以直接输入到正在训练的 model 中以生成嵌入。后者是一个可选的标签张量。该方法必须返回一个单一的损失值。

要获得自动模型卡生成的全面支持,您可能还希望实现:

  • 一个返回损失参数字典的 get_config_dict 方法。

  • 一个 citation 属性,这样你的工作在所有使用该损失训练的模型中都会被引用。