PKD-for-BERT-Model-Compression
Patient Knowledge Distillation:将12层BERT压缩至3-6层,保留97%精度的PyTorch实现
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Patient Knowledge Distillation:将12层BERT压缩至3-6层,保留97%精度的PyTorch实现
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2019年,如果你想用 BERT 在自然语言推理任务上达到 SOTA 效果,你需要一台显存至少 8GB 的 GPU,外加数小时的训练时间。BERT-Large 更是显存杀手——12 层 Transformer 堆叠,参数规模达 3.4 亿。这对于学术研究者、小团队和边缘设备来说,简直是奢望。
有没有一种方法,能把 12 层的 BERT 压缩成 3 层或 6 层,同时保留 90% 以上的性能?
这正是 Patient Knowledge Distillation(PKD)想要回答的问题。由新加坡国立大学和 Salesforce Research 的研究人员在 EMNLP 2019 上提出,该项目 intersun/PKD-for-BERT-Model-Compression 提供了 PyTorch 官方实现,目前已被引用超过 1100 次。

图1:BERT12(12层教师模型)与 BERT6(6层学生模型)在 MNLI 和 QNLI 任务上的性能对比,PKD 方法显著优于传统微调和普通知识蒸馏。
传统知识蒸馏(Vanilla KD)只有一个核心思路:让学生(Student)模仿老师(Teacher)最后一层的输出概率分布——就像老师只给学生讲授最终答案。Hinton 等人 2015 年的开创性工作就是如此。
但 PKD 发现了这个方法的盲点:学生在学习最终答案时,缺乏对推理过程的感知。BERT 的每一层都在做不同的事情——浅层捕捉词汇和句法信息,深层捕获语义和推理关系。只学习最后一层,就像学生只背答案不理解推导过程,换个题型就傻眼。
PKD 的核心创新是Patient Teacher 机制:让学生不仅学习教师的最后一层输出,还学习教师每间隔 T 层的中间表示。具体而言:
实验证明,PKD-Skip 始终优于 PKD-Last——这验证了「全程陪读」比「冲刺辅导」更有效的直觉。
损失函数设计也值得玩味。PKD 的总损失 L 由三部分组成:
三者通过超参数 α 和 β 加权求和,让学生在多条学习路径上同步前进。
该项目代码结构清晰,主要分为三大模块:
| 模块 | 文件 | 职责 |
|---|---|---|
| 训练入口 | NLI_KD_training.py | 命令行参数解析 + 训练循环 |
| 损失函数 | src/KD_loss.py | 实现 distillation_loss 和 patience_loss |
| 模型定义 | src/modeling.py | BERT编码器 + 分类头(FC/FullFC) |
| 数据处理 | src/nli_data_processing.py | GLUE 任务数据加载 + 预处理 |
| 基准测试 | run_glue_benchmark.py | 教师预测生成 + GLUE 全任务评估 |
训练流程设计得非常工程化:支持 DEBUG 模式(通过 get_predefine_argv 预设参数快速运行 RTE 任务)和命令行模式。数据目录按 data_raw、data_feat、models/pretrained 三层组织,自动管理原始数据、分词特征和预训练权重。
BERT 子模块通过 git submodule 引入 pytorch_pretrained_bert,封装了 BERT 的核心建模逻辑。该项目诞生于 2019 年 PyTorch 早期时代,依赖的是旧版 Hugging Face Transformers API(彼时还叫 pytorch_pretrained_bert),与现代版本差异较大。
PKD 在 GLUE 基准的 7 个数据集上进行了全面评估,关键数据如下:
| 模型 | SST-2 | MRPC | MNLI-m | QNLI | RTE |
|---|---|---|---|---|---|
| BERT12(教师) | 94.3 | 89.2 | 83.7 | 90.4 | 69.1 |
| BERT6—KD | 91.5 | 86.2 | 80.2 | 88.3 | 64.7 |
| BERT6—PKD | 92.0 | 85.0 | 81.5 | 89.0 | 65.5 |
| BERT6—FT | 90.7 | 85.9 | 80.4 | 86.7 | 63.6 |
可以看到,BERT6—PKD 在所有任务上都优于普通 KD 和纯微调。以 MNLI-m 为例,PKD 比 KD 提升 1.3 个百分点,相当于用一半的层数达到了教师模型 97% 的性能。
尽管 PKD 效果显著,项目本身也存在明显局限:
pytorch_pretrained_bert(非现代 Transformers),与现代生态不兼容,升级需要大量改造。data/ 目录,对新手不够友好。PKD 的影响力远超 BERT 压缩本身。它提出的 Patient Teacher 概念启发了后续大量研究,包括 TinyBERT(华为诺亚方舟)、MiniLM(微软)等模型压缩方案。这些工作都将「学习中间层知识」作为核心策略。
从工程角度看,PKD 证明了即使没有量化或剪枝,仅通过改进训练目标函数,就能在保持精度的前提下实现 2-4 倍的参数削减。这对需要在移动端或边缘设备部署 NLP 模型的团队具有直接参考价值。
如果你正在研究模型压缩或知识蒸馏,这个项目是理解 Patient Teacher 机制的绝佳起点;如果你的目标是部署轻量级 BERT,可以将 PKD 训练得到的压缩模型与现代推理框架(如 ONNX Runtime 或 llama.cpp)结合使用。