BERT知识蒸馏Distilled BiLSTM

BERT知识蒸馏Distilled BiLSTM

1. 概述

随着BERT模型的提出,在NLP上的效果在不断被刷新,伴随着计算能力的不断提高,模型的深度和复杂度也在不断上升,BERT模型在经过下游任务Fine-tuning后,由于参数量巨大,计算比较耗时,很难真正上线使用。这些基于Transformer模型的提出,包括BERT,GPT等,那么对于传统的NLP方法,如RNN,LSTM,TextCNN是不是就已经过时了呢?结合知识蒸馏的思想,Distilled BiLSTM[1]将BERT模型当作Teacher模型,对Fine-tuned BERT进行蒸馏,使得蒸馏得到的Student模型BiLSTM模型与ELMo模型具有相同的效果,但是参数量却减小了100倍,同时,计算时间缩短了15倍。

2. 算法原理

2.1. 知识蒸馏

知识蒸馏(knowledge distillation)[2]是模型压缩的一种常用的方法,对于一个完整的知识蒸馏过程,有两个模型,分别为Teacher模型和Student模型,通过学习将已经训练好的Teacher模型中的知识迁移到小的Student模型中。其具体过程如下图所示:

www.zeeklog.com  - BERT知识蒸馏Distilled BiLSTM


对于Student模型,其目标函数有两个,分别为蒸馏的loss(distillation loss)和自身的loss(student loss),Student模型最终的损失函数为:

L = α L s o f t + β L h a r d L=\alpha L_{soft}+\beta L_{hard} L=αLsoft​+βLhard​

2.2. Distilled BiLSTM

在对BERT蒸馏过程中,选择了两个特定的任务,一个是分类任务,另一个则是句子对任务。

2.2.1. Teacher模型

在Distilled BiLSTM,Teacher网络为Fine-tuned BERT模型,BERT模型的结构如下图所示:

www.zeeklog.com  - BERT知识蒸馏Distilled BiLSTM

假设BERT模型对句子抽取出的向量为 h ∈ R d \mathbf{h}\in \mathbb{R}^d h∈Rd。对于单句的分类任务,增加一个输出层即可:

y ( B ) = s o f t m a x ( W h ) \mathbf{y}^{\left ( B \right )}=softmax\left ( W\mathbf{h} \right ) y(B)=softmax(Wh)

其中, W ∈ R k × d W\in \mathbb{R}^{k\times d} W∈Rk×d, k k k为分类的个数。对于句子对,则是采用上述的方法对每个句子计算,计算完将两个特征concat在一起,再经过上述的softmax计算。

2.2.2. Student模型

在Distilled BiLSTM中,Student模型为一个单层的BiLSTM模型,BiLSTM网络结构如下图所示:

www.zeeklog.com  - BERT知识蒸馏Distilled BiLSTM

在分类任务中,参考文献[1]中将最后一个隐层状态concat在一起,即上述的 [ h T → , h 1 ← ] \left [ \overrightarrow{h_T},\overleftarrow{h_1} \right ] [hT​   ​,h1​   ​],后续经过一个输出层得到最终的输出,具体的网络结构如下图所示:

www.zeeklog.com  - BERT知识蒸馏Distilled BiLSTM

其中,上图中的c和d表示的是将前向和后向的隐层状态concat在一起,上图中的e和g表示的是一个全联接层,e的激活函数是ReLU。对于句子对的任务,利用BiLSTM分别产出句子向量,并将两个向量合在一起,后续的处理方法与单句的处理方法相同,具体的网络结构如下图所示:

www.zeeklog.com  - BERT知识蒸馏Distilled BiLSTM

对于句子对特征的组合,在参考文献[1]中,其处理方法为:

f ( h s 1 , h s 2 ) = [ h s 1 , h s 2 , h s 1 ⊙ h s 2 , ∣ h s 1 − h s 2 ∣ ] f\left ( \mathbf{h}_{s1},\mathbf{h}_{s2} \right )=\left [ \mathbf{h}_{s1},\mathbf{h}_{s2},\mathbf{h}_{s1}\odot \mathbf{h}_{s2},\left|\mathbf{h}_{s1}-\mathbf{h}_{s2} \right| \right ] f(hs1​,hs2​)=[hs1​,hs2​,hs1​⊙hs2​,∣hs1​−hs2​∣]

