DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter - 中文验证版
英文原文卡片:distilbert_2019.md
状态:已翻译。
元数据
- Slug:
distilbert_2019 - 年份: 2019
- 会议: NeurIPS Workshop
- 作者: Victor Sanh et al.
- 阅读状态: read complete
- 计算范式: 高效推理与边缘部署(
efficient_edge_inference) - 主要来源: PDF、抽取文本
计算设置
论文明确给出了预训练和推理设备。DistilBERT 在英文 Wikipedia 加上 Toronto Book Corpus 上,在"8 块 16GB V100 GPUs"上训练约 90 小时。训练配方使用动态 masking,去掉 next sentence prediction,并依赖梯度累积以达到非常大的有效 batch,每个 batch 最多 4K 样本。论文将此与 RoBERTa 进行对比,后者报告需要 1 天在 1024 块 32GB V100 GPUs 上完成,因此蒸馏降低了加速器门槛,但并没有使预训练变得免费。
对于推理,论文在 GLUE STS-B 上以 batch size 1 测量了完整的单遍推理时间,使用 Intel Xeon E5-2690 v3 Haswell 2.9GHz。它还构建了一个问答应用,并在 iPhone 7 Plus 上比较了 BERT-base 和 DistilBERT,在测量的神经推理时间中排除了分词环节。
瓶颈
BERT-base 足够大,给部署预算带来压力:110M 参数,深层 Transformer block 堆栈,每个 token 和每一层都要运行注意力和 MLP 层。论文将不断增长的计算和内存需求视为更广泛采用的障碍。瓶颈不仅是训练 FLOPs;它还包括参数存储、通过多层传递的激活以及小 batch 推理延迟。
STS-B CPU 测量暴露了 batch-size-one 的情况,即 batching 无法掩盖每层开销。iPhone QA 测量增加了本地存储和内存压力。DistilBERT 针对 BERT 中最直接影响 wall-clock 时间的部分:深度。作者指出,改变 hidden size 对计算效率的影响小于改变层数等因素,因为许多线性代数 kernel 已经高度优化。
方法适配
DistilBERT 保留了 BERT Transformer 布局,但使 student 更浅。它去掉了 token-type embeddings 和 pooler,并将层数减少一半。这保留了 BERT 密集 GEMM 友好的结构,同时减少了顺序进行的层归一化、注意力和前馈传递的次数。
训练受到相同限制的塑造。DistilBERT 从 BERT 的 soft token 预测、masked language modeling 以及对齐 student 和 teacher 隐藏状态方向的 cosine loss 中学习。它从每隔一层的 teacher 层初始化,利用共享的 hidden dimensionality,并使用梯度累积在 8 块 V100 上达到最多 4K 样本的有效 batch。
证据
主要证据是规模/延迟/准确率的权衡。在 GLUE dev 上,BERT-base 得分 79.5,DistilBERT 得分 77.0,概括为保留了 BERT 97% 的性能,参数减少 40%。在下游任务上,BERT-base 报告 IMDb 准确率 93.46,SQuAD EM/F1 为 81.2/88.5;DistilBERT 报告 IMDb 92.82,SQuAD 77.7/85.8,通过额外的 SQuAD 蒸馏步骤改善至 79.1/86.9。
计算证据是直接的。在 Table 3 中,ELMo 有 180M 参数,STS-B CPU 单遍推理耗时 895 秒;BERT-base 有 110M 参数,耗时 668 秒;DistilBERT 有 66M 参数,耗时 410 秒。对于移动端 QA,排除分词,DistilBERT 在 iPhone 7 Plus 上比 BERT-base 快 71%,模型在量化前为 207 MB。消融表支持该配方:相比带 teacher 初始化的 triple loss,随机初始化损失 GLUE 宏平均得分 3.69 分。
历史影响
DistilBERT 帮助将预训练模型压缩变成了一个默认的 NLP 工程模式。它在预训练阶段应用蒸馏,并将其直接绑定到部署指标:更少的参数、更低的 CPU 延迟、更低的移动端延迟,以及有望随应用一起发布到手机端的模型大小。计算教训是压缩应以主导的运行时维度为目标。对于 BERT 式编码器,深度是一个顺序依赖链,因此将层减半所获得的延迟收益是小幅 hidden-size 变化可能无法实现的。
局限
压缩是显著的,但不是绝对的。一个 207 MB 的模型对于移动端分发仍可能很大,作者指出量化可以进一步减小它。iPhone 计时排除了分词,因此端到端延迟取决于预处理和服务代码。DistilBERT 也放弃了一些任务准确率:在任务特定蒸馏之前,SQuAD 损失了几个 EM/F1 点,RTE 比 BERT-base 弱得多。
训练硬件也不可忽视。8 块 16GB V100 运行约 90 小时虽然比某些同时代的大规模预训练运行便宜得多,但它仍然是集群训练而非普通笔记本电脑训练。DistilBERT 应被理解为一种高效的部署和复用策略,而非声称可以不依赖加速器支持的预训练就产生高质量的预训练编码器。
链接
- 所属计算范式:compute spine
- 计算范式:efficient_edge_inference
- 方法索引:distillation、transformer
- Ledger 更新:compute bottlenecks