以下经验来源于token-classification任务,主要针对bert-alike模型,迁移到其他场景时不一定有用 涉及到的可调节部分
- 模型的骨架:尽量选取大参数量的模型骨架,一般情况下参数量越多,在经过合适训练后,其上限也会越高
- 模型的初始化方式
- fine-tune后的模型权重:一般而言,在fine-tune效果比较好的时候,用这个比较合适,且可以直接使用全部的参数。但跨任务时效果无保证
- 预训练模型权重: 仅可以利用共享的transformer层,但迁移的知识比较普适,一般都可以当作baseline
简而言之,用fine-tune模型的权重初始化最大收益大,用预训练模型权重较稳定
- 模型的训练参数:与常规fine-tune无区别,用同样的思路选取learning-rate, weight decay, batch size即可
默认蒸馏loss由teacher loss,student loss 和intermediate layers loss三部分组成
- 温度常数T调节 由于T本质起到的作用是平滑logits,温度常数越大,logits越平滑,老师模型对最后loss的影响就越小,但学生模型的训练效果 与温度常数的关系应该是凸函数,存在一个极值使得蒸馏效果达到最好
- 中间层跟踪
- 中间层形状一样:个人经验中间层具体哪儿对哪个无所谓,只要满足头对头尾对尾
举两个例子除了这样一层对一层,也可以多层对一层# T: Roberta(12 layers) S: Roberta-tiny(4-layers) layer_T: 0 layer_S: 0 layer_T: 4 layer_S: 1 layer_T: 8 layer_S: 2 layer_T: 11 layer_S: 3 # T: Roberta-large(24 layers) S: Roberta(12-layers) layer_T: 0 layer_S: 0 layer_T: 2 layer_S: 1 ....... layer_T: 20 layer_S: 10 layer_T: 23 layer_S: 11
- 中间层形状不一样:用一维的卷积核把老师模型的中间层降维即可(参考华为tinybert操作)
- 中间层形状一样:个人经验中间层具体哪儿对哪个无所谓,只要满足头对头尾对尾
模型的参数选取 | 蒸馏设定 | 初始化方式 | 产出模型表现 |
---|---|---|---|
T:Electra(24 layers), S:tinyElectra(12 layers) | 10 | 预训练权重 | |
T:Roberta-large(24 layers), S: Roberta(12 layers) | 10 | 预训练权重 | |
T:Roberta-large(24 layers), S: Roberta(12 layers) | 10 | 多任务模型的fine-tune权重 | |
T:Roberta-large(24 layers), S: Roberta(6 layers) | 15 | 预训练权重 | |
T:Roberta-large(12 layers), S: Roberta(4 layers) | 15 | 多任务模型的fine-tune权重 |