损失概述¶
损失函数在你的微调模型性能中起着关键作用。遗憾的是,没有一种“一刀切”的损失函数。理想情况下,此表应通过将损失函数与你的数据格式匹配来帮助缩小损失函数的选择范围。
备注
你通常可以将一种训练数据格式转换为另一种格式,从而使更多的损失函数适用于你的场景。例如,(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 |
常用的损失函数¶
在实践中,并非所有损失函数都同样常用。最常见的场景是:
(anchor, positive) 无标签对:
MultipleNegativesRankingLoss
常用于训练表现最佳的嵌入模型。这种数据通常相对廉价,且模型通常表现非常出色。CachedMultipleNegativesRankingLoss
常用于增加批次大小,从而提高性能。(sentence_A, sentence_B) 对与浮点相似度分数:
CosineSimilarityLoss
传统上被广泛使用,尽管最近CoSENTLoss
和AnglELoss
作为性能更优的替代品被使用。
自定义损失函数¶
高级用户可以创建并使用自己的损失函数进行训练。自定义损失函数只有几个要求:
它们必须是 :class:
torch.nn.Module
的子类。它们在构造函数中必须将
model
作为第一个参数。他们必须实现一个
forward
方法,该方法接受sentence_features
和labels
。前者是一个分词批次的列表,每个列对应一个元素。这些分词批次可以直接输入到正在训练的model
中以生成嵌入。后者是一个可选的标签张量。该方法必须返回一个单一的损失值。
要获得自动模型卡生成的全面支持,您可能还希望实现:
一个返回损失参数字典的
get_config_dict
方法。一个
citation
属性,这样你的工作在所有使用该损失训练的模型中都会被引用。