【NLP】彻底搞懂BERT (2)

  ELmo模型是AllenNLP在2018年8月发布的一个上下文无关模型,甚至在9月10月BERT没出来时,也小火了一把。但据说使用时很慢效率很低,再加上马上就提出的强势BERT,ELMo很快就被人们忘掉了。。。但BERT的提出,算是对ELMo的致敬,硬是凑了一个和ELMo一个动画片里的角色名。。。(下面左图,红色的是ELMo,右二是BERT)

【NLP】彻底搞懂BERT

        

这里介绍ELMo的两方面,一个是它的encoder模型Bi-LSTM,另一个是它和下游具体NLP任务的接口(迁移策略)。  

Bi-LSTM做encoder实现上下文相关(context):

  这里就是之前说的把下游具体NLP任务放到预训练产生词向量里面,从而达到获得一个根据context不同不断变化的dynamic词向量。具体实现方法是使用双向语言模型(BiLM)Bi-LSTM来实现,如下面左图所示。从前到后和后到前分别做一遍LSTM的encoding操作,从而获得两个方向的token联系,进而获得句子的context。

  但这里有两个潜在问题,姑且称作“不完全双向”和“自己看见自己”。

  首先,“不完全双向”是指模型的前向和后向LSTM两个模型是分别训练的,从图中也可以看出,对于一个序列,前向遍历一遍获得左边的LSTM,后向遍历一遍获得右边的LSTM,最后得到的隐层向量直接拼接得到结果向量(前向的hidden state1 + 后向的hidden state2 = 总的hidden state,+是concat),并且在最后的Loss function中也是前向和后向的loss function直接相加,并非完全同时的双向计算。

  另外,“自己看见自己”是指要预测的下一个词在给定的序列中已经出现的情况。传统语言模型的数学原理决定了它的单向性。从公式

【NLP】彻底搞懂BERT

可以看出,传统语言模型的目标是获得在给定序列从头到尾条件概率相乘后概率最大的下一词,而双向模型会导致预测的下一词已经在给定序列中出现了的问题,这就是“自己看见自己”。如下面右图所示(图片从下往上看),最下行是训练数据A B C D,经过两个bi-lstm操作,需要预测某个词位置的内容。比如第二行第二列A|CD这个结果是第一层bi-lstm在B位置输出内容,包括正向A和反向CD,直接拼接成A|CD。比如第三行第二例ABCD这个结果是前向BCD和反向AB|D拼接结果,而当前位置需要预测的是B,已经在ABCD中出现了,这就会有问题。因而对于Bi-LSTM,只要层数增加,就是会存在“自己看见自己”的问题。

 

【NLP】彻底搞懂BERT

        

【NLP】彻底搞懂BERT

 与下游具体NLP任务接口:

  ELMo模型将context的encoding操作从下游具体NLP任务转换到了预训练词向量这里,但在具体应用时要做出一些调整。当bilstm有多层时,由于每层会学到不同的特征,而这些特征在具体应用中侧重点不同,每层的关注度也不同。ELMo给原始词向量层和每个RNN隐层都设置了一个可训练参数,通过softmax层归一化后乘到相应的层上并求和起到了加权作用。

  比如,原本论文中设定了两个隐层,第一隐层可以学到对词性、句法等信息,对此有明显需求的任务可以对第一隐层参数学到比较大的值;第二隐层更适合对词义消歧有需求的任务,从而分配更高权重。

下面是 ELMo的比较表格。

【NLP】彻底搞懂BERT

 

3. BERT

【NLP】彻底搞懂BERT

BERT模型进一步增加词向量模型泛化能力,充分描述字符级、词级、句子级甚至句间关系特征。

真正的双向encoding:

  Masked LM,类似完形填空,尽管仍旧看到所有位置信息,但需要预测的词已被特殊符号代替,可以放心双向encoding。

Transformer做encoder实现上下文相关(context)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpypss.html