ELMO,GPT,BERT初步学习

https://lilianweng.github.io/lil-log/2019/01/31/generalized-language-models.html
在2018年,诸如GPU, BERT等大体积的语言模型在各种任务上达到了比较好的效果。而我们在训练语言模型的过程中,也不同于图像的预训练模型,NLP任务的预训练不需要带标签的数据。
最刚开始的语言模型(word2vec, doc)训练思路是基于词共现的,而不会更具特定的上下文做改变。这种方式的embedding在一定程度上会有效,但是其提升程度是有限的。
这里我们会提到多种对文本构建词向量的方法,这些词向量怎么更加容易和高效低用于下游NLP任务。

CoVe

CoVe(Contentual Word Vecotrs), attention的seq2seq的机器翻译模型中得到的词向量。【这里的CoVe得到的是整个句子的向量】

NMT recap

NMT(Neural Machine Translation) 的encoder部分由两层标准的biLSTM组成,decoder是一个带有attiontion机制的LSTM。
以英-法翻译为例,在encoder端进行英语单词embedding的训练。
encoder的输出,会带有单词上下文的信息,好处是对很多下游NLP任务有好处。
使用glvoe和CoVe共同做文本分类任务,其中glove提供了词之间的共现关系,CoVe提供了句子的上下文信息。
CoVe的缺陷:

  1. 在有监督的翻译任务上做预训练,受制于语料。
  2. CoVe对最终任务性能的提升受限于具体的任务。
    接下来会说到的 ELMo模型克服了如下问题: 通过无监督的预训练(GPT\BERT),可以用于各种下游任务。

ELMo

ELMo(Embedding from language Model),通过无监督的方式,使用预训练语言模型来做包含上下文信息的单词表征。

bidirectional language model

使用双向LSTM提取特征,两个LSTM共享embedding层和softmax层。
模型的目标是最小化negative log likelihood。

ELMo representations

在biLM的顶层,ELMo通过具体的任务学习,把各层的隐层堆叠起来,隐藏层的内容包括: embedding layer output和weight。
为了评估不同的隐藏层捕获的不同信息,ELMo使用不同层的表征来表示语义特征和语法特征。

  1. semantic task: 单词语义消歧。BILM的顶层隐藏层要优于第一层。
  2. syntax task: part-of-speech(POS)任务中,使用第一层要优于BiLM的顶层神经元。
    研究表明,语法信息在低层次的隐藏层中得到了比较好的表达,而语义信息是在高层的隐藏层中得到了较好的表达。【怎么指定使用哪一层的神经元呢】

Use ELMo in Downstream Tsasks

这里的语言模型是无监督的,理论上可以继续加大。然而这个训练依然是和任务无关的,所以还需要在具体的任务上,再做一些工作以提高性能。

Cross-View Training

Model Architecture

https://zhuanlan.zhihu.com/p/55182085

OpenAI GPT

GPT(generative pre-trainging transformer) ,雨ELMO比较相似。使用了更多的语料,体积上也更大。和ELMo主要体现在两个方面的不同:

  1. 模型结构不同。ELMo是浅层的模型,将从左到右和从右到左的多层LSTM级联起来;而GPT在decoder部分是一个多层的transformer。
  2. 在辖有任务红,使用embedding的方式是不同的,ELMo在特殊任务重把embeedding当作外部特征直接喂入,而GPT需要对特殊任务做微调。

transformer decoder as language model

与原生的transformer下关闭,这里的模型丢弃了encoder部分,因此输入为一个单一的句子。
输入句子,模型包含了多个transformer block,每个block又包含了一个multi-head self-attention以及pointwise feed-forward层。最终输出为经过softmax归一化的分布式表达。
在损失函数上,GPT和ELMo一样,都是negative log-likelihood。

BPE

Byte Pair Encoding(BPE)用来对输入序列进行编码。BPE最初是是使用在压缩算法重,后来被应用于解决机器翻译重的OOV问题,我们可以解决极少出现的单词问题,并翻译为一种新的语言。为了把很少出现或UNK的单词分解为多个subwords,BPE通过迭代和贪婪的方法将单个token进行有分割的拼接。

superviesed fine-tuning

GTP与任务无关,只可以使用预训练的方式直接进行训练。
以分类任务为例,在带标签的数据集重,输入为x=(x1,x2…,xn),输出为y。GPT先将x通过与训练的transformer decoder,然后最后一层的输出就是隐藏层表示,需要更新的权重是Wy,这些权重可以对特殊任务有更好的适应性。
loss为最小化negative log-likelihood,另外添加LM loss会有更好的效果。

  1. 可以加快训练阶段的拟合速度
  2. 可以提升有监督模型的生成效果。
    可以应用的场景包括: 分类、蕴含关系、句子相似度、多项选择等。
    在大部分的任务上可以达到一个比较好的效果。首先GPT在训练阶段可以接受尽可能多的数据,第二部微调阶段,只需要提供较少的数据,以及少量的参数更新。
    但是GPT有一个限制,就是单向的模型,只能够预测从左到右。

BERT

BERT(Bidirectional Encoder Representations from Transformers)同样更可以在无标注的样本上进行预训练,然后在特殊任务上进行微调,不需要做额外的网络搭建。
与GPT相比,BERT最大的不同在于其训练方式是双向的。模型可以学习到单词的上下文信息。
BERT的结构是一个而多层的双向transformer encoder。

pre-training tasks

BERT模型的训练包含了两个任务,Mask language model 和 Next sentence prediction

Mask language model

  1. 训练阶段每个单词有15%的概率,使用[MASK]替换。而在微调的时候,是没有[MASK]的,所以又加了一些trick,使用80%的概率,在挑选重的15%的单词里,继续下替换MASK,有10%的概率随机替换一个词,10%的概率使用原来的词。
  2. 模型只预测missing的单词,【看不懂这里…】

Next sentence prediction

考虑到在下游环境中,会涉及到句子间的关系信息,bert添加了一个文本二分类的任务,来判断语料中下一个句子作为当前句子的下一句是不是合适。

  1. 句子对均匀分布,50%的是,50%的不是
  2. 模型输出判断句子B是不是A的下一句。
    这两个人的特性,促使了我们的训练数据可以无限多。训练loss是LM likelihood lose与mean next sentence prediction likelihood的和。

input Embedding

输入embedding主要包含三个组成:

  1. wordpiece tokenization embedding, 就是subword的embedding,可以解决rare word和oov的问题。
  2. segment embedding,当有两个句子A,B的时候,会有分割符[SEP]的问题存在,这里使用E(A)E(B)来区分句子的界限。
  3. position embedding,
    embedding的第一个位置是[CLS],将来在下游任务可以使用。

use bert in Downstream Tasks

bert的微调阶段,也仅仅需要少量的参数加入。
对于分类任务,我们使用最后隐藏层的特殊字符[CLS],将其输入dense层,然后做softmax。
对于QA问题入SQuAD,我们需要预测一个段落是不是一个问题的答案。bert对两个touken给出概率分布【这里不是很清晰】

有三处需要再细看。

你可能感兴趣的:(NLP,自然语言处理)