BERT and Knowledge Distillation

知识蒸馏

知识蒸馏(Knowledge Distillation,KD)是想将复杂模型(teacher network)中的暗知识(dark knowledge)迁移到简单模型(student network)中。一般来说,老师网络具有强大的能力和表现,而学生网络则更为紧凑。通过知识蒸馏,希望学生网络能尽可能逼近亦或是超过老师网络,从而用复杂度更小的模型来获得类似的预测效果。Hinton在Distilling the Knowledge in a Neural Network一文中首次提出了知识蒸馏的概念,通过引入老师网络的软目标(soft targets)以诱导学生网络的训练。

在具体了解知识蒸馏的具体流程前,我们首先回顾一下四个常见的损失函数:Softmax、log_softmax、NLLLoss和CrossEntropy。

  • Softmax:Softmax广泛的应用于分类问题中,它输入一个实数向量并返回一个表示类别可能性的概率分布,其中每个元素都是非负的,且所有元素总和为1。 Softmax ( x ) = exp ⁡ ( x i ) ∑ j exp ⁡ ( x j ) \text{Softmax}(x) = \frac{\exp(x_{i})}{\sum_{j}\exp(x_{j})} Softmax(x)=jexp(xj)exp(xi)
  • log_softmax:即对softmax处理后的结果做一次对数运算
  • NNLLoss(negtive log likelihood losss):若 x i = [ q 1 , q 2 , . . . , q N ] x_{i}=[q_{1},q_{2},...,q_{N}] xi=[q1,q2,...,qN]为网络的第 i i i个输出, y i y_{i} yi为真实标签,那么有: f ( x i , y i ) = − q y i f(x_{i},y_{i})= -q_{y_{i}} f(xi,yi)=qyi
  • CrossEntropy:对于 N N N分类问题一个特定的样本,已知其真实标签,CrossEntropy的计算公式为: c r o s s _ e n t r o p y = − ∑ k = 1 N ( p k log ⁡ q k ) cross\_entropy=-\sum_{k=1}^{N}\left(p_{k} \log q_{k}\right) cross_entropy=k=1N(pklogqk)

其中 p p p表示真实值,在这个公式中是one-hot形式;q是经过softmax计算后的结果, q k q_k qk为神经网络认为该样本为第 k k k类的概率。
若该样本的真实标签为 y y y,则交叉熵的公式可变形为: c r o s s _ e n t r o p y = − ∑ k = 1 N ( p k log ⁡ q k ) = − l o g   q y cross\_entropy=-\sum_{k=1}^{N}\left(p_{k} \log q_{k}\right)=-log \, q_{y} cross_entropy=k=1N(pklogqk)=logqy

Softmax函数在多分类问题中预测样本的类别时通常会有分布尖锐的问题,即输出的概率分布只在某一类别上分配很大的概率值,这就可能导致模型把注意力集中于较大的概率上,而忽略了值较小的概率,从而使得模型的泛化性能下降。而为了使softmax输出的概率分布更加的平缓,改造后的softmax函数中加入了温度参数T,即 q i = exp ⁡ ( z i / T ) ∑ j exp ⁡ ( z j / T ) q_{i}=\frac{\exp(z_{i}/T)}{\sum_{j} \exp(z_{j} /T)} qi=jexp(zj/T)exp(zi/T)
其中 T T T的值越大,softmax输出的概率分布就越平缓,它所包含的分类信息就越多。

下面通过一个简单的例子来说一下知识蒸馏是如何进行的。如下图所示,此时我们需要对图片进行分类,即判断它是Dog、Cat和Car中的哪一类,对应的类标签采用one-got向量表示。模型此时存在老师网络和学习网络两个模型,其中学生网络更为简单,因此如果直接使用学生网络进行分类时,它会给出判断图片具体属于哪一类,是狗是猫还是汽车。学生网络若只是单纯的进行训练,模型希望预测的类标签尽可能和真实标签一致,通常称为硬目标(hard target),对应的损失函数记为 L o s s h a r d = ( p , q ) Loss_{hard} = (p,q) Losshard=(p,q)。但由于学生网络本身较为简单,因此分类的效果通常来说并不好。因此,此时就需要老师网络的输出信息来提供指导。

老师网络同样采用相同的数据进行训练,但它的softmax输出记为 q ′ q' q q ′ q' q的概率分布并不平缓。因此, q ′ q' q需要经过一个“蒸馏”的过程使得它的分布更加的平缓,这样的方式得到的结果称为软目标(soft target)。因此,如果有老师网络的帮助,学生网络的输出分布也应和 q ′ ′ q'' q接近,即希望它也可以学习到老师的知识,那么对应的损失函数记为 L o s s s o f t = ( q ′ , q ′ ′ ) Loss_{soft} = (q',q'') Losssoft=(q,q)

所以实际上学生网络对应的损失包含两部分: L O S S = L o s s h a r d + L o s s + s o f t LOSS = Loss_{hard} + Loss+{soft} LOSS=Losshard+Loss+soft
在这里插入图片描述

以上内容学习自B站不相识不打同学的《神经网络知识蒸馏》,本人做的只是总结和转述,十分感谢,有兴趣的可以自行观看~

知识蒸馏广泛的应用了深度学习的各个领域,这里只是做简单的介绍,有兴趣的可以阅读更多相关的文章。

