损失概述

损失表

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

注意

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

输入 标签 合适的损失函数
单个句子 类别 BatchAllTripletLoss
BatchHardSoftMarginTripletLoss
BatchHardTripletLoss
BatchSemiHardTripletLoss
单个句子 ContrastiveTensionLoss
DenoisingAutoEncoderLoss
(anchor, anchor) 对 ContrastiveTensionLossInBatchNegatives
(damaged_sentence, original_sentence) 对 DenoisingAutoEncoderLoss
(sentence_A, sentence_B) 对 类别 SoftmaxLoss
(anchor, positive) 对 MultipleNegativesRankingLoss
CachedMultipleNegativesRankingLoss
MultipleNegativesSymmetricRankingLoss
CachedMultipleNegativesSymmetricRankingLoss
MegaBatchMarginLoss
GISTEmbedLoss
CachedGISTEmbedLoss
(anchor, positive/negative) 对 如果是正例则为 1,如果是负例则为 0 ContrastiveLoss
OnlineContrastiveLoss
(sentence_A, sentence_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
sentence_1, sentence_2, ..., sentence_N 模型句子嵌入向量 MSELoss
(query, passage_one, passage_two) 三元组 gold_sim(query, passage_one) - gold_sim(query, passage_two) MarginMSELoss

常用损失函数

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

  • 没有标签的 (anchor, positive) pairsMultipleNegativesRankingLoss(又名 InfoNCE 或 in-batch negatives loss)通常用于训练性能最佳的嵌入模型。这种数据通常相对容易获得,并且模型通常非常高性能。CachedMultipleNegativesRankingLoss 通常用于增加批量大小,从而获得更优越的性能。

  • 带有 float similarity score(sentence_A, sentence_B) pairsCosineSimilarityLoss 传统上被大量使用,但最近 CoSENTLossAnglELoss 被用作性能更优越的直接替代品。

自定义损失函数

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

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

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

  • 它们必须实现一个 forward 方法,该方法接受 sentence_featureslabelssentence_features 是标记化批次的列表,每列一个元素。这些标记化批次可以直接馈送到正在训练的 model 以生成嵌入向量。labels 是一个可选的标签张量。该方法必须返回单个损失值。

为了获得对自动模型卡生成的完全支持,您可能还希望实现

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

  • 一个 citation 属性,以便您的工作在所有使用该损失函数训练的模型中被引用。

考虑检查现有的损失函数,以了解损失函数通常是如何实现的。