划时代的产物

在2018年,谷歌推出了BERT模型之后,该模型在11项NLP任务中夺得STOA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最早是用于机器翻译任务,当时达到了STOA效果。

Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。在本文中,我们将研究Transformer模型,把它掰开揉碎,理解它的工作原理。

近期发现,在图像识别领域,Transformer表现出来的效果出乎意料的好,竟然有取代CNN的势头!

传统的解决方案遇到的问题

传统的RNN

  • 传统的RNN有依赖关系,不能实现并行,但是Transformer可以
  • Self-Attention注意力机制来进行并行计算,在输入与输出相同
  • 输出的结果是同时被计算出来的,现在基本已经取代了RNN

模型对比

github自然语言处理模型 自然语言处理 transformer_自然语言处理

传统的word2vec

  • 使用词向量模型,是预先对词语训练好词向量,然后这个向量就不变了,然后去寻找文本中的词,将其转换为词向量,再输入到RNN中网络模型中。
    但是呢,相同的词在不同的语境中,表达的意思可能不同,例如:干哈捏。
  • 使用BERT模型,可以考虑到上下文的影响,在不同的输入当中,对应词向量也就不同了哦。太牛了吧!

如图:两句话中的it就是不同的,指代的意思也不同!

github自然语言处理模型 自然语言处理 transformer_词向量_02

注意力机制的作用

提取特征的时候,什么是重点,就是去发现你的数据的重点在哪。如下图,我们前面输入了一个序列,当我不强调哪个词重要,我得到的结果可能是平行的。

github自然语言处理模型 自然语言处理 transformer_词向量_03

但是呢,这个判断过程不是你认为加进去的,是交给计算机,让他去判断的哦!!!

在一句话中,每一个词(中文是字),都会结合上下文判断句子中其余词和自己关系的远近,如图,it中animal就关系影响很大:

github自然语言处理模型 自然语言处理 transformer_机器学习_04

self-attention如何计算

整体流程如下

github自然语言处理模型 自然语言处理 transformer_自然语言处理_05

①首先将x1、x2两个词进行编码得到向量

github自然语言处理模型 自然语言处理 transformer_机器学习_06

②经过计算得到每个词的三个特征矩阵Q、K、V

github自然语言处理模型 自然语言处理 transformer_github自然语言处理模型_07

Q:第一个词做了啥贡献、第二个词做了啥贡献,就要去查一查和第一个词关系咋样,和第二个词关系咋样。

K:被查的,q1和k1就是第一个词的与第一个词的关系,q1和k2就是第一个词和第二个词的关系。

V:每个关系都查到了,关系大的多点输入,关系少的少点输入,v1就代表x1的特征表达,v2就代表x2的特征表达,表示实际的特征信息

③回顾

github自然语言处理模型 自然语言处理 transformer_github自然语言处理模型_08

计算q1·k1是使用内积计算的,当线性无关的时候就会垂直,即内积为0,当相关性越大,关系就越大哦!

④最终的value计算

softmax计算流程

分值->e^x->归一化

github自然语言处理模型 自然语言处理 transformer_github自然语言处理模型_09

计算每一个词语对该词语的影响权重,计算公式:

github自然语言处理模型 自然语言处理 transformer_归一化_10

然后再计算对应词的value与计算到的权重的乘积之和,就能得到第一个词的影响力。如下图所示:

github自然语言处理模型 自然语言处理 transformer_词向量_11

github自然语言处理模型 自然语言处理 transformer_自然语言处理_12

⑤整体回顾

github自然语言处理模型 自然语言处理 transformer_机器学习_13

再次声明:咱们的计算是并行加速计算的,即使用矩阵乘法(不是使用for循环,多low哦)!直接就出来了,是不是很牛批,呜呜呜我爱线代❤️

multi-head(多头机制)的作用

一个词已经得到了一个q、k、v,参考卷积神经网络的卷积和与特征图,我们一组qkv得到了一种特征表达,如果能有多种qkv,我们就能得到多种当前特征的表达。

多头不是越多越好,一般而言是8个。

github自然语言处理模型 自然语言处理 transformer_github自然语言处理模型_14

堆叠在一起,得到最后的注意力!嘿嘿,机智哦宝贝!!!

github自然语言处理模型 自然语言处理 transformer_github自然语言处理模型_15

这是两个头,图中可以看到,和自己的注意力是挺大的,离得越远可能就注意力会小一下

github自然语言处理模型 自然语言处理 transformer_自然语言处理_16

堆叠多层:经过多头机制,一个不太好看的向量转化为了差不多的向量,我们重复多次提取,得到最后好看的向量!

github自然语言处理模型 自然语言处理 transformer_github自然语言处理模型_17

位置编码与归一化

位置编码

在self-attention中每个词都会考虑整个序列的加权,所以其出现位置并不会对结果产生什么影响,相当于放哪都无所谓,但是这跟实际就有些不符合了,例如:我今天下午想去打球,肯定下午和打球是重点呀,于是我们希望模型能对位置有额外的认识。

这个人家已经写好了,不用管太多,BERT是使用正弦周期变化来进行位置编码。

归一化

下图所示,self-attention之后呢,有一个LayerNorm归一化,但是,什么叫对层进行归一化??

LayerNorm就是没有Batch概念了,对他的一组数据,使得均值为0,平方差为1。

github自然语言处理模型 自然语言处理 transformer_词向量_18

虚线部分是连接,用的是基本的残差连接方式,得到两个数据,模型自己去选择,至少不比原来差

github自然语言处理模型 自然语言处理 transformer_自然语言处理_19

整体梳理

多了Decoder-Encoder-attention机制

github自然语言处理模型 自然语言处理 transformer_github自然语言处理模型_20

github自然语言处理模型 自然语言处理 transformer_机器学习_21

除了self-attention机制之外,BERT还加入了Decoder-Encoder-attention机制,充分利用数据的特征,通过Q来从解码器中查一查编码器中的K、V对应的是啥。

加入了MASK机制(别透题)

比如使用机器翻译,当前词无法使用后面词的信息,但是又不得不考虑,因此我们引入MASK机制,前面有的我们就能用,后面没有的我们就是当做黑盒子。

github自然语言处理模型 自然语言处理 transformer_机器学习_22

最终输出结果

就是得到一个分类,经过Softmax层即可

github自然语言处理模型 自然语言处理 transformer_自然语言处理_23

效果展示

github自然语言处理模型 自然语言处理 transformer_词向量_24

经过训练,计算机可以知道it指代的是什么。天呐,计算机要成神了!!!