Like What You Like: Knowledge Distill via Neuron Selectivity Transfer
Training Shallow and Thin Networks for Acceleration via Knowledge Distillation with Conditional Adversarial Networks
Deep Mutual Learning
Born Again Neural Networks
知识蒸馏是什么?一份入门随笔


BERT等预训练模型两个重要的发展方向便是两个极端:不断地加数据量、算力和模型的容量


在这里插入图片描述

但是这样的方式只能是大公司的游戏,而且就算有预训练的模型放出来,fine-tune后推断所需的时间的也是很长的。另一个方向便是在不损失模型性能的同时尽可能的减少模型训练所需的参数量,这时模型压缩就发挥了很大的作用,例如量化权重剪枝知识蒸馏等。而知识蒸馏作为模型压缩中一种重要的手段,研究人员便尝试将BERT和知识蒸馏进行结合,最后得到的模型容量大大的减少了,同时模型在下游任务的效果又不受太多的影响。


DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter

DistilBERT是huggingface公司发表于NIPS 2019 上的成果,它就是使用知识蒸馏技术来训练一个小型化的BERT,模型的大小减少了40%,虽然性能降低了约3%,但是推断的速度提升了60%。


在这里插入图片描述

它具体的做法如下:

  • 利用Google原始的BERT作为老师网络
  • 学生网络是在BERT-base的基础上只使用一半的层数
  • 同时利用老师网络的输出做软目标和老师网络本身 hidden layer 的参数来同时提供指导信息训练学生网络

另外蒸馏过程涉及的损失项这里是三个,如下所示:

  • L c f L_{cf} Lcf:传统知识蒸馏中老师网络和学生网络的输出经过softmax后分布的交叉熵
  • L m l m L_{mlm} Lmlm:学生网络本身的softmax输出和真实标签的交叉熵
  • L c o s L_{cos} Lcos:这个是新加的,计算的是老师网络和学生网络每个 hidden layer 输出之间的余弦相似度

Distilling Task-Specific Knowledge from BERT into Simple Neural Networks


在这里插入图片描述

DistilBERT是将小型的多层Transformer来做学生网络,这样蒸馏过程所需的算力仍然是不晓得,因此,本文学生网络选择了更为简单的BiLSTM。其中BiLSTM针对于单句分类和句子对分类分别使用了两种类别的模型。

针对于单句分类问题,作者是将句子所有的词作为BiLSTM的输入,然后将前向和后向的状态进行拼接后通过全连接层进行分类。


在这里插入图片描述

针对于句子对的分类,首先分别得到两个句子的表示向量,然后做拼接后再进行分类,拼接的公式为: f ( h 1 , h 2 ) = [ h 1 , h 2 , h 1 ⊙ h 2 , ∣ h 1 − h 2 ∣ ] f\left(h_{1}, h_{2}\right)=\left[h_{1}, h_{2}, h_{1} \odot h_{2},\left|h_{1}-h_{2}\right|\right] f(h1,h2)=[h1,h2,h1h2,h1h2]


在这里插入图片描述

除了两种类型的学生网络外,文中还提出了三种数据增广的方法:

  • MASK:使用 [ M A S K ] [MASK] [MASK]随机替换某个词
  • POS-guided word replacement:使用命名实体标签一样的词进行替换
  • n-gram:从 { 1 , 2 , . . . , 5 } \{1,2,...,5\} {1,2,...,5}随机选择数做为 n 进行替换 n-gram 的替换

实验效果如下所示:


在这里插入图片描述

还有比较有代表性的就是Google的AlBERT和华为的TinyBERT,有兴趣的可以浏览以下的博文。

NLP中的预训练语言模型(四)—— 小型化bert(DistillBert, ALBERT, TINYBERT)
加速BERT模型有多少种方法?从架构优化、模型压缩到模型蒸馏,最新进展详解!
BERT 瘦身之路:Distillation,Quantization,Pruning
更小的模型!迈向更快更环保的NLP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
知识蒸馏(Knowledge Distillation)是一种将一个较大的模型的知识转移到一个较小的模型的技术。这种技术通常用于减小模型的大小和推理成本,同时保持模型在任务上的性能。 在Python中,你可以使用以下步骤来实现知识蒸馏: 1. 准备教师模型和学生模型:首先,你需要准备一个较大的教师模型和一个较小的学生模型。教师模型通常是一个预训练的大型模型,例如BERT或其他深度学习模型。学生模型是一个较小的模型,可以是一个浅层的神经网络或者是一个窄的版本的教师模型。 2. 训练教师模型:使用标注数据或其他训练数据集来训练教师模型。这个步骤可以使用常规的深度学习训练方法,例如反向传播和随机梯度下降。 3. 生成教师模型的软标签:使用教师模型对训练数据进行推理,并生成教师模型的软标签。软标签是对每个样本的预测概率分布,而不是传统的单一类别标签。 4. 训练学生模型:使用软标签作为学生模型的目标,使用训练数据集来训练学生模型。学生模型的结构和教师模型可以不同,但通常会尽量保持相似。 5. 进行知识蒸馏:在训练学生模型时,除了使用软标签作为目标,还可以使用教师模型的中间层表示或其他知识来辅助学生模型的训练。这可以通过添加额外的损失函数或使用特定的蒸馏算法来实现。 以上是实现知识蒸馏的一般步骤,具体实现细节可能因应用场景和模型而有所不同。你可以使用深度学习框架(如TensorFlow、PyTorch等)来实现这些步骤,并根据需要进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值