关于最近的NLP模型Bert、Elmo、GPT(下--2)

这篇这个系列的最后一篇文章,还是关于Bert,的下半部分。
今天又读了一遍Bert的论文,这篇结尾主要从两个方面来介绍bert,一个是怎么用,一个是比较这个三个模型


Bert使用方法

  1. 将bert当做一个词向量的模型,bert的输出可以作为你模型的输入,然后主要任务是你的模型做。这样的任务可以用在文本分类,语义分析等多种场景,比transformer,elmo,word2vector的效果要好。
  1. 利用bert的结构来做多种任务。
    在论文的原文里是这样写的


    13790629-9139d050aa0850dc.jpg
    bert下游任务

我们具体于特定任务的模型是通过给 BERT 加一个额外的输出层构成,所以仅需要从头学
习最小数量的参数。其中(a)和(b)是序列级任务,(c)和(d)是标记级任务。图中E表示
嵌入的输入,Ti 表示第 i 个标记的上下文表示,[CLS] 是分类输出的特殊符号,[SEP] 是分离非
连续标记(分离两个句子)序列的特殊符号。

对于句子关系类任务,很简单,和GPT类似,加上一个起始和终结符号,句子之间加个分隔符即可。对于输出来说,把第一个起始符号对应的Transformer最后一层位置上面串接一个softmax分类层即可。对于分类问题,与GPT一样,只需要增加起始和终结符号,输出部分和句子关系判断任务类似改造;对于序列标注问题,输入部分和单句分类是一样的,只需要输出部分Transformer最后一层每个单词对应位置都进行分类即可。从这里可以看出,上面列出的NLP四大任务里面,除了生成类任务外,Bert其它都覆盖到了,而且改造起来很简单直观。尽管Bert论文没有提,但是稍微动动脑子就可以想到,其实对于机器翻译或者文本摘要,聊天机器人这种生成式任务,同样可以稍作改造即可引入Bert的预训练成果。只需要附着在S2S结构上,encoder部分是个深度Transformer结构,decoder部分也是个深度Transformer结构。根据任务选择不同的预训练数据初始化encoder和decoder即可。这是相当直观的一种改造方法。当然,也可以更简单一点,比如直接在单个Transformer结构上加装隐层产生输出也是可以的。不论如何,从这里可以看出,NLP四大类任务都可以比较方便地改造成Bert能够接受的方式。这其实是Bert的非常大的优点,这意味着它几乎可以做任何NLP的下游任务,具备普适性,这是很强的。

Bert、GPT、Elmo的比较

首先是结构的不同


13790629-0b3e8e46ff92c2ad.jpg
三种模型结构

BERT 使用双向 Transformer。OpenAI GPT 使用 从左到右的Transformer。ELMo 使用独立训练的从左到右和从右到左的 LSTM 的连接来为下游任务生成特征。其中,只有 BERT 表示在所有层中同时受到左右语境的制约。

13790629-f962ce9002529416.jpg
bert比较

Bert其实和ELMO及GPT存在千丝万缕的关系,比如如果我们把GPT预训练阶段换成双向语言模型,那么就得到了Bert;而如果我们把ELMO的特征抽取器换成Transformer,那么我们也会得到Bert。所以你可以看出:Bert最关键两点,一点是特征抽取器采用Transformer;第二点是预训练的时候采用双向语言模型。


都这里,这个系列的文章就全部结束了,我写的东西只是非常皮毛,一些细节如果想深究还需要读论文原文,看源代码以及查阅其他资料。
这里介绍一篇相关资料,讲的非常非常好的文章。 最近还在找工作,等找到工作了再更新下个系列。