赞
踩
本文讲解的BERT系列模型主要是自编码语言模型-AE LM(AutoEncoder Language Model):通过在输入X中随机掩码(mask)一部分单词,然后预训练的主要任务之一就是根据上下文单词来预测这些单词,从而得到的预训练语言模型。
而不是关于自回归语言模型-AR LM(AutoRegressive Language Model):根据上文内容来预测下一个单词,或者根据下文内容来预测上一个单词,即自左向右或自右向左的语言模型。
在某些垂直领域,直接微调开源BERT模型或许效果不是很理想,可以使用该领域的无标注文本数据继续预训练,然后再用标注数据进行微调。这个github仓库提供了tensorflow和pytorch两种版本的预训练代码。
谷歌在2017年发表的论文《Attention Is All You Need》中,针对序列问题,例如机器翻译、语言模型等,沿用encoder-decoder的经典思想,但是Encoder和Decoder不再是以往的LSTM或者门控神经网络,而是提出了一种Transformer的网络结构,在 WMT 2014 English-to-German translation task、WMT 2014 English-to-French translation task都超过了当时最好的成绩。
后面,2018年的ELMo和OpenAI GPT把预训练带入NLP领域。
接着,谷歌在2018年的论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》中,继续沿用Transformer的结构,并且是bidirectional Transformer,仅使用Encoder部分,并取名为BERT(Bidirectional Encoder Representations from Transformers),彻底将Transformer和预训练推广开来,被许多人知晓,洗刷了许多NLP的数据集榜单。
因此,下面我们将会着重介绍BERT,接着再认识下其他BERT衍生出来的变种模型。
在Transformer之前的序列任务模型一般是RNN、LSTM、GRU其中一种,它们的特点就是:每个时刻的输出是根据上一时刻隐藏层state和当前时刻的输入,由这样的方式来实现产生序列。
对于长序列,这样一层一层地传递,前面时刻的信息到了后面基本就消失了;
对于文本问题,每个时刻的输出不仅与上一时刻相关,还可能与前n个时刻相关。以上两个问题也导致了循环神经网络难以学习相对位置较远的文本之间的关系。
而Transformer中大部分都是矩阵相乘,容易并行。
其中的self-attention机制则是所有上下文的交互,而不仅仅是与上一个时刻的交互;并且比RNN&LSTM有着更强的长距离建模能力。
并且,BERT中的双向Transformer真正实现了上下文的双向交互,而双向LSTM其实是由一个前向LSTM和一个后向LSTM组成。
论文地址:https://arxiv.org/abs/1810.04805
github地址:https://github.com/google-research/bert
BERT全称为Bidirectional Encoder Representations from Transformers,单从名字就可以看出:
原本的Transformer是有Encoder和Decoder两部分组成,而BERT则仅仅只有Encoder网络,如下图所示:
整体的结构可以总结为:输入表征(Input Embeddings)–>> 多头注意力(Multi-Head Attention)–>> 残差连接(Add) & LayerNorm -->> 前馈网络(Feed Forward)–>> 残差连接(Add) & LayerNorm -->> 输出
1. 输入表征
第一部分是BERT模型的输入,包含三部分,由词表征(token Embedding)、段表征(Segment Embedding)和位置表征(Position Embedding)相加,如下图所示:
2. 多头注意力
第二部分是模型的输入表征(上述三种表征相加)会经过Multi-Head Attention,其结构如下图所示:
2.1 Multi-Head Attention
首先,来看看Multi-Head Attention的结构:
2.2 Scaled Dot-Product Attention
再进一步拆解Scaled Dot-Product Attention的结构:
具体公式如下:
在这有两个疑点:
a. 为什么Q与K相乘之后需要缩放呢?
google在对比试验发现缩放的效果比未缩放的效果好,怀疑是由于随着 d k d_k dk越大,会使得SoftMax层的梯度变得比较小。
b. 为什么需要在这里接入SoftMax层?
因为接入Mask之后,被遮挡的部分会变为绝对值非常大的负数,那么SoftMax可以将其归零。
另外,BERT中的attention其实是一种self-attention,即Q、K和V都是同一个输入表征。
3. 残差连接&LayerNorm
第三部分则是多头注意力的输出,会经过残差连接,即输出会与未经过Multi-Head Attention的输入相加,残差连接有助于避免深度网络中的梯度消失问题;
接着再使用LayerNorm,它能够与batch normalization一样,可以加快训练收敛。但不同的是, LayerNorm不是在行维度(mini-batch)上计算的,仅在单个样本上完成计算,不会受到batch size的影响,训练阶段与测试阶段的计算完全一致,并且能够套用的RNN这些循环网络上。
4. 前馈网络
前馈网络(Feed Forward)就比较简单,由两个全连接层组成,然后第一个全连接层会带有激活函数-gelu。
最后,会再次使用同上述的残差连接和LayerNorm,得到最终Transformer的输出,这就完整的单层的Transformer结构了。
5. 多层Transformer
以上仅是单层的Transformer结构,而BERT-base版本是12层,large版本是24层。
具体可以前往谷歌的开源代码:https://github.com/google-research/bert/blob/master/modeling.py#L754
BERT在预训练阶段,摒弃了传统的单向语言模型,即 left-to-right or right-to-left,而是使用双向语言模型,上面也提到了这其实是由于BERT使用了一种新的语言模型掩码语言模型-MLM(masked language model),这是BERT使用的两个无监督任务之一,另外一个则是预测两个句子是否为来自连续的段落-Next Sentence Prediction (NSP)。
1. Masked LM
像那种单向语言模型,一般都是根据上文(前面的tokens)来预测下一个token或者根据下文(后面的tokens)来预测上一个token。因为对于双向语言模型是允许每个token“看见自己的”(see itself),类似于模型输入中包含了真实标签,模型会很容易就能够预测的目标token。
BERT为了能够训练一个双向语言模型,它将输入tokens按照一定比例(论文中使用15%),随机将其中一些token进行掩码(mask),用特殊的token来代替:[MASK],然后让模型去预测这些mask的tokens原来对应哪些tokens,mask tokens最后一层的隐藏层向量会喂给一个对应词表的softmax,与标准的语言模型是一样的。
虽然这种做法能够获得一个双向预训练模型,但这会导致预训练和微调存在一种不匹配(mismatch),因为[MASK]这个特殊的token永远不会出现在微调阶段。为了减少这种不匹配的问题,当一个token被选中mask时,并不是必定会替换为[MASK],而是80%的概率被替换为[MASK],10%的概率会替换为词表中随机的另外一个token,10%的概率保持不变。
2. Next Sentence Prediction
许多重要的下流任务,比如Question Answering (QA) and Natural Language Inference (NLI),都是需要模型具备理解两个句子之间的关系,但这却是语言模型所不具备的。
因此,为了让模型具备这种能力,BERT在预训练的时候,还增加了一个二分类任务:Next Sentence Prediction,预测输入的句子B是否为句子A的下一个真实句子。
在构造训练样本时,作为输入的两个句子A和B,50%的概率句子B是真实来自句子A的下一句(Label为IsNext),而50%的概率句子B是从所有语料中的随机一个句子(Label为NotNext)。
上面也提到每个句子都增加一个初设token-[CLS],这个token的最后输出向量的作用便是用于这个二分类任务的。
实验也表明在预训练时加入这个任务,对QA和NLI有着明显的正向效果。
模型微调则是非常直接,与预训练模型使用完全相同的网络结构,并且预训练模型的参数作为微调模型的初始化。
因为Transformer的self-attention机制,使得BERT能够对许多下流任务进行建模,只需要适当的变换输入和输出,不管是包含单个句子或者是句子对。
一般来说,对于分类任务,与预训练的NSP任务一样,使用初设token-[CLS]的表征,来喂入到一个分类输出网络中,如K分类任务,则是先将[CLS]的表征向量映射到维度为K的向量,再使用softmax;
对于序列标注(sequence tagging),其实也是类似,使用序列中token的表征来,喂入到一个token级别的分类输出网络,如命名实体识别,将每个token的表征也是先映射到K维的向量,K为实体的数量。
后续在2019年,谷歌发布了一个新的预训练模型:BERT-wwm,其调整地方在MLM过程中使用全词掩码(Whole Word Mask):
上述提到,BERT使用WordPiece对句子进行切分tokens,并且会产生Subword,如果Subword被选中mask,那么整个单词都会进行mask,而原来的则不会。
如playing被拆分为play和##ing两个Subword,当##ing被选中mask时,那么play也会同时进行mask。
论文地址:https://arxiv.org/abs/1907.11692
github地址:https://github.com/facebookresearch/fairseq
RoBERTa出自Facebook:RoBERTa: A Robustly Optimized BERT Pretraining Approach,从论文名称可以明显看出,它提出了一种鲁棒性更强的BERT模型预训练方法。
在这之前,facebook就评估了超参数和训练集规模对BERT预训练的影响,发现BERT其实是明显训练不足的,借此提出了一种更加有效的预训练策略,发布了一个鲁棒性更强的BERT模型:RoBERTa。
1. 更多的预训练语料
BERT的预训练语料是 BOOKCORPUS+English WIKIPEDIA的16GB语料,而RoBERTa使用了超过160GB的语料:BOOKCORPUS+English WIKIPEDIA、CC-NEWS、OPENWEBTEXT、STORIES。
2. 更大的batch size
BERT预训练的batch size为256,而RoBERTa则使用了更大的batch size。
3. 训练更久
论文实验了增加训练步数,可以提升模型的效果表现。这也验证了论文一开始提出的问题:BERT是训练不充分的。
4. 不同的超参数配置
BERT使用AdamW优化器,其中 β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 e − 6 , L 2 w e i g h t d e c a y = 0.01 \beta_1=0.9,\beta_2=0.999,\epsilon=1e-6,L_2\ weight\ decay=0.01 β1=0.9,β2=0.999,ϵ=1e−6,L2 weight decay=0.01,
而RoBERTa修改了 β = 0.98 \beta=0.98 β=0.98,这可以使得更大的batch size,在训练时更稳定。
学习率也如上图所示进行了调整。
##剔除NSP任务
论文实验以下几种句子组合方式的输入格式+NSP保留或剔除的训练方式:
从实验结果来看,使用独立的句子即SENTENCE-PAIR会破坏下流任务的效果,论文认为是这样会导致模型无法学习长距离的上下文依赖;
剔除NSP任务可以轻微提升下流任务的效果,论文认为是BERT仅仅是剔除NSP,但仍然保留SEGMENT-PAIR的输入格式,因此结论是:
剔除NSP的同时,应该使用FULL-SENTENCES或者DOC-SENTENCES的输入格式。
(由于DOC-SENTENCES会导致batch size需要是动态变化的,因此论文后面的实验都是使用FULL-SENTENCES的输入格式)
BERT中,对于每一个样本序列进行mask之后,mask的tokens都固定下来了,即是静态mask的方式;
而论文使用了动态mask的方式:对于每一个输入样本序列,都会复制10条,然后复制的每一个都会重新进行mask,即拥有不同的masked tokens。
论文地址:https://arxiv.org/abs/1907.10529
github地址:https://github.com/facebookresearch/SpanBERT
SpanBERT出自Facebook:SpanBERT: Improving Pre-training by Representing and Predicting Spans,看着名字多了一个span,因为它就是在BERT的基础上,针对预测spans of text的任务,在预训练阶段做了特定的优化。
比如SQuAD v1.1数据集,给定一个问题和一个包含答案的段落,任务就是去预测出这个段落的答案片段。
SpanBERT所做的预训练调整主要是以下三点:
因此,SpanBERT最终的预训练目标如下图公式所示: L M L M + L S B O L_{MLM}+L_{SBO} LMLM+LSBO
给定一个tokens序列 X = ( x 1 , x 2 , . . . , x n ) X=(x_1,x_2,...,x_n) X=(x1,x2,...,xn),每次都会通过采样文本的一个片段(span),得到一个子集 Y ∈ X Y\in X Y∈X,直到满足15%的mask。
在每次采样过程中,首先,随机选取一个片段长度,它是满足一个几何分布的 l ∼ G e o ( p ) l \sim Geo(p) l∼Geo(p),然后再随机选取一个起点,这样就可以到一个span进行mask了;
span的长度会进行截断,即不超过10,并且实验得到p取0.2效果最好;
另外,span的长度是指word的长度,而不是subword,这也意味着采样的单位是word而非subword,并且随取的起点必须是一个word的开头。
与BERT一样,mask机制仍然为:80%替换为[MASK],10%保持不变,10%用随机的token替换。但不用的是,span masking是span级别的,即同一个span里的所有tokens会是同一种mask。
这个新增的预训练任务概括起来其实就是:仅使用span边界的tokens的表征,来预测该span内的这些mask的tokens原来对应哪些tokens,这其实与mask lm类似,但它不使用上下文的所有tokens的表征。
首先,输入文本序列的每个tokens的Transformer输出为 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn。
给定一个mask的span,其tokens的Transformer输出为 ( x s , . . . , x e ) (x_s,...,x_e) (xs,...,xe),其中s和e为span的起点和终点位置。当然,这些span是按照上面的span masking采样得到。
那么,该span的外边界tokens的Transformer输出即分别为 s s − 1 s_{s-1} ss−1和 s e + 1 s_{e+1} se+1,并且待预测的target token的位置embedding为 p i − s + 1 p_{i-s+1} pi−s+1
(位置embeddings: p 1 , p 2 , . . . p_1,p_2,... p1,p2,...,代表token在span中相对于左边界token x s − 1 x_{s-1} xs−1的位置,如上述图片所示)
最后,通过外边界tokens的表征和相对位置embedding,得到该token的向量表征 y i y_i yi,用它去预测token x i x_i xi,与BERT中的MLM任务一样。
论文地址:https://arxiv.org/abs/1909.11942
github地址:https://github.com/google-research/albert
ALBERT(A Lite BERT)同样出自google:ALBERT: A Lite BERT for Self-supervised Learning of Language Representations,看这个模型的全称,就知道它设计的初衷就是给BERT瘦身。
ALBERT所做的调整主要包括以下几点:
增加预训练语言模型的参数规模,往往给下流任务能够带来效果提升。但GPU/TPU这些设备内存资源的限制,注定了参数规模无法无止境的增加。
ALBERT主要通过两个方式来显著减少模型的参数量:Factorized embedding parameterization和Cross-layer parameter sharing,大大降低了训练成本,也包括训练速度。
1. Factorized embedding parameterization
BERT和RoBERTa模型中,WordPiece拆分的词表映射的词向量维度E是与Transformer中的隐藏层大小H是绑定的,即E=H。
因此,ALBERT使用一种因子分解的方法,将词的one-hot向量先投影到一个较小的向量空间大小E,然后再重新投影到隐藏对应的空间大小H,而不是直接将one-hot向量直接投影到H,这样,词向量矩阵参数规模则从 O ( V × H ) O(V \times H) O(V×H)变为 O ( V × E + E × H ) O(V \times E + E \times H) O(V×E+E×H),并且H>>E。
2. Cross-layer parameter sharing
ALBERT提供了几种网络层参数共享的选项,包括:
下图分别为ALBERT的参数优化效果和不同参数共享选项的效果对比:
上述BERT也提到过,next-sentence prediction (NSP)任务是为了提升预训练模型在下流任务的表现,比如那些需要理解句子对之间的关系的自然语言任务推理。然而,RoBERTa研究表明NSP的效果是不可靠的,消除这个预训练任务反而能够提升一些下流任务的效果。
论文猜测是NSP任务失效的原因是相比于MLM,NSP缺乏一定的困难性,即该任务相对来说过于简单。
从NSP的设计来看:负样本是从不同的文档中提取的语料,意味着负样本在主题和连贯性上(topic and coherence)都是偏离的。NSP是将主题预测和连贯性预测两个任务进行合并了,但是主题预测相比连贯性预测简单许多,而主题预测与MLM是存在更多的重叠了。
在此理论基础上,ALBERT仍然认为句子间的建模能力是语言理解中一个重要部分,但是要避开主题预测,并且更关注于句子间连贯性的建模能力,提出了另外一种任务:sentence-order prediction (SOP) :
增加了n-gram mask,比如tokens序列为a b c d
,按照原mask方法,仅存在这些mask选项:[a, b, c, d]
,但3-gram则不同:[a, b, c, d, a b, b c, c d, a b c, b c d]
,具体可以前往源码
在预训练过程中,ALBERT还另外进行了一些调整:
论文地址:https://arxiv.org/abs/1906.08101
github地址:https://github.com/ymcui/Chinese-BERT-wwm
该模型是哈工大讯飞联合实验室针对NLP中文特性进行优化的一个BERT系列模型。
其最主要的优化在于:由于谷歌官方发布的BERT中,中文是以字为粒度进行切分,没有考虑到传统NLP中的中文分词。 我们将全词Mask的方法应用在了中文中,使用了中文维基百科(包括简体和繁体)进行训练,并且使用了哈工大LTP作为分词工具,即对组成同一个词的汉字全部进行Mask。
另外,预训练取消Next Sentence Prediction(NSP)loss。
论文地址:https://aclanthology.org/2020.findings-emnlp.58/
github地址:https://github.com/ymcui/MacBERT
该模型也是出自哈工大讯飞联合实验室,仍然是一个中文BERT模型,该模型引入了一种纠错型掩码语言模型(Mac)预训练任务,缓解了“预训练-下游任务”不一致的问题。
掩码语言模型(MLM)中,引入了[MASK]标记进行掩码,但[MASK]标记并不会出现在下游任务中。在MacBERT中,使用相似词来取代[MASK]标记。相似词通过Synonyms toolkit (Wang and Hu, 2017)工具获取,算法基于word2vec相似度计算。同时也引入了Whole Word Masking(wwm)和N-gram masking技术。
还有一些细节问题:
另外,预训练中除了使用MLM loss,还保留了SOP loss。
github地址:https://github.com/PaddlePaddle/ERNIE
##ERNIE 1.0
论文地址:https://arxiv.org/abs/1904.09223
**百度文心1.0认为BERT模型没有考虑到句子里的先验知识。**比如这个句子:哈尔滨是黑龙江的省会,国际冰雪文化名城。
因此,如果模型能够学到这些先验知识,那模型应该可以获得更可靠的语言表征。
基于这个思想,ERNIE 1.0提出了两种新的掩码(Mask)机制:Entity-Level Masking、Phrase-Level Masking。
再加上Basic-Level Masking,进行多阶段的预训练。
1. Basic-Level Masking
第一阶段,使用与BERT一样的基础Mask机制,同样是15%的Mask概率。这个阶段,模型难以获得高级别的语义知识的建模能力。
2. Phrase-Level Masking
第二阶段,使用短语级别的Mask机制。对于英文文本,使用lexical analysis工具获取短语的边界,对于中文或者其他语言的文本,使用对应语言的分词/分段工具,来得到单词/短语。
这个阶段会随机Mask掉一些短语,并进行预测。这个阶段短语的信息会被编码到词向量中。
3. Entity-Level Masking
第三阶段,使用实体级别的Mask机制。命名实体包括人名、地点、组织、产品等等,通常情况下,实体会包括句子的重要信息。
在这个阶段,首先会解析出句子中的所有实体(应该是通过命名实体识别模型,论文未明确说明),然后Mask掉某些实体,并进行预测。
通过这三个阶段的预训练学习,模型可以通过更丰富的语义信息,得到增强的词表征。
多样的预训练语料
预训练数据集使用了中文维基百科、百度百科、百度新闻和百度贴吧,数量分别为21M、51M、47M、54M。
并且,在中文使用了繁体字到简体字的转换,英文上的大写到小写的转换,最终的词表大小为17964。
DLM (Dialogue Language Model)
其中,百度贴吧属于对话类型的数据,对话数据对语义表征是很重要的,因为一个问题下的回答通常下是相似的。
论文针对这类型的数据,ERNIE在Query-Response的对话结构下,使用一种新的DLM (Dialogue Language Model) 任务,如下图DLM-Figure 3所示。
DLM任务可以让ERNIE学习对话之间的内在关系,这也可以提升模型语义表征的学习能力。
实验结果
在以下5个中文NLP数据集都取得了比BERT更好的成绩:
Cross-lingual Natural Language Inference (XNLI):判断句子对属于哪种标签,包含矛盾、中立和蕴涵。
Large-scale Chinese Question Matching Corpus (LCQMC):判断两个句子是否为相同的意图(intention)
MSRA-NER:亚洲微软研究发布的命名实体识别数据集
ChnSentiCorp(TAN Song-bo. Chnsenticorp.):判断句子的观点是积极还是消极
NLPCC-DBQA:选出问题的正确答案
论文地址:https://arxiv.org/abs/1907.12412v2
百度文心2.0提出了一种持续学习的预训练框架:预训练使用了7种任务,而不是一两种简单的任务。不断引入新的预训练任务,让模型可以持续性地学习不同的预训练任务,并且不会遗忘先前学习的知识,以此让模型能够获得更为全面的表征能力。大体结构如下图:
1. 持续多任务预训练学习
ERNIE 2.0提出的持续多任务预训练学习框架,目的在于让模型从一系列的任务中学习词汇、句法和语法信息。
主要存在以下两个挑战:
论文使用以下方法“对症下药”:
下图比较清晰地展示了该框架与多任务学习、持续性学习的区别。
2. 三大类-7个预训练任务
Word-aware Pre-training Tasks
这类可以让模型能够捕获词汇信息,具体包括2个任务:
Structure-aware Pre-training Tasks
Semantic-aware Pre-training Tasks
3. Task Embedding
模型加入了一个新的嵌入 Task Embedding,用来表征不同任务的特征,即每一个预训练任务对应着一个id,从0到N。
微调阶段,可以使用任意一个任务的id来加载模型。
4. 训练结构
如下图[ERNIE 2.0-Figure 4]所示,Encoder可以使用循环神经网络或者Transformer,ERNIE当然是用了Transformer。Encoder参数对于所有任务都是共享的,每个任务都可以更新参数。
其中存在两种损失函数,一种是句子级别的loss,一种的token级别的loss(与BERT类似)。每个预训练任务拥有自己的损失函数。
预训练过程,一个句子级别的loss可以与多个token级别的loss联合。下图展示了上述介绍的预训练任务属于哪种loss,同时展示了使用的数据集,以及数据集对应哪些预训练任务和loss。
论文地址:https://arxiv.org/abs/2107.02137
论文地址:https://arxiv.org/abs/1909.00204
github地址:https://github.com/huawei-noah/Pretrained-Language-Model
NEZHA全称为NEURAL CONTEXTUALIZED REPRESENTATION FOR CHINESE LANGUAGE UNDERSTANDING,是华为诺亚方舟实验室提出的一个模型。
##相对位置编码
NEZHA使用了类似Transformer-XL中的相对位置编码函数来代替BERT中的位置嵌入position embeddings。
其中, a i j ∈ R d z , d z a_{ij} \in \mathbb{R} ^{d_z},d_z aij∈Rdz,dz为每个注意力头的size。
如何将相对位置编码加入注意力,如下式:
其中,输入tokens序列为 x = ( x 1 , x 2 , . . . , x n ) , w h e r e x i ∈ R d x x=(x_1,x_2,...,x_n),\ where\ x_i \in \mathbb{R} ^{d_x} x=(x1,x2,...,xn), where xi∈Rdx,
a i j V , a i j K a_{ij}^V,a_{ij}^K aijV,aijK即有上面的相对位置编码函数而来, z i z_i zi为第i个注意力头的输出。
NEZHA也使用了中文的WWM(whole word masking),也就是上述的中文RoBERTa-wwm的Mask机制,分词工具使用的是Jieba。
通常,深度神经网络训练时,模型参数和梯度使用的是FP32精度(单精度)。
而NEZHA使用了混合精度训练:
NEZHA还加入了类似于上述SpanBERT模型的预训练:Span Prediction
其他
全局batch size为5120,使用LAMB Optimizer。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。