在2018年,谷歌推出了BERT模型之后,该模型在11项NLP任务中夺得STOA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最早是用于机器翻译任务,当时达到了STOA效果。
Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。在本文中,我们将研究Transformer模型,把它掰开揉碎,理解它的工作原理。
近期发现,在图像识别领域,Transformer表现出来的效果出乎意料的好,竟然有取代CNN的势头!
模型对比
使用词向量模型,是预先对词语训练好词向量,然后这个向量就不变了,然后去寻找文本中的词,将其转换为词向量,再输入到RNN中网络模型中。
但是呢,相同的词在不同的语境中,表达的意思可能不同,例如:干哈捏。
使用BERT模型,可以考虑到上下文的影响,在不同的输入当中,对应词向量也就不同了哦。太牛了吧!
如图:两句话中的it就是不同的,指代的意思也不同!
提取特征的时候,什么是重点,就是去发现你的数据的重点在哪。如下图,我们前面输入了一个序列,当我不强调哪个词重要,我得到的结果可能是平行的。
但是呢,这个判断过程不是你认为加进去的,是交给计算机,让他去判断的哦!!!
在一句话中,每一个词(中文是字),都会结合上下文判断句子中其余词和自己关系的远近,如图,it中animal就关系影响很大:
整体流程如下
①首先将x1、x2两个词进行编码得到向量
②经过计算得到每个词的三个特征矩阵Q、K、V
Q:第一个词做了啥贡献、第二个词做了啥贡献,就要去查一查和第一个词关系咋样,和第二个词关系咋样。
K:被查的,q1和k1就是第一个词的与第一个词的关系,q1和k2就是第一个词和第二个词的关系。
V:每个关系都查到了,关系大的多点输入,关系少的少点输入,v1就代表x1的特征表达,v2就代表x2的特征表达,表示实际的特征信息
③回顾
计算q1·k1是使用内积计算的,当线性无关的时候就会垂直,即内积为0,当相关性越大,关系就越大哦!
④最终的value计算
softmax计算流程
分值->e^x->归一化
计算每一个词语对该词语的影响权重,计算公式:
然后再计算对应词的value与计算到的权重的乘积之和,就能得到第一个词的影响力。如下图所示:
⑤整体回顾
再次声明:咱们的计算是并行加速计算的,即使用矩阵乘法(不是使用for循环,多low哦)!直接就出来了,是不是很牛批,呜呜呜我爱线代❤️
一个词已经得到了一个q、k、v,参考卷积神经网络的卷积和与特征图,我们一组qkv得到了一种特征表达,如果能有多种qkv,我们就能得到多种当前特征的表达。
多头不是越多越好,一般而言是8个。
堆叠在一起,得到最后的注意力!嘿嘿,机智哦宝贝!!!
这是两个头,图中可以看到,和自己的注意力是挺大的,离得越远可能就注意力会小一下
堆叠多层:经过多头机制,一个不太好看的向量转化为了差不多的向量,我们重复多次提取,得到最后好看的向量!
在self-attention中每个词都会考虑整个序列的加权,所以其出现位置并不会对结果产生什么影响,相当于放哪都无所谓,但是这跟实际就有些不符合了,例如:我今天下午想去打球,肯定下午和打球是重点呀,于是我们希望模型能对位置有额外的认识。
这个人家已经写好了,不用管太多,BERT是使用正弦周期变化来进行位置编码。
下图所示,self-attention之后呢,有一个LayerNorm归一化,但是,什么叫对层进行归一化??
LayerNorm就是没有Batch概念了,对他的一组数据,使得均值为0,平方差为1。
虚线部分是连接,用的是基本的残差连接方式,得到两个数据,模型自己去选择,至少不比原来差
除了self-attention机制之外,BERT还加入了Decoder-Encoder-attention机制,充分利用数据的特征,通过Q来从解码器中查一查编码器中的K、V对应的是啥。
比如使用机器翻译,当前词无法使用后面词的信息,但是又不得不考虑,因此我们引入MASK机制,前面有的我们就能用,后面没有的我们就是当做黑盒子。
就是得到一个分类,经过Softmax层即可
经过训练,计算机可以知道it指代的是什么。天呐,计算机要成神了!!!