模型蒸馏

本页面包含一个示例,用于使 SentenceTransformer 模型变得**更快、更便宜、更轻量**。这些轻量级模型在下游任务中能达到原始模型 97.5% - 100% 的性能。

知识蒸馏

知识蒸馏描述了将知识从教师模型迁移到学生模型的过程。它可用于将句子嵌入扩展到新的语言(使用知识蒸馏使单语句子嵌入多语化),但传统方法是使用一个速度慢(但性能好)的教师模型和一个速度快的学生模型。

速度快的学生模型模仿教师模型,从而获得高性能。

Knowledge Distillation

我们实现了两种创建学生模型的选项

  1. model_distillation.py:使用像 TinyBERT 或 BERT-Small 这样的轻量级 Transformer 模型来模仿更大的教师模型。

  2. model_distillation_layer_reduction.py:我们采用教师模型并只保留某些层,例如,只保留 4 层。

选项 2)通常效果更好,因为我们保留了教师模型的大部分权重。在选项 1 中,我们必须从头开始调整学生模型的所有权重。

速度-性能权衡

较小的模型速度更快,但在下游任务上评估时性能(略)差。为了了解这种权衡,我们展示了 stsb-roberta-base 模型在不同层数下的一些数据

层数 STSbenchmark 性能 性能下降 速度(句子/秒,在 V100-GPU 上)
教师模型:12 85.44 - 2300
8 85.54 +0.1% 3200 (约1.4倍)
6 85.23 -0.2% 4000 (约1.7倍)
4 84.92 -0.6% 5300 (约2.3倍)
3 84.39 -1.2% 6500 (约2.8倍)
2 83.32 -2.5% 7700 (约3.3倍)
1 80.86 -5.4% 9200 (约4.0倍)

降维

警告

自本文撰写以来,嵌入量化已被引入作为缩小嵌入尺寸的首选方法。根据Thakur等人的研究,我们推荐该方法而非 PCA。

默认情况下,预训练模型输出的嵌入维度为 768(base 模型)或 1024(large 模型)。然而,当您存储数百万个嵌入时,这可能需要相当大的内存/存储空间。

dimensionality_reduction.py 包含一个简单的示例,说明如何使用主成分分析(PCA)将嵌入维度减小到任意大小。在该示例中,我们将 768 维减小到 128 维,存储需求减少了 6 倍。在 STS 基准数据集上,性能仅从 85.44 轻微下降到 84.96。

这种降维技术可以轻松应用于现有模型。我们甚至可以将嵌入大小减小到 32,使存储需求减少 24 倍(性能下降到 81.82)。

注意:此技术既不提高运行模型的速度,也不减少其内存需求。它只减少了存储嵌入所需的空间,例如,用于语义搜索

量化

量化模型使用整数而非浮点值来执行部分或全部操作。这使得模型更紧凑,并能在许多硬件平台上使用高性能的矢量化操作。

对于在CPU上运行的模型,这可以使模型大小减小 40%,并加快推理时间:根据 CPU 的不同,速度提升在 15% 到 400% 之间。PyTorch 目前不支持 GPU 上的模型量化。

有关示例,请参见 model_quantization.py

注意

Sentence Transformers 的量化支持仍在改进中。