其中, ⊙ \odot ⊙表示的是向量元素相乘。

2.2.3. 蒸馏目标

对于知识蒸馏的目标函数,其包含两个部分,一个是蒸馏的loss(distillation loss)和Student模型自身的loss(student loss)。对于Student模型自身的loss采用的是交叉熵 L C E L_{CE} LCE​作为分类问题的目标函数,对于蒸馏的loss,则是采用对比logits结果的差异:

L d i s t i l l = ∥ z ( B ) − z ( S ) ∥ 2 2 L_{distill}=\left\|\mathbf{z}^{\left ( B \right )}-\mathbf{z}^{\left ( S \right )} \right\|_2^2 Ldistill​=∥   ∥​z(B)−z(S)∥   ∥​22​

其中, z ( B ) \mathbf{z}^{\left ( B \right )} z(B)为BERT模型的logits输出, z ( S ) \mathbf{z}^{\left ( S \right )} z(S)为Student模型的logits输出。最终的蒸馏目标为:

L = − α ∑ i t i ⋅ l o g y i ( S ) − ( 1 − α ) ∥ z ( B ) − z ( S ) ∥ 2 2 L=-\alpha \sum _it_i\cdot log\: y_i^{\left ( S \right )}-\left ( 1-\alpha \right )\left\|\mathbf{z}^{\left ( B \right )}-\mathbf{z}^{\left ( S \right )} \right\|_2^2 L=−αi∑​ti​⋅logyi(S)​−(1−α)∥   ∥​z(B)−z(S)∥   ∥​22​

3. 总结

Distilled BiLSTM是对于知识蒸馏较为一般性的实践,将BERT模型(Teacher)蒸馏到一个简单的BiLSTM模型(Student),蒸馏的目标函数中的蒸馏loss也是采用了对比logits结果的差异。虽然理论上较为简单,但是最终的结果是与与ELMo模型具有相同的效果,说明知识蒸馏的方法的有效性。

在BiLSTM中,多个隐层状态的融合有不同的方法,如上面直接用最后一个隐层状态作为最终的状态,实际上,可以使用Attention的方法综合多个隐层状态作为最终的状态能够进一步增强模型的效果。

参考文献

[1] Tang R , Lu Y , Liu L , et al. Distilling Task-Specific Knowledge from BERT into Simple Neural Networks[J]. 2019.

[2]

Read more

Nginx学习总结(14)——Nginx配置参数详细说明与整理

Nginx学习总结(14)——Nginx配置参数详细说明与整理

一、整体结构 nginx.conf配置文件整体上分为三部分:全局块、events块、http块。 二、具体参数说明 #user administrator administrators; #配置用户或者组,默认为nobody nobody。 #worker_processes 2; #允许生成的进程数,默认为1 #pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址 #制定日志路径,级别。这个设置可以放入全局块,http块,server块, #级别以此为:debug|info|notice|warn|error|crit|alert|emerg error_log log/error.log debug; events { accept_mutex on;

By Ne0inhk
Redis学习总结(16)——Redis 集群的5种使用方式,及各自优缺点对比分析

Redis学习总结(16)——Redis 集群的5种使用方式,及各自优缺点对比分析

一、常见使用方式 Redis 的几种常见使用方式包括: * Redis 单副本 * Redis 多副本(主从) * Redis Sentinel(哨兵) * Redis Cluster * Redis 自研 二、各种使用方式的优缺点 1、Redis 单副本 Redis 单副本,采用单个 Redis 节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景。 优点: 架构简单,部署方便; 高性价比:缓存使用时无需备用节点(单实例可用性可以用 supervisor 或 crontab 保证),当然为了满足业务的高可用性,也可以牺牲一个备用节点,但同时刻只有一个实例对外提供服务; 高性能。 缺点: 不保证数据的可靠性; 在缓存使用,进程重启后,数据丢失,即使有备用的节点解决高可用性,但是仍然不能解决缓存预热问题,

By Ne0inhk