Bert知识蒸馏系列(一):什么是知识蒸馏

2020 年 10 月 15 日 AINLP

欢迎转载,同时欢迎关注我的仓库,有我更多的NLP文章合辑:

https://github.com/DA-southampton/NLP_ability

接下来要写的系列文章如下

  1. 什么是知识蒸馏

  2. TextCNN如何逼近Bert

  3. Bert蒸馏到简单网络Bilstm

  4. PKD多层知识蒸馏

  5. 基于模块替换的bert-of-theseus

  6. FastBert-CPU推理加速10倍

什么是蒸馏

一般来说,为了提高模型效果,我们可以使用两种方式。一种是直接使用复杂模型,比如你原来使用的TextCNN,现在使用Bert。一种是多个简单模型的集成,这种套路在竞赛中非常的常见。

这两种方法在离线的时候是没有什么问题的,因为不涉及到实时性的要求。但是一旦涉及到到部署模型,线上实时推理,我们需要考虑时延和计算资源,一般需要对模型的复杂度和精度做一个平衡。

这个时候,我们就可以将我们大模型学到的信息提取精华灌输到到小模型中去,这个过程就是蒸馏。

什么是知识

对于一个模型,我们一般关注两个部分:模型架构和模型参数。

简答的说,我们可以把这两个部分当做是我们模型从数据中学习到的信息或者说是知识(当然主要是参数,因为架构一般来说是训练之前就定下来的)

但是这两个部分,对于我们来说,属于黑箱,就是我们不知道里面究竟发生了什么事情。

那么什么东西是我们肉眼可见的呢?从输入向量到输出向量的一个映射关系是可以被我们观测到的。

简单来说,我输入一个example,你输出是一个什么情况我是可以看到的。

区别于标签数据格式 [0,0,1,0],模型的输出结果一般是这样的:[0.01,0.01,0.97,0.01]。

举个比较具象的例子,就是如果我们在做一个图片分类的任务,你的输入图像是一辆宝马,那么模型在宝马这个类别上会有着最大的概率值,与此同时还会把剩余的概率值分给其他的类别。

这些其他类别的概率值一般都很小,但是仍然存在着一些信息,比如垃圾车的概率就会比胡萝卜的概率更高一些。

模型的输出结果含有的信息更丰富了,信息熵更大了,我们进一步的可以把这种当成是一种知识,也就是小模型需要从大模型中学习到的经验。

为什么知识蒸馏可以获得比较好的效果

在前面提到过,卡车和胡萝卜都会有概率值的输出,但是卡车的概率会比胡萝卜大,这种信息是很有用的,它定义了一种丰富的数据相似结构。

上面谈到一个问题,就是不正确的类别概率都比较小,它对交叉熵损失函数的作用非常的低,因为这个概率太接近零了,也就是说,这种相似性存在,但是在损失函数中并没有充分的体现出来。

第一种就是,使用sofmax之前的值,也就是logits,计算损失函数

第二种是在计算损失函数的时候,使用温度参数T,温度参数越高,得到的概率值越平缓。通过升高温度T,我们获取“软目标”,进而训练小模型

其实对于第一种其实是第二种蒸馏方式的的一种特例情况,论文后续有对此进行证明。

这里的温度参数其实在一定程度上和蒸馏这个名词相呼应,通过升温,提取精华,进而灌输知识。

带温度参数T的Softmax函数

软化公式如下:

说一下为什么需要这么一个软化公式。上面我们谈到,通过升温T,我们得到的概率分布会变得比较平缓。

用上面的例子说就是,宝马被识别为垃圾车的概率比较小,但是通过升温之后,仍然比较小,但是没有那么小(好绕口啊)。

也就是说,数据中存在的相似性信息通过升温被放大了,这样在计算损失函数的时候,这个相似性才会被更大的注意到,才会对损失函数产生比较大的影响力。

损失函数

损失函数是软目标损失函数和硬目标损失函数的结合,一般来说,软目标损失函数设置的权重需要大一些效果会更好一点。

如何训练

整体的算法示意图如下:

整体的算法示意图如上所示:

  1. 首先使用标签数据训练一个正常的大模型

  2. 使用训练好的模型,计算soft targets。

  3. 训练小模型,分为两个步骤,首先小模型使用相同的温度参数得到输出结果和软目标做交叉熵损失,其次小模型使用温度参数为1,和标签数据(也就是硬目标)做交叉损失函数。

  4. 预测的时候,温度参数设置为1,正常预测。




由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方"AINLP",进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心


欢迎加入预训练模型交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注预训练模型

推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
3

相关内容

少即是多?非参数语言模型,68页ppt
专知会员服务
20+阅读 · 2020年11月22日
【EMNLP2020】序列知识蒸馏进展,44页ppt
专知会员服务
38+阅读 · 2020年11月21日
【NeurIPS 2020】依图推出预训练语言理解模型ConvBERT
专知会员服务
11+阅读 · 2020年11月13日
【CVPR2020】跨模态哈希的无监督知识蒸馏
专知会员服务
59+阅读 · 2020年6月25日
最新《知识蒸馏》2020综述论文,20页pdf,悉尼大学
专知会员服务
156+阅读 · 2020年6月14日
BERT技术体系综述论文:40项分析探究BERT如何work
专知会员服务
137+阅读 · 2020年3月1日
模型压缩 | 知识蒸馏经典解读
AINLP
9+阅读 · 2020年5月31日
BERT 瘦身之路:Distillation,Quantization,Pruning
基于知识蒸馏的BERT模型压缩
大数据文摘
18+阅读 · 2019年10月14日
ACL 2019 | 理解 BERT 每一层都学到了什么
THU数据派
9+阅读 · 2019年9月9日
一步步理解BERT
AINLP
34+阅读 · 2019年6月19日
BERT-预训练的强大
微信AI
60+阅读 · 2019年3月7日
如何用最强模型BERT做NLP迁移学习?
AI100
3+阅读 · 2019年2月3日
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
人工智能前沿讲习班
4+阅读 · 2018年11月15日
详细解读谷歌新模型 BERT 为什么嗨翻 AI 圈
人工智能头条
10+阅读 · 2018年10月25日
Arxiv
0+阅读 · 2020年11月28日
Arxiv
3+阅读 · 2019年11月28日
Arxiv
20+阅读 · 2019年9月7日
Arxiv
11+阅读 · 2019年6月19日
How to Fine-Tune BERT for Text Classification?
Arxiv
13+阅读 · 2019年5月14日
Arxiv
12+阅读 · 2019年2月28日
VIP会员
相关VIP内容
相关资讯
模型压缩 | 知识蒸馏经典解读
AINLP
9+阅读 · 2020年5月31日
BERT 瘦身之路:Distillation,Quantization,Pruning
基于知识蒸馏的BERT模型压缩
大数据文摘
18+阅读 · 2019年10月14日
ACL 2019 | 理解 BERT 每一层都学到了什么
THU数据派
9+阅读 · 2019年9月9日
一步步理解BERT
AINLP
34+阅读 · 2019年6月19日
BERT-预训练的强大
微信AI
60+阅读 · 2019年3月7日
如何用最强模型BERT做NLP迁移学习?
AI100
3+阅读 · 2019年2月3日
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
人工智能前沿讲习班
4+阅读 · 2018年11月15日
详细解读谷歌新模型 BERT 为什么嗨翻 AI 圈
人工智能头条
10+阅读 · 2018年10月25日
Top
微信扫码咨询专知VIP会员