"Patient knowledge distillation for bert model compression"的论文实现。
传统的KD会导致学生模型在学习的时候只是学到了教师模型最终预测的概率分布,而完全忽略了中间隐藏层的表示,从而导致学生模型过拟合,泛化能力不足。
BERT-PKD除了进行软标签蒸馏外,还对教师模型的中间层进行蒸馏。
完整的环境可以通过以下命令安装:
conda create -n tinybert python=3.6
python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu101 --user
注:以下操作时,根目录为
model_compress/distil
如何获取数据请查阅这里
如何微调教师模型请查阅这里
为了初始化一个更好的学生模型,我们可以利用教师模型的中间层参数来初始化学生模型,而不是随机初始化一个学生模型。
执行以下命令将教师模型的某些中间层参数提取并保存,用于初始化学生模型:
FT_BERT_BASE_DIR="./models/finetuned_teacher/SST-2_epoch-3_lr-2e-5_wd-0.0001/snapshot_best"
#FT_BERT_BASE_DIR="./models/finetuned_teacher/RTE_epoch-5_lr-3e-5_wd-0.0001/snapshot_best"
#FT_BERT_BASE_DIR="./models/finetuned_teacher/MRPC_epoch-5_lr-1e-5_wd-0.001/snapshot_best"
#FT_BERT_BASE_DIR="./models/finetuned_teacher/CoLA_epoch-5_lr-1e-5_wd-0.01/snapshot_best"
#FT_BERT_BASE_DIR="./models/finetuned_teacher/QQP_epoch-5_lr-2e-5_wd-0.0001/snapshot_best"
TMP_STUDENT_DIR='./models/student_model/bert_pkd_3/SST-2'
LAYER_LIST="2,6,10"
python3 examples/bert-pkd/bert-pkd_generate_student_model.py \
--teacher_model=${FT_BERT_BASE_DIR} \
--student_model=${TMP_STUDENT_DIR} \
--layer_list=${LAYER_LIST}
临时学生模型下载链接(SST-2, RTE, MRPC, CoLA, QQP数据集)
链接: https://pan.baidu.com/s/17F8KVsLd_lMODLaVLc7yrQ 提取码: 95ir
下载并解压,将相应的模型放置到"./models/student_model/bert_pkd_3"
路径下
执行以下脚本将教师模型蒸馏到学生模型:
bash run_train_student_bert_pkd.sh
执行以下脚本进行测试:
蒸馏过的学生模型下载链接如下(SST-2数据集):
bash run_eval_student_bert_pkd.sh
在SST-2 DEV数据集上: