nlp-bert学习1

语言表示模型

LM分类

1.基于one-hot、tf-idf、textrank等的bag-of-words;
2.主题模型:LSA(SVD)、pLSA、LDA;
3.基于词向量的固定表征:word2vec、fastText、glove;
4.基于词向量的动态表征:elmo、GPT、bert、XLnet、RoBERTa、T5、ERNIE-Baidu、ELECTRA;

LM优缺点对比

表示形式 优点 缺点 备注
BOW词袋模型 1、基于统计的方法解决了分类器不好处理离散数据的问题 2、在一定程度上也起到了扩充特征的作用 1、它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);2、它假设词与词相互独立(在大多数情况下,词与词是相互影响的);3、它得到的特征是离散稀疏的,维度灾难、语义鸿沟;
主题模型LDA 1、可以找到词与主题,主题与文档之间的关系 2、利用了全局语料特征 1、无法挖掘的词与词之间的相似度 2、就算量比较大(奇异值分解SVD)
Word2vec\Fasttext 1、将词语表示成低纬稠密向量,解决特征稀疏、离散的问题。 2、可以表示词语之间的语义关系 1、无法挖掘词语上下文之间的语义关系 2、局部语料库训练的,其特征提取是基于滑窗的 3、无法解决一词多义的问题 4、词向量为副产物,训练效率不高 基于分布式假设:分布式假设,用一句话可以表达:相同上下文语境的词有似含义。虽然fastText用N-gram策略考虑了次的顺序问题
Glove 1、融合了矩阵分解Latent Semantic Analysis (LSA)的全局统计信息和local context window优势。 2、基于全局语料,融入全局的先验统计信息,可以加快模型的训练速度,又可以控制词的相对权重。 1、词语信息仍是静态的,每个词语都对应唯一一组向量表示
Elmo 1、用双向LSTM捕获上下文语义信息 2、动态特诊可以解决一次多义的问题 1、尽管ELMo算法利用了正向和反向的语言模型,可本质上仍然是两个unidirectional模型的叠加。 2、LSTM无法并行,不能训练深层的语义模型 虽然ELMo有用双向RNN来做encoding,但是这两个方向的RNN其实是分开训练的,只是在最后在loss层做了个简单相加。这样就导致对于每个方向上的单词来说,在被encoding的时候始终是看不到它另一侧的单词的。而显然句子中有的单词的语义会同时依赖于它左右两侧的某些词,仅仅从单方向做encoding是不能描述清楚的
GPT 1、采用多层Transformer做特征提取 1、单向Transformer语言模型 Transformer是encoder-decoder结构
BERT 1、GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。 1、模型太多,fine-tune过程很大的概率会出现MemoryError BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。

论文

2018年的10月11日,Google发布的论文《Pre-training of Deep Bidirectional Transformers for Language Understanding》,成功在11项NLP任务中取得 state of the art 的结果,赢得自然语言处理学界的一片赞誉之声。
论文中BERT被定义为Language representation model,预训练的BERT模型外加一层可以用来做微调,从而完成多种任务(eg:分类任务、序列标注任务等)。
BERT作为一个Word2Vec的替代者,其在NLP领域的11个方向大幅刷新了精度,可以说是近年来自残差网络最优突破性的一项技术了。
BERT的本质上是通过在海量的语料的基础上运行自监督学习方法为单词学习一个好的特征表示,所谓自监督学习是指在没有人工标注的数据上运行的监督学习。在以后特定的NLP任务中,我们可以直接使用BERT的特征表示作为该任务的词嵌入特征。所以BERT提供的是一个供其它任务迁移学习的模型,该模型可以根据任务微调或者固定之后作为特征提取器。BERT的源码和模型10月31号已经在Github上开源,简体中文和多语言模型也于11月3号开源。

问题

1、GPT网络用的单向的transformer做语言模型的学习, 学习到的特征仅依赖于当前词语之前的内容。
2、transformer训练语言模型需要大量的标注语料,标注语料是很难获取的。
前期语言表示模型研究的短板:
1、之前的研究多集中feature-based approach,eg: one-hot、n-gram、word2vec、Elmo等
2、之前的研究主要是单向的,eg:GPT模型,作者仅使用从左到右的结构,这就限制了每个词语只能关注其之前的词语。这种局限在句子级别的任务中并不是最优的选择。
nlp-bert学习1
下次学习GPT2.0

解决

1、双向Transformer 代替单项transformer,BERT中,与GPT对比,我们能知道预测单词前向和后向上下文。作者仅使用从左到右的结构,这就限制了每个词语只能关注其之前的词语。这种局限在句子级别的任务中并不是最优的选择。
2、采用MLM & NSP预训练方式,训练网络模型。

主要贡献

1、使用了Transformer [2]作为算法的主要框架,Trabsformer能更彻底的捕捉语句中的双向关系;
2、使用了Mask Language Model(MLM,Wilson L Taylor. 1953. cloze procedure: A new tool for measuring readability. Journalism Bulletin, 30(4):415–433) [3] 和 Next Sentence Prediction(NSP) 的多任务训练目标;
3、使用更强大的机器训练更大规模的数据,使BERT的结果达到了全新的高度,并且Google开源了BERT模型,用户可以直接使用BERT作为Word2Vec的转换矩阵并高效的将其应用到自己的任务中。BERT提高了11个NLP任务的技术水平。
nlp-bert学习1
关键词:Tansformer、预训练方式(MLM、NSP),fine-tune

bert

bert 模型

ERT的基础集成单元是Transformer的Encoder。
BERT的论文介绍了2种版本:
BERT_base: L=12,H=768,A=12,参数总量110M;
BERT_large: L=24,H=1024,A=16,参数总量340M;
L表示网络的层数(即Transformer blocks的数量),H表示隐藏层神经元的个数,A表示Multi-Head Attention中self-Attention的数量。
nlp-bert学习1

bert-Transformer

tansformer参考link.

bert-预训练

参考:
[1] https://zhuanlan.zhihu.com/p/48612853

预训练-MLM

Masked Language Model
Masked LM的任务描述为:给定一句话,随机抹去这句话中的一个或几个词,要求根据剩余词汇预测被抹去的几个词分别是什么,如下图所示
nlp-bert学习1

模型假设: BERT 每次随机 mask 语料中 15% 的 token,然后将 masked token 位置输出的最终隐层向量送入 softmax,来预测 masked token。这样输入一个句子,每次只预测句子中大概 15% 的词,所以 BERT 训练很慢。

问题:训练过程大量看到 [mask] 标记,但是真正后面用的时候是不会有这个标记的,这会引导模型认为输出是针对 [mask] 这个标记的,但是实际使用又见不到这个标记。

解决方法:以my dog is hairy为例,15% 的 token中:

  • 有80%的概率用[mask]标记来替换,如:my dog is [MASK]

  • 有 10%的概率用随机采样的一个单词来替换,如:my dog
    is apple
    有10%的概率不做替换,如:my dog is hairy

    这么做的主要原因是:在后续微调任务中语句中并不会出现[MASK]标记,而且这么做的另一个好处是:预测一个词汇时,模型并不知道输入对应位置的词汇是否为正确的词汇(10%概率),这就迫使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力

预训练-NSP

Sentence-level Representation
Next Sentence Prediction 任务描述为:给定一篇文章中的两句话,判断第二句话在文本中是否紧跟在第一句话之后,如下图所示:
nlp-bert学习1

在很多任务中,仅仅靠 encoding 是不足以完成任务的(这个只是学到了一堆 token 级的特征),还需要捕捉一些句子级的模式,来完成 SLI、QA、dialogue 等需要句子表示、句间交互与匹配的任务。对此,BERT 又引入了另一个极其重要却又极其轻量级的任务,来试图把这种模式也学习到。

模型假设:作句子级别的连续性预测任务,即预测输入 BERT 的两端文本是否为连续的文本。训练的时候,输入模型的第二个片段会以 50% 的概率从全部文本中随机选取,剩下 50% 的概率选取第一个片段的后续文本。
这可以看作是句子级负采样,即首先给定的一个句子(相当于 Word2Vec 中给定 context),它下一个句子或者为正例(相当于 Word2Vec 中的正确词),或者随机采样一个句子作为负例(相当于 Word2Vec 中随机采样的词),然后在该 sentence-level 上来做二分类(即判断句子确实是当前句子的下一句还是噪声)。
nlp-bert学习1

预训练-输入

输入:input_ids进行embedding_Lookup后的词语向量+segment_id(标记时第一句话还是第二句话)+position_embedding
nlp-bert学习1
输入是两个句子,分割符sep,cls表示开始,对输入的两个句子,使用位置编码, segment embedding 根据这个可以知道 该词属于哪个句子,学习会更加简单。可以很清楚知道第一句子需要编码什么信息,第二个句子可以编码什么信息。

nlp-bert学习1
Bert的输入部分是个线性序列,两个句子通过分隔符分割,最前面和最后增加两个标识符号。每个单词有三个embedding:位置信息embedding,这是因为NLP中单词顺序是很重要的特征,需要在这里对位置信息进行编码;单词embedding,这个就是我们之前一直提到的单词embedding;第三个是句子embedding,因为前面提到训练数据都是由两个句子构成的,那么每个句子有个句子整体的embedding项对应给每个单词。把单词对应的三个embedding叠加,就形成了Bert的输入。
如上图所示,输入有A句[my dog is cute]和B句[he likes playing]这两个自然句,我们首先需要将每个单词及特殊符号都转化为词嵌入向量,因为神经网络只能进行数值计算。其中特殊符[SEP]是用于分割两个句子的符号,前面半句会加上分割码A,后半句会加上分割码B
因为要建模句子之间的关系,BERT 有一个任务是预测 B 句是不是 A 句后面的一句话,而这个分类任务会借助 A/B 句最前面的特殊符 [CLS] 实现,该特殊符可以视为汇集了整个输入序列的表征。
最后的位置编码是 Transformer 架构本身决定的,因为基于完全注意力的方法并不能像 CNN 或 RNN 那样编码词与词之间的位置关系,但是正因为这种属性才能无视距离长短建模两个词之间的关系。因此为了令 Transformer 感知词与词之间的位置关系,我们需要使用位置编码给每个词加上位置信息。
总结一下:
(1)token embeddings表示的是词向量,第一个单词是CLS,可以用于之后的分类任务
(2)segment embeddings用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务
(3)position embeddings表示位置信息。
输出:每个token位置(包括[cls][sep]符号)返回的输出都是一个隐藏层大小的向量(基本版本BERT为768)。以文本分类为例,我们重点关注第一个位置上的输出(第一个位置是分类表示[CLS])

bert-fine-tune

BERT是一种基于微调的多层Transformer编码器,它的目标是生成语言模型,所以只需要transformer的encoder部分。BERT 使用 Transformer 而不是 Bi-LSTM 做encoder,可以有更深的层数、具有更好并行性。
BERT 模型进一步增加词向量模型泛化能力,充分描述字符级、词级、句子级甚至句间关系特征。

CBOW(连续词袋模型) 的核心思想是:在做语言模型任务的时候,我把要预测的单词抠掉,然后根据它的上文 Context-Before 和下文 Context-after 去预测单词。其实Bert就是这么做的。 Bert 在模型方面其实没有太大创新,更像一个最近几年 NLP 重要技术的集大成者。它本身的效果好和普适性强才是最大的亮点。
BERT模型使用两个新的无监督预测任务进行预训练,分别是Masked LM和Next Sentence Prediction。
nlp-bert学习1
【fine-tune】假设已有A训练集,先用A对网络进行预训练,在A任务上学会网络参数,然后保存以备后用,当来一个新的任务B,采取相同的网络结构,网络参数初始化的时候可以加载A学习好的参数,其他的高层参数随机初始化,之后用B任务的训练数据来训练网络,当加载的参数保持不变时,称为"frozen",当加载的参数随着B任务的训练进行不断的改变,称为“fine-tuning”,即更好地把参数进行调整使得更适合当前的B任务。
优点:当任务B的训练数据较少时,很难很好的训练网络,但是获得了A训练的参数,会比仅仅使用B训练的参数更优。

真正体现出BERT这个模型是龙骨级模型而不再是词向量的,就是其到各个下游任务的接口设计了,或者换个更洋气的词叫迁移策略。BERT在11个不同任务中的模型,它们只需要在BERT的基础上再添加一个输出层便可以完成对特定任务的微调。

NLP的四大任务
(1)序列标注:分词、实体识别、语义标注……
(2)分类任务:文本分类、情感计算……
(3)句子关系判断:entailment、QA、自然语言推理
(4)生成式任务:机器翻译、文本摘要。

对于句子关系类任务,很简单,和GPT类似,加上一个起始和终结符号,句子之间加个分隔符即可。对于输出来说,把第一个起始符号对应的Transformer最后一层位置上面串接一个softmax分类层即可。对于分类问题,与GPT一样,只需要增加起始和终结符号,输出部分和句子关系判断任务类似改造;对于序列标注问题,输入部分和单句分类是一样的,只需要输出部分Transformer最后一层每个单词对应位置都进行分类即可。从这里可以看出,上面列出的NLP四大任务里面,除了生成类任务外,Bert其它都覆盖到了,而且改造起来很简单直观。

Fine-tune任务包括
1)句子对分类任务;
2)单句子分类任务;
3)问答任务;
4)命名实体识别任务
nlp-bert学习1
其中Tok表示不同的Token,E表示嵌入向量,Ti表示第 i个Token在经过BERT处理之后得到的特征向量(向量维度=hidden_size)。
Fine-tune任务包括1)句子对分类任务;2)单句子分类任务;3)问答任务;4)命名实体识别任务
1、基于句子对的分类任务
MNLI:给定一个前提 (Premise) ,根据这个前提去推断假设 (Hypothesis) 与前提的关系。该任务的关系分为三种,蕴含关系 (Entailment)、矛盾关系 (Contradiction) 以及中立关系 (Neutral)。所以这个问题本质上是一个分类问题,我们需要做的是去发掘前提和假设这两个句子对之间的交互信息。
QQP:基于Quora,判断 Quora 上的两个问题句是否表示的是一样的意思。
QNLI:用于判断文本是否包含问题的答案,类似于我们做阅读理解定位问题所在的段落。
STS-B:预测两个句子的相似性,包括5个级别。
MRPC:也是判断两个句子是否是等价的。
RTE:类似于MNLI,但是只是对蕴含关系的二分类判断,而且数据集更小。
SWAG:从四个句子中选择为可能为前句下文的那个。
2、基于单个句子的分类任务
SST-2:电影评价的情感分析。
CoLA:句子语义判断,是否是可接受的(Acceptable)。
对于GLUE数据集的分类任务(MNLI,QQP,QNLI,SST-B,MRPC,RTE,SST-2,CoLA),BERT的微调方法是根据[CLS]标志生成一组特征向量 ,并通过一层全连接进行微调。损失函数根据任务类型自行设计,例如多分类的softmax或者二分类的sigmoid。
SWAG的微调方法与GLUE数据集类似,只不过其输出是四个可能选项的softmax。
3、问答任务
SQuAD v1.1:给定一个句子(通常是一个问题)和一段描述文本,输出这个问题的答案,类似于做阅读理解的简答题。SQuAD的输入是问题和描述文本的句子对。输出是特征向量,通过在描述文本上接一层**函数为softmax的全连接来获得输出文本的条件概率,全连接的输出节点个数是语料中Token的个数。
4、命名实体识别
CoNLL-2003 NER:判断一个句子中的单词是不是Person,Organization,Location,Miscellaneous或者other(无命名实体)。微调CoNLL-2003 NER时将整个句子作为输入,在每个时间片输出一个概率,并通过softmax得到这个Token的实体类别。

bert-优点

Bert预训练模型做fine-tune的优点
1、不需要在对下游任务设计task-specific model,Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters, 例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune。
2、更快速的开发
3、更少的数据
4、更好的结果

作者在文中主要提到的就是MLM预训练时的mask问题
1)[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现;
2)每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)
3、模型参数比较多,很容易OOM

参考文献

[1] https://zhuanlan.zhihu.com/p/48612853
[2] https://juejin.im/post/6844904167257931783
[3]