Bert原理
Bert原理介绍原理1.transformer功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入介绍Bert是谷歌在2..
Bert原理
介绍
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%的准确度。
更多推荐
所有评论(0)