Home

Awesome

中文说明 | English

<p align="center"> <br> <img src="./pics/banner.png" width="600"/> <br> </p> <p align="center"> <a href="https://github.com/ymcui/LERT/blob/main/LICENSE"> <img alt="GitHub" src="https://img.shields.io/github/license/iflytek/MiniRBT.svg?color=blue&style=flat-square"> </a> </p>

在自然语言处理领域中,预训练语言模型(Pre-trained Language Models)已成为非常重要的基础技术。为了进一步促进中文信息处理的研究发展,哈工大讯飞联合实验室(HFL)基于自主研发的知识蒸馏工具TextBrewer,结合了全词掩码(Whole Word Masking)技术和知识蒸馏(Knowledge Distillation)技术推出中文小型预训练模型MiniRBT


中文LERT | 中英文PERT | 中文MacBERT | 中文ELECTRA | 中文XLNet | 中文BERT | 知识蒸馏工具TextBrewer | 模型裁剪工具TextPruner

查看更多哈工大讯飞联合实验室(HFL)发布的资源:https://github.com/iflytek/HFL-Anthology

内容导引

章节描述
简介介绍小型预训练模型所应用的技术方案
模型下载提供了小型预训练模型的下载地址
快速加载介绍了如何使用🤗Transformers快速加载模型
模型对比提供了本目录中模型的参数对比
蒸馏参数预训练蒸馏超参设置
中文基线系统效果列举了部分中文基线系统效果
两段式蒸馏方法列举了两段式蒸馏与一段式蒸馏的效果对比
预训练说明预训练代码的使用方法
使用建议提供了若干使用中文小型预训练模型的建议
FAQ常见问题答疑
引用本项目的技术报告
参考文献参考文献

简介

目前预训练模型存在参数量大,推理时间长,部署难度大的问题,为了减少模型参数及存储空间,加快推理速度,我们推出了实用性强、适用面广的中文小型预训练模型MiniRBT,我们采用了如下技术:

MiniRBT目前有两个分支模型,分别为MiniRBT-H256MiniRBT-H288,表示隐层维数256和288,均为6层Transformer结构,由两段式蒸馏得到。同时为了方便实验效果对比,我们也提供了TinyBERT结构的RBT4-H312模型下载。

我们会在近期提供完整的技术报告,敬请期待。

模型下载

模型简称层数隐层大小注意力头参数量Google下载百度盘下载
MiniRBT-h2886288812.3M[PyTorch][PyTorch]<br/>(密码:7313)
MiniRBT-h2566256810.4M[PyTorch][PyTorch]<br/>(密码:iy53)
RBT4-h312 (TinyBERT同大小)43121211.4M[PyTorch][PyTorch]<br/>(密码:ssdw)

也可以直接通过huggingface官网下载模型(PyTorch & TF2):https://huggingface.co/hfl

下载方法:点击任意需要下载的模型 → 选择"Files and versions"选项卡 → 下载对应的模型文件。

快速加载

使用Huggingface-Transformers

依托于🤗transformers库,可轻松调用以上模型。

from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained("MODEL_NAME")
model = BertModel.from_pretrained("MODEL_NAME")

注意:本目录中的所有模型均使用BertTokenizer以及BertModel加载,请勿使用RobertaTokenizer/RobertaModel!

对应的MODEL_NAME 如下所示:

原模型模型调用名
MiniRBT-H256"hfl/minirbt-h256"
MiniRBT-H288"hfl/minirbt-h288"
RBT4-H312"hfl/rbt4-h312"

模型对比

模型结构细节与参数量汇总如下。

模型层数隐层大小FFN大小注意力头数模型参数量参数量(除去嵌入层)加速比
RoBERTa12768307212102.3M (100%)85.7M (100%)1x
RBT6 (KD)676830721259.76M (58.4%)43.14M (50.3%)1.7x
RBT3376830721238.5M (37.6%)21.9M (25.6%)2.8x
RBT4-H312431212001211.4M (11.1%)4.7M (5.5%)6.8x
MiniRBT-H25662561024810.4M (10.2%)4.8M (5.6%)6.8x
MiniRBT-H28862881152812.3M (12.0%)6.1M (7.1%)5.7x

括号内参数量百分比以原始base模型(即RoBERTa-wwm-ext)为基准

蒸馏设置

模型Batch SizeTraining StepsLearning RateTemperatureTeacher
RBT6 (KD)4096100K<sup>MAX5124e-48RoBERTa-wwm-ext
RBT4-H3124096100K<sup>MAX5124e-48RoBERTa-wwm-ext
MiniRBT-H2564096100K<sup>MAX5124e-48RBT6 (KD)
MiniRBT-H2884096100K<sup>MAX5124e-48RBT6 (KD)

中文基线系统效果

为了对比基线效果,我们在以下几个中文数据集上进行了测试。

经过学习率搜索,我们验证了小参数量模型需要更高的学习率和更多的迭代次数,以下是各数据集的学习率。

最佳学习率:

模型CMRC 2018DRCDOCNLILCQMCBQ CorpusTNEWSChnSentiCorp
RoBERTa3e-53e-52e-52e-53e-52e-52e-5
*1e-41e-45e-51e-41e-41e-41e-4

*代表所有小型预训练模型 (RBT3, RBT4-H312, MiniRBT-H256, MiniRBT-H288)

实验结果(开发集):

TaskCMRC 2018DRCDOCNLILCQMCBQ CorpusTNEWSChnSentiCorp
RoBERTa87.3/6894.4/89.476.5889.0785.7657.6694.89
RBT6 (KD)84.4/64.391.27/84.9372.8388.5284.5455.5293.42
RBT380.3/57.7385.87/77.6369.8087.384.4755.3993.86
RBT4-H31277.9/54.9384.13/75.0768.5085.4983.4254.1593.31
MiniRBT-H25678.47/56.2786.83/78.5768.7386.8183.6854.4592.97
MiniRBT-H28880.53/58.8387.1/78.7368.3286.3883.7754.6292.83

