介绍

Bert是谷歌在2018搞的大新闻,公司AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%)等。BERT将为NLP带来里程碑式的改变,也是NLP领域近期最重要的进展。
BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

原理

1.transformer简介

Transformer由论文《Attention is All You Need》提出,也是google在2017发表。最初是提出来做语言翻译模型的,但是基于其编码解码的优点,使得transformer不经意间影响了未来n年nlp的发展。
transformer总体来说是长这样的,即一个大盒子,输入原始中文,输出目标语言。
在这里插入图片描述
transformer由编码组件、解码组件和它们之间的连接组成:
在这里插入图片描述
编码组件部分由一堆编码器(encoder)构成(论文中是将6个编码器叠在一起——数字6没有什么神奇之处,你也可以尝试其他数字)。解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的。
在这里插入图片描述
所有的编码器在结构上都是相同的,但它们没有共享参数。每个解码器都可以分解成两个子层。
在这里插入图片描述
从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。我们将在稍后的文章中更深入地研究自注意力。
自注意力层的输出会传递到前馈(feed-forward)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)。

2.transformer-encoder

bert使用transformer模型,只包含了其编码器。在bert之后许多语言模型都是采用其编码结构,所以今天只理解2017版的编码器。刚才已经说到编码器,encoder实际上在本次文本分类中,使用了四个小模块:①词嵌入、②位置编码、③self-attention计算、④线性激活。

2.1词嵌入

词嵌入是将一句话,如‘小明逃课了’5个字嵌入到300维度的词表中,嵌入后这句话的维度就是[32*300],但是每句话的长度大小肯定不一致,因此在平常要做padding,类似于图像四周的padding效果。padding长度一般就25或者32。2.1与传统方法一样,都需要将每个字做维度嵌入,在训练过程中不断的更新字的权重。原序列i1,i2,i3经过嵌入后形成了x1,x2,x3。

2.2位置编码

由于不像传统的RNN,lstm一样,还会将每个字词连接在一起,因此也就失去了nlp中最重要的语序信息。所以transformer需要提出一种替代方法来使得,输入的文本具有序列效果。解决办法是提出了位置编码,位置编码计算公式为如下:
在这里插入图片描述
在这里插入图片描述
pos即为xi字符在该句子中的位置,i∈[0,299]。这样的奇偶正余弦编码,就赋予了字的相对位置能力。比如说‘小明逃课了’中的小字是[0][300],0控制了pos。i1,i2,i3形成了z1,z2,z3
将输入做了位置编码后还需要和词嵌入做相加,形成x1+z1,x2+z2,x3+z3的最终输入编码。

2.3self-attention计算

self-attention与传统的attention有什么区别?举例,老版本的attention是在分类任务结束之前,即softmax之前乘以一个相同宽度的权重矩阵,使得X1,X2,X3都具有一定的权重。这样的attention对于整体来说,每个字词的确是有一个倾向性,但是如果对于每个字来说,根本不知道其他词与自己之间的重要性。比如说‘The animal didn’t cross the street because it was too tired’attention是无法理解it是指向了谁的。所以self-attention的推出,即可实现这样的目的,更好的关联起字词之间的权重能力。
在这里插入图片描述
self-attention计算方法:
①首先将输入X(维度还是[b,32,300])派生出一模一样的Q,K,V。
②将Q,K,V reshape为[bhead,-1,300],这里的head是指多头,什么意思???官解为,比如说有5个头,这句话刚好5个字,那么5恰好能使每个位置都能够拥有不同的关联关系,关联关系就是上图各词与他词的关系。这时Q,K,V 维度即为[b5,32,60]
③计算attention =(QK的转置)/根号dk,attention的维度[b5,32,60]。
④attention=softmax(attention)
⑤attention=attention*V
⑥attention reshape回原本维度[b,32,300]
⑦attention,接linear(300,300),再接dropout,再接layernorm。LN是在每一个样本上计算均值和方差,而不是BN那种在批方向计算均值和方差!

2.4前馈神经

刚才已经得到了attention,维度[b,32,300],需要再前馈时做残差连接。具体为
①att=linear(300,2048)(x)
②att=linear(2048,300)(att)
③att=dropout(.1)
④att=att+x
得到的att维度即为[b,32,300]

2.5连接整个transformer

整个transformer的网络连接顺序皆为,2.1→2.2→n个(2.3→2.4)→结果

3.bert在前人基础上的工作

3.1输入嵌入层

bert的词嵌入层与transformer不一样的地方在于,添加了segment部位编码。这里的部位编码是因为,bert将两个句子合并起来,目的是为了训练模型获得上下文信息的能力,所以Ea,Eb分别代表前后句子。然后token和之前的i1,i2,i3不变。最后之前的正余弦相对位置编码择替换成了绝对位置编码。所以有人就把该方式换了,效果我没考证。
在这里插入图片描述

3.2整个encoder的各种维度加大
  • 相比transformer,bert(base)加大模型的地方有:
    encoder层数,6→12
    隐藏层数目,512→768
    前馈的隐藏层数目大小,2048→3072
    多头multi-head,8→12
  • 相比transformer,bert(larg)加大模型的地方有:
    encoder层数,6→12
    隐藏层数目,512→1024
    前馈的隐藏层数目大小,2048→4096
    多头multi-head,8→16
3.3预训练
3.3.1预训练,语言遮挡模型

BERT提出了Masked Language Model,也就是随机去掉句子中的部分token,然后模型来预测被去掉的token是什么。这样实际上已经不是传统的神经网络语言模型(类似于生成模型)了,而是单纯作为分类问题,根据这个时刻的hidden state来预测这个时刻的token应该是什么,而不是预测下一个时刻的词的概率分布了。
这里的操作是随机mask语料中15%的token,然后预测masked token,那么masked token 位置输出的final hidden vectors喂给softmax网络即可得到masked token的预测结果。
这样操作存在一个问题,fine-tuning的时候没有[MASK] token,因此存在pre-training和fine-tuning之间的mismatch,为了解决这个问题,采用了下面的策略:

80%的时间中:将选中的词用[MASK]token来代替
例如my dog is hairy → my dog is [MASK]

10%的时间中:将选中的词用任意的词来进行代替
例如my dog is hairy → my dog is apple

10%的时间中:选中的词不发生变化
例如my dog is hairy → my dog is hairy

这样存在另一个问题在于在训练过程中只有15%的token被预测,正常的语言模型实际上是预测每个token的,因此Masked LM相比正常LM会收敛地慢一些,后面的实验也的确证实了这一点。

3.3.1预训练,下一句预测模型

很多需要解决的NLP 任务依赖于句子间的关系,例如问答任务等,这个关系语言模型是获取不到的,因此将下一句话预测作为了第二个预训练任务。该任务的训练语料是两句话,来预测第二句话是否是第一句话的下一句话,如下所示,最终该任务得到了97%-98%的准确度。
在这里插入图片描述

Logo

尧米是由西云算力与CSDN联合运营的AI算力和模型开源社区品牌,为基于DaModel智算平台的AI应用企业和泛AI开发者提供技术交流与成果转化平台。

更多推荐