关于最近的NLP模型Bert、Elmo、GPT(上)

有些时没有更新blog,最近被工做弄的很闹心,拖了又拖,仍是把最近的一些nlp模型研究学一下。函数

虽然如今没有这这一块工做,可是总的来讲,新出来的这些个模型,仍是没有让人眼前一亮的东西出来。Bert的出现多是暂时统一了江湖,可是底层结构不改,仍是在提高那1%。学习


Elmo

Elmo(Embeddings from Language Models),是allen NLP 在18年6月NAACL上发的一个词向量训练模型。3d

就是说,Elmo的做用就是训练一个模型,用来表示某个词,换句话说,和word2vec和GloVe功能是同样的,这个新的训练方法有两点进步:orm

  1. 可以处理单词用法中的复杂特性(好比句法和语义)
  2. 有些用法在不一样的语言上下文中如何变化(好比为词的多义性建模)

具体是什么意思呢,由于不少词它表达的意思是随着语境而变化的,好比说“今年的苹果很贵,13块一斤”和“今年的苹果很贵,高配要1万块”。这两个句子里的苹果显然不是一个东西,可是咱们以前用的词向量word2vec和GloVe,都不能表达出这两个词之间的差异。
因此Elmo要解决这个问题。blog

Elmo为何能有这个能力来联系上下文表达出词义。其实能够想一想,什么模型能够联系上下文,无疑CRF和RNN对不对。而CRF是经过几率图的形式,将每一步的几率向下传递,这就没办法给出每个词的输出。可是咱们在LSTM中,每个cell是又两个输出的,一个是c(x)(细胞状态),一个是h(x)(隐藏层状态),这两种状态中都包含以前的信息。
这里咱们想到,从前到后是一种信息,从后到前又是一种信息,因此用双向模型所拥有的信息会更多。若是把双向每个cell的隐藏层信息的向量组合起来,最后再接一个softmax(也有取最上一层的输出),最后训练出的向量即为咱们想要的词向量。get


13790629-ee64cf45091f6cdd.PNG
ELMo

你们其实看张图已经能够很清楚的看到ELMO的结构了,也没有那么复杂,对比和word2vec训练出的词向量:it

  1. ELMo的假设前提一个词的词向量不该该是固定的,因此在一词多意方面ELMo的效果必定比word2vec要好。
  2. word2vec的学习词向量的过程是经过中心词的上下窗口去学习,学习的范围过小了,而ELMo在学习语言模型的时候是从整个语料库去学习的,然后再经过语言模型生成的词向量就至关于基于整个语料库学习的词向量,更加准确表明一个词的意思。
  3. ELMo还有一个优点,就是它创建语言模型的时候,能够运用非任务的超大语料库去学习,一旦学习好了,能够平行的运用到类似问题。

上elmo的效果:io

  • Textual entailment: stanford natural language inference (SNLI)数据集上提高了1.4%。
  • Question answering: 在stanford question answering dataset (SQuAD)数据集上提高了4.2%,将ELMo加入到以前的state-of-the-art的ensemble模型中,提高了10%。
  • Semantic role labeling: 比以前的state-of-the-art模型提升了3.2%,将ELMo加入到以前的state-of-the-art的单模型中,提高了1.2%。
  • Coreference resolution: 比以前的state-of-the-art模型提升了3.2%,将ELMo加入到以前的state-of-the-art的ensemble模型中,提高了1.6%。
  • Named entity extraction: 在CoNLL 2003 NER task数据机上提升了2.06%
  • Sentiment analysis: 比以前的state-of-the-art模型提升了3.3%,将ELMo加入到以前的state-of-the-art模型中,提高了1%。
    也仍是1-3%左右的提高。

GPT

由于bert统治性的地位,bert我要单独用一篇文章讲。这里来介绍GPT。
GPT是openAI早于BERT的一个模型,可是因为宣传缘由,致使GPT1.0并无出个大新闻,可是GPT的单项语言模型在GPT2.0为本身正名,虽然尚未在GLUE上大展拳脚,可是我相信,按照目前的趋势,GPT3.0必定会大展拳脚,打掉bert。这篇文章写的很不错GPT和BERT的现状和前景form

说GPT以前,我想说结合Bert和GPT来看,LSTM颇有可能淘汰,而被Transformer全方位的取代,缘由有两点:class

  1. Transformer能够并行计算;
  2. Transformer有关联上下文的能力

GPT采用了单项的Transformer完成预训练任务,而且将12个Trm叠加起来,而训练的过程其实很是的简单,就是将句子n个词的词向量(第一个为<SOS>)加上Positional Encoding后输入到前面提到的Transfromer中,n个输出分别预测该位置的下一个词(<SOS>预测句子中的第一个词,最后一个词的预测结果不用于语言模型的训练)。


13790629-97ba6e1088778b39.jpg
GPT的单项Transformer结构

13790629-3db9851d88a2e0d5.jpg
GPT的训练方式

和Bert相同的是,GPT也是分两个阶段进行训练,第一阶段预训练后还有一个fine-tune。(由于GPT发布的比bert早,因此是否是bert抄GPT的呢?)

上一步中最后一个词的输出咱们没有用到,在这一步中就要使用这一个输出来做为下游监督学习的输入,这样就运用少许的带标签数据对模型参数进行微调。
而后接下来一步就是我以为这个模型很牛逼的地方了,为避免Fine-Tuning使得模型陷入过拟合,文中还提到了辅助训练目标的方法,相似于一个多任务模型或者半监督学习。具体方法就是在使用最后一个词的预测结果进行监督学习的同时,前面的词继续上一步的无监督训练,使得最终的损失函数成为:


13790629-9dccc426f9c3d7ae.png
多任务的损失函数

针对不一样任务,须要修改输入数据的格式:


13790629-d0680b9e918b7f53.jpg
多任务输入数据训练格式

站着把监督和无监督都办了,真是牛逼。这篇文章写的很是好https://zhuanlan.zhihu.com/p/69290203

以上是GPT1.0,而GPT2.0主要改进我以为除了对Transformer有细微的改动以外,还有就是增大了参数容量(变成了1.5亿参数。。),还有训练数据加大(800W高质量网页内容)。这些改变就让GPT2.0变得煊赫一时(好像是有钱就是牛逼,暴力提高法),不得不期待一下GPT3.0 能作到什么地步。

好的,上到这里就完了,下来好好讲一讲Transformer和Bert。