相对效果:

TaskCMRC 2018DRCDOCNLILCQMCBQ CorpusTNEWSChnSentiCorp
RoBERTa100%/100%100%/100%100%100%100%100%100%
RBT6 (KD)96.7%/94.6%96.7%/95%95.1%99.4%98.6%96.3%98.5%
RBT392%/84.9%91%/86.8%91.1%98%98.5%96.1%98.9%
RBT4-H31289.2%/80.8%89.1%/84%89.4%96%97.3%93.9%98.3%
MiniRBT-H25689.9%/82.8%92%/87.9%89.7%97.5%97.6%94.4%98%
MiniRBT-H28892.2%/86.5%92.3%/88.1%89.2%97%97.7%94.7%97.8%
注意:为了保证结果的可靠性,对于同一模型,训练轮数分别设置为2、3、5、10,每组至少训练3遍(不同随机种子),汇报模型性能最大平均值。
<h2 id="two-stage">两段式蒸馏对比<sup>†</sup></h2>

我们对两段式蒸馏(RoBERTa→RBT6(KD)→MiniRBT-H256)与一段式蒸馏(RoBERTa→MiniRBT-H256)做了比较。实验结果证明两段式蒸馏效果较优。

模型CMRC 2018OCNLILCQMCBQ CorpusTNEWS
MiniRBT-H256(两段式)77.97/54.669.1186.5883.7454.12
MiniRBT-H256(一段式)77.57/54.2768.3286.3983.5553.94

<sup></sup>:该表中预训练模型经过3万步蒸馏,不同于中文基线效果中呈现的模型。

预训练

我们使用了TextBrewer工具包实现知识蒸馏预训练过程。完整的训练代码位于pretraining目录下。

代码结构

环境准备

预训练代码所需依赖库仅在python3.8,PyTorch v1.8.1下测试过,一些特定依赖库可通过pip install -r requirements.txt命令安装。

预训练模型准备

可从huggingface官网下载ltp分词模型权重与RoBERTa-wwm-ext预训练模型权重,并存放至${project-dir}/pretrained_model_path/目录下相应文件夹。

数据准备

对于中文模型,我们需先生成含有分词信息的参考文件,可直接运行以下命令:

python run_chinese_ref.py

因为预训练数据集较大,推荐生成参考文件后进行预处理,仅需运行以下命令:

python my_datasets.py

运行训练脚本

一旦你对数据做了预处理,进行预训练蒸馏就非常简单。我们在distill.sh中提供了预训练示例脚本。该脚本支持单机多卡训练,主要包含如下参数:

直接运行以下命令可实现MiniRBT-H256的预训练蒸馏:

sh distill.sh

提示:以良好的模型权重初始化有助于蒸馏预训练。在我们的实验中使用教师模型的前6层初始化助教模型RBT6(KD) ! 请参考scripts/init_checkpoint_TA.py来创建有效的初始化权重,并使用--student_pretrained_weights参数将此初始化用于蒸馏训练!

使用建议

FAQ

Q: 这个模型怎么用?
A: 参考快速加载。使用方式和HFL推出的中文预训练模型系列如RoBERTa-wwm相同。

Q:为什么要单独生成含有分词信息的参考文件?
A: 假设我们有一个中文句子:天气很好,BERT将它标记为['天','气','很','好'](字符级别)。但在中文中天气是一个完整的单词。为了实现全词掩码,我们需要一个参考文件来告诉模型应该在哪个位置添加##,因此会生成类似于['天','##气','很','好']的结果。
注意:此为辅助参考文件,并不影响模型的原始输入(即与分词结果无关)。

Q: 为什么RBT6 (KD)在下游任务中的效果相较RoBERTa下降这么多? 为什么miniRBT-H256/miniRBT-H288/RBT4-H312效果这么低?如何提升效果?
A: 上文中所述RBT6 (KD)直接由RoBERTa-wwm-ext在预训练任务上蒸馏得到,然后在下游任务中fine-tuning,并不是通过对下游任务蒸馏得到。其他模型类似,我们仅做了预训练任务的蒸馏。如果希望进一步提升在下游任务上的效果,可在fine-tuning阶段再次使用知识蒸馏。

Q: 某某数据集在哪里下载?
A: 部分数据集提供了下载地址。未标注下载地址的数据集请自行搜索或与原作者联系获取数据。

引用

如果本项目中的模型或者相关结论有助于您的研究,请引用以下文章:https://arxiv.org/abs/2304.00717

@misc{yao2023minirbt,
      title={MiniRBT: A Two-stage Distilled Small Chinese Pre-trained Model}, 
      author={Xin Yao and Ziqing Yang and Yiming Cui and Shijin Wang},
      year={2023},
      eprint={2304.00717},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}

参考文献

[1] Pre-training with Whole Word Masking for Chinese BERT (Cui et al., IEEE/ACM TASLP 2021)
[2] TextBrewer: An Open-Source Knowledge Distillation Toolkit for Natural Language Processing (Yang et al., ACL 2020)
[3] CLUE: A Chinese Language Understanding Evaluation Benchmark (Xu et al., COLING 2020)
[4] TinyBERT: Distilling BERT for Natural Language Understanding (Jiao et al., Findings of EMNLP 2020)

关注我们

欢迎关注哈工大讯飞联合实验室官方微信公众号,了解最新的技术动态。

qrcode.png

问题反馈

如有问题,请在GitHub Issue中提交。