【BERT】问题
- 预训练与微调之间的不匹配问题,微调时从未看到[MASK]
- 收敛速度慢: 每个batch中只预测了15%的token,导致收敛速度慢;换句话说,模型只学习到15%的token信息
【RoBERTa】
- 动态mask: 原始BERT在数据预处理时生成一次静态mask,每个batch的mask都是相同的;而RoBERTa每个输入序列都生成一个新的mask,使得模型适应不同的mask策略,学习不同的表征
- 去掉NSP任务:
- 更大的预训练数据量,更大的batch size,更多的模型参数
- Byte-level BPE编码: 原始BERT采用的是character-level BPE编码
【XLNET】
【ELECTRA】
【ERNIE】
【ALBERT】
【SpanBERT】
- 对于span selection任务,如QA和指代消解,有更好的改进;更好的表示与预测span
- 随机mask连续的span(而不是分隔的单个token),span的开头必须是一个单词的开头
- 在原始BERT的MLM损失的基础上,增加span-boundary objective, 根据mask span左右boundary token的表征和要预测的mask token相对于左边boundary token的位置表征,来预测mask token
- 去除NSP任务,并采用单个长句子(而不是句子对)作为训练样本
单个文本序列优于采用NLP任务的文本对的原因猜测如下:
1. 更长的完整句子更有利于模型训练
2. 利用另一个(通常无关的)文档的context会给masked language model增加噪声
【MacBERT】
动机: 解决预训练阶段与微调阶段(从没见过[MASK] token)的差异
对于MLM
- 使用whole word masking和n-gram masking的策略;被mask的token中,占比分别为40%的unigram, 30%的bigram, 20%的trigram和10%的4-gram
- 用相似词替换[MASK] token; 若n-gram被替换,单独的替换其中的每个单词;若没有相似词,则用随机词替换
- 与BERT相似,mask 15%的输入句子,其中80%替换为相似词,10%替换为随机词,10%保持原样
对于NSP
- 用ALBERT的sentence order prediction (SOP)替换原始BERT的NSP任务,交换两个连续句子的顺序作为该任务的负样本
【FastBERT】
动机: 预训练语言模型计算量大,难以用于低资源的场景,在实际场景中,一秒内可能需要处理大量的请求,且不同时间的请求量也不同;虽然有很多用于模型加速的方法,比如量化(quantinization)、权重修建、知识蒸馏,蒸馏让一个小模型学习到大模型的能力,通过减少模型大小来达到速度与准确性的平衡,但模型还是固定的,无法解决不断变化的请求量的问题。基于此,论文提出了一种速度可调节的BERT模型,在不同的请求量中平衡预测速度和准确性,并结合了样本自适应(sample-wise adaptive)机制和自蒸馏(self-distillation)机制来提升模型的预测时间。
【DistilBERT】
动机: 大模型的计算成本增加;增加的计算和内存损耗限制了大模型的广泛应用
- 利用知识蒸馏训练小模型,使得它达到与大模型相似的效果
知识蒸馏:训练一个学生模型来复现教师模型的行为
损失函数: 分为3个部分
- 蒸馏损失: 利用交叉墒损失,使得学生模型的预测概率()分布接近教师模型的预测概率分布(
)
概率计算用了softmax-temperature:
控制输出分布的平滑程度,
是logit;训练时,
被用于学生模型和教师模型,预测时,
设为1
- MLM损失
- confine embedding损失, 用来对齐学生模型和教师模型隐藏状态向量的方向(怎么理解?)
最终的损失函数是这3个损失的线性组合
学生模型结构
- 与BERT结构一致,移除token-type embedding层和pooler层
- 模型层数减半
- 从教师模型的每两层中选一层来初始化学生模型
- 应用了RoBerta的dynamic masking和移除NSP,来达到更好的BERT训练效果
【TinyBERT】
动机
预训练语言模型计算量大,很难在有限的资源下运行;为了在提升预测速度、减少模型大小的同时保持准确性,论文提出了一种用于Transformer-based模型的知识蒸馏方法(Transformer distillation),并提出了一种两阶段的学习框架,在预训练和微调阶段都进行蒸馏,使得模型能同时捕捉到general的和与任务相关的知识
Knowledge Distillation 知识蒸馏
知识蒸馏的目标是将教师模型的知识转移到学生模型
上,可以通过减小下面的目标函数实现:
和
指的是模型的特征表示,
表示某中损失函数,用来衡量教师模型和学生模型在表征上的差异。在Transformer distillation中不同层可以有不同的损失函数
Transformer Distillation
该蒸馏方法学习了Transformer-based模型不同层的特征表示进行蒸馏,而通常的知识蒸馏只学习了教师模型的预测概率分布。整体的目标函数为:
是模型某一层的损失函数;
是学生模型第
层的特征表示,学生模型第
层学习的是教师模型第
层,
是一个mapping函数;
表示第
层蒸馏的重要性,是一个超参数
Transformer distillation蒸馏了以下几个层的特征表示:
- 基于注意力矩阵的蒸馏
是注意力heads的数量,
是未归一化的(softmax之前的)注意力矩阵,
是句子长度
- 基于Transformer层输出的蒸馏
,
,
, 将学生模型的隐藏状态转换为和教师模型的隐藏状态相同的维度
- 基于Embedding层的蒸馏
和
分别是学生模型和教师模型的词向量,
用来统一向量维度
- 基于预测层的蒸馏
和
分别是教师模型和学生模型的预测logits,
是一个temperature value, 用来smooth预测分布,实验发现
效果较好
总体的表示为: 对于词向量层,
; 对于中间层,
; 对于预测层,
两阶段Transformer learning
- General distillation (预训练阶段): 将没有微调过的原始BERT作为教师模型,大规模的语料作为训练集,使用Transformer distillation得到一个general的学生模型TinyBERT,有助于提高学生模型的泛化能力,但由于词向量维度和隐藏神经元的减少,模型层数较少,general TinyBERT的效果远不如BERT
- Task-specific distillation (微调阶段): 有研究表明,复杂模型在下游任务中存在过度参数化的问题,所以小模型使用具体任务的数据学习到与任务相关的知识,有可能实现与BERT相近的效果。对于具体任务的蒸馏,在增强(data augmentation)后的下游数据上进行Transformer distillation, 教师模型为微调后的BERT
对于数据增强,结合了一个预训练好的语言模型BERT和Glove词向量做word-level的替换,使用BERT来对分词后single-piece的词作替换,用词向量对multiple-piece的词检索最相似的词做替换
【Sentence-BERT】
【ChineseBERT】
动机
用于中文的预训练语言模型,往往忽略了中文的两个重要信息-象形和拼音,这两个信息包含了很多语义和词义上的信息,如字形信息包含特殊的语义信息("氵"表示水),拼音信息可以解决多音字意思不同的问题;论文在预训练过程中融入了这两个信息。
模型
模型输入将char embedding, glyph(字形) embedding, 和pinyin embedding做拼音,再在Fusion layer中经过一个3D x D的矩阵做转换,得到D维的fusion embedding, fusion embedding再与position embedding相加作为模型的最终输入。
- char embedding: 与原始BERT中的token embedding类似,只不过是字符粒度
- glyph embedding: 使用3种不同字体(仿宋、行楷、隶书)的汉字图像得到,每个图像都是24 x 24的大小。将3个图像flatten后拼接起来,使用一个全连接层转换为glyph embedding。
- pinyin embedding: 使用pypinyin将汉字转换为拼音,再在拼音末尾加上数字1/2/3/4表示它们的声调,得到转换后的拼音序列(固定长度为8,不足8时用"-"进行padding)。用一个width=2的CNN模型,加上max pooling作用在拼音序列上,得到最终的拼音序列。这样不管原始拼音序列的长度如何,pinyin embedding的特征维度都是一样的。
Masking策略
- Whole Word Masking: mask一个词里的所有字符
- Char Masking: 随机地mask单个汉字
预训练细节
- 为了获得short-term和long-term dependencies, 模型在packed input和single input之间交替训练;packed input是多个句子的拼接,最大长度为512,作为输入的概率为0.9;single input是单个句子,作为输入的概率为0.1
- 不管是packed input还是single input, 90%的时间使用WWM的masking策略,10%的时间使用Char Masking
- 不管是哪种masking策略,句子中15%的词/字被选择, 其中80%的字/词被mask, 10%替换为一个随机字/词,10%保持不变
- 采用dynamic masking(动态掩码), 避免出现重复的训练语料
- 预训练完成后,模型可以直接通过与原始BERT同样的方式进行下游任务的微调(所以segment embedding其实只在预训练时没有用到,微调时还是需要的?)