深度学习:蒸馏Distill

Distilling the knowledge in a neural network

Hinton 在论文中提出方法很简单,就是让学生模型的预测分布,来拟合老师模型(可以是集成模型)的预测分布,其中可通过用 logits 除以 temperature 来调节分布平滑程度,还避免一些极端情况影响。

Note: 参数参考:hard权重0.8,soft权重0.2(soft权重一般不要超过0.5)。 

蒸馏时的softmax

对于一个分类问题,定义soft label为模型的输出(即不同label的概率), hard label为最终正确的label(也就是ground truth),通常是通过最大化正确label的概率来进行学习的,但是不正确趋近于0的label也是有大有小的,这被称为"暗知识(Dark Knowledge)",这也反应了模型的泛化能力。但因为过于趋近0不利于student模型学习,为了让student也容易学习tearcher的输出,引入了带温度T的softmax概率为

比之前的softmax多了一个参数T(temperature),T越大产生的概率分布越平滑。
[Distilling the knowledge in a neural network]

蒸馏自由度还是很大的,并不需要一定按照 Hinton 最初论文里一样只对最后输出进行拟合,只要能让学生模型从老师模型中学习到东西就行。

DistilBert

DistillBert的做法相比bert-pkd就比较简单直接,还是保证模型的宽度不变,模型深度减为一半。主要在初始化和损失函数上下了功夫:

  • 损失函数:采用知识蒸馏损失、Masked Language Model损失和cosine embedding损失加起来的值。
  • 初始化:用Teacher模型的参数进行初始化,不过是从每两层中找一层出来。

Student architecture

和BERT类似,只是layer的数量减半
Student initialization

因为Student模型和Teacher模型每层的layer一样,因此每两层保留一层,利用相关的参数
Distillation

采用了RoBERTa的优化策略,动态mask,增大batch size,取消NSP任务的损失函数,
Training Loss

    The final training objective is a linear combination of the distillation loss L_{ce}  with the supervised training loss, in our case the masked language modeling loss L_{mlm}  We found it beneficial to add a cosine embedding loss ( L_{cos} ) which will tend to align the directions of the student and teacher hidden states vectors.

最终的loss由三部分构成

    1 蒸馏损失,即 L_ce = ∑ t i ∗ log ( s_i ), 其中 s_i 是student输出的概率, t_i 是teacher输出的概率,当BERT预测的 t_i​越高,而DistilBERT预测s_i越低,得到的Loss就会越高
    2 Mask language model loss,参考BERT,这部分也就是为hard loss
    3 Cosine Embedding Loss,利于让student学习和teacher一样的hidden state vector

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

[DistilBert解读]

[模型训练损失值不变_Bert与模型蒸馏: PKD和DistillBert]

BERT-PKD (Patient Knowledge Distillation)

在hinton提到两个损失之上,再加上一个loss:L_PT。

PKD论文中做了对比,减少模型宽度和减少模型深度,得到的结论是减少宽度带来的efficiency提高不如减少深度来的更大。

论文所提出的多层蒸馏,即Student模型除了学习Teacher模型的概率输出之外,还要学习一些中间层的输出。论文提出了两种方法,第一种是Skip模式,即每隔几层去学习一个中间层,第二种是Last模式,即学习teacher模型的最后几层。如果是完全的去学习中间层的话,那么计算量很大。为了避免这个问题,我们注意到Bert模型中有个特殊字段[CLS],因为其在 BERT 分类任务中的重要性,在蒸馏过程中,让student模型去学习[CLS]的中间的输出,计算过程是先归一化,然后直接 均方差MSE 求损失。

Note:

1 至于学生模型中间层如何与老师模型中间层对应,论文中发现最佳策略是直接按倍数取老师模型对应层就行,比如1对2,2对4这样。

2 初始化的话就采用Teacher模型的前几层来做初始化。

3 更好的teacher模型会带来增长么?答案是不会的,可以看上图,把12层的Bert模型换成了24层的Bert模型,反而导致效果变差。究其原因,可能是因为在实验中,我们使用Teacher模型的前N层来初始化Student模型,对于24层模型来说,前N层更容易导致不匹配。而更好的方法则是Student模型先训练好,再去学Teacher模型。

[Patient Knowledge Distillation for BERT Model Compression]

TinyBERT

华为的 TinyBERT,比起上面的 PKD 只是对中间层 [CLS] 进行拟合,它更深入了一步。对 BERT 全范围进行拟合,词向量层,中间隐层,中间注意力矩阵,最后预测层。

在BERT 预训练阶段 和 Fine-tune阶段 分别做蒸馏,如下所示:

其中Transformer Distillation 在预训练和 fine-tune 阶段都是一样的,分为三个部分:

Note: 式11分别是所有token的 embedding、hidden layer outputs 和 attention matrix的MSE loss,L_pred 是 hinton 的dark knowledge。

在 预训练阶段 和 Fine-tune阶段 都仅使用了蒸馏的loss,而没有使用 MLM loss 和 分类 CE loss。

[TinyBERT:模型小7倍,速度快8倍,华中科大、华为出品]

[TinyBERT: Distilling BERT for Natural Language Understanding, Xiaoqi Jiao et al.  EMNLP(findings), 2020 [code]]

from: -柚子皮-

ref: [BERT 瘦身之路:Distillation,Quantization,Pruning]

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. TensorBoard 2. Neural Network Playground 3. D3.js 4. Bokeh 5. Matplotlib 6. Seaborn 7. Plotly 8. Altair 9. ggplot 10. Highcharts 11. Tableau 12. Power BI 13. Google Charts 14. Flourish 15. Chart.js 16. Leaflet 17. Mapbox 18. Deck.gl 19. Vis.js 20. Three.js ### 回答2: 推荐20种可视化深度学习模型的工具: 1. TensorBoard:TensorFlow开发的可视化工具,适用于可视化训练过程中的模型结构、参数和性能等信息。 2. Keras Visualization Toolkit:Keras库提供的一系列可视化工具,包括模型结构可视化、特征可视化和激活可视化等。 3. Netron:一个轻量级的模型可视化工具,支持多种深度学习框架的模型文件可视化。 4. TensorFlow Playground:一个基于Web的交互式可视化工具,用于探索和理解深度学习模型的行为。 5. CaffeVis:Caffe框架的可视化工具,可用于可视化模型中的特征映射和过滤器。 6. MXNet Visualization Toolkit:MXNet库提供的一系列可视化工具,包括网络结构可视化和训练过程可视化。 7. DeepLearning4J:一个跨平台的深度学习库,提供了可视化模型训练过程的功能。 8. NN-SVG:一个用于生成神经网络结构的SVG图像的工具,可用于可视化深度学习模型。 9. Deep Visualization Toolbox:一个基于Matplotlib和Scipy的可视化工具包,用于可视化深度学习模型的特征和权重。 10. Gephi:一个图可视化工具,可以用于可视化深度学习模型中的关系网络。 11. T-SNE:一个用于高维数据降维可视化的算法,可用于可视化深度学习模型中的隐藏层表示。 12. Lucid:一个用于可视化和解释深度神经网络的库,支持多种深度学习框架。 13. PlotNeuralNet:一个用于绘制神经网络结构的Python库,可用于可视化深度学习模型。 14. PyTorch Geometric:一个用于处理图形数据的PyTorch扩展库,可用于可视化和处理图神经网络。 15. DeepArt:一个用于可视化深度学习模型生成艺术作品的工具。 16. DeepExplain:一个用于解释深度学习模型预测结果的工具,提供了多种可视化解释方法。 17. LIME:一个用于可视化解释机器学习模型预测结果的工具,适用于解释深度学习模型。 18. Distill:一个在线期刊,专注于可视化和解释深度学习模型的方法和工具。 19. ModNet:一个用于可视化深度学习模型中的模组化结构的工具。 20. DeepDream:一个用于生成迷幻效果图像的工具,可以用于可视化深度学习模型的激活模式。 ### 回答3: 以下是我推荐的20种可视化深度学习模型的工具: 1. TensorFlow:Google开发的开源深度学习框架,提供了丰富的可视化功能,包括模型结构、损失函数和训练过程的可视化。 2. Keras:基于TensorFlow和Theano的高级神经网络API,也提供了可视化工具,可用于展示神经网络架构和训练进程。 3. PyTorch:Facebook开发的开源深度学习框架,提供了一种可视化工具叫做TensorBoardX,通过它可以可视化模型训练过程。 4. D3.js:一个灵活的JavaScript库,可用于创建各种可视化图表和交互式界面,可以用于可视化深度学习模型的结构、权重等信息。 5. Matplotlib:Python的一个绘图库,可以用于绘制各种图表和可视化深度学习模型的训练结果。 6. Seaborn:Python的一个统计数据可视化库,可以用于绘制各种统计图表,并进行模型结果的可视化。 7. Plotly:一种交互式数据可视化工具,可以生成各种图表和地图,并支持在网页上进行交互。 8. Graphviz:一个用于可视化图形结构的开源图形绘制库,可以用于可视化深度学习模型的结构和运算流程。 9. Gephi:一种用于网络可视化和分析的开源软件,可以用于可视化深度学习模型的结构和拓扑关系。 10. TensorBoard:TensorFlow提供的用于可视化训练过程的工具,可以展示模型结构和性能指标。 11. Deep playground:一个基于TensorFlow.js的在线工具,可以用于可视化深度学习模型的训练和测试。 12. Netron:一个用于可视化深度学习模型结构的工具,支持多种深度学习框架和模型格式。 13. Cytoscape:一个用于生物网络分析和可视化的开源软件,可以用于可视化深度学习模型的结构和拓扑关系。 14. WebGazer:一个用于可视化神经网络模型结构和可视化训练过程的网页工具。 15. TensorSpace:一个用于可视化深度学习模型的开源库,支持多种深度学习框架,并提供了丰富的可视化效果。 16. Neon:一个用于可视化深度学习模型的Python库,提供了多种图表和可视化效果。 17. NetScope:一个用于可视化深度学习模型结构的工具,支持多种深度学习框架。 18. TensorFlow Debugger:一个用于可视化和调试TensorFlow模型的工具,可以查看模型中的各个节点和张量的值。 19. MXNet:一个开源的深度学习框架,提供了可视化工具用于展示模型结构和训练过程。 20. Wandb:一个用于可视化深度学习模型训练过程的在线平台,可以展示训练指标、超参数等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值