模型蒸馏
此页面包含一个示例,用于使 SentenceTransformer 模型**更快、更便宜、更轻量**。这些轻量模型在下游任务上实现了原始模型 97.5% - 100% 的性能。
知识蒸馏
知识蒸馏描述了将知识从教师模型转移到学生模型的过程。它可以用于将句子嵌入扩展到新的语言(使用知识蒸馏使单语句子嵌入多语言化),但传统方法是拥有一个慢速(但性能良好)的教师模型和一个快速的学生模型。
快速学生模型模仿教师模型,并通过这种方式实现高性能。

我们实现了两种创建学生模型的选项
model_distillation.py:使用轻量 Transformer 模型(如 TinyBERT 或 BERT-Small)来模仿更大的教师模型。
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.4x) |
6 | 85.23 | -0.2% | 4000 (~1.7x) |
4 | 84.92 | -0.6% | 5300 (~2.3x) |
3 | 84.39 | -1.2% | 6500 (~2.8x) |
2 | 83.32 | -2.5% | 7700 (~3.3x) |
1 | 80.86 | -5.4% | 9200 (~4.0x) |
降维
警告
自从撰写本文以来,嵌入量化已被引入作为缩小嵌入尺寸的首选方法。根据 Thakur et al.,我们建议使用这种方法而不是 PCA。
默认情况下,预训练模型输出尺寸为 768(基础模型)或 1024(大型模型)的嵌入。但是,当您存储数百万个嵌入时,这可能需要相当多的内存/存储空间。
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 的量化支持仍在改进中。