简介
Transformer是谷歌提出的只基于Attention的网络模型,它也是一种Encoder-Decoder的网络结构,但是没有使用任何CNN或者RNN的结构,而是全靠Attention,so Attention is All You Need.这样做有什么好处呢?传统的RNN系模型(LSTM,GRU等)都是序列模型,每一步都需要上一步的结果,所以无法并行化.而CNN系虽然可以并行,但是只能捕捉到局部信息,无法考虑到上下文关系的语义信息.所以google提出了一种新的架构,只用Attention.它不仅可以实现并行化,还可以一步得到全局信息.
Attention
Attention的相关知识可以参考我另一篇文章:Attention注意力机制介绍
Google在Transformer中使用的是乘法Attention结构图如下
然后经过堆叠形成Multi-Head Attention.什么是Multi-Head Attention?这个是Google提出的新概念,如图所示,就是把Q,K,V通过参数矩阵映射一下,然后再做Attention,把这个过程重复h次,结果拼接起来.
更准确来说,Google所用的是Self Multi-Head Attention,也就是说Multi-Head中每个Attention都是self-attention.
下面是Transformer的模型结构图:
Position Embedding
模型的第一部分是Position Embedding,使用Attention的弊端就是会丢失文本序列的语序信息,对于NLP中的任务来说,顺序是很重要的信息,它代表着局部甚至是全局的结构,所以为了弥补这一缺陷,google在文本编码部分使用了位置编码,将文本的语序信息融入到文本向量中.
Encoder
接下来就是Encoder部分,输入是经过Position Embedding后的文本表示,encoder由N层相同的层组成,每一层分别由两部分组成:第一部分是 multi-head self-attention,第二部分是position-wise feed-forward network,是一个全连接层,包含两个线性变换和一个非线性函数(实际上就是ReLU),如图5:
Decoder
和 encoder 类似,decoder 也是由N个相同的层组成,每一个层包括以下3个部分:第一个部分是 multi-head self-attention mechanism,第二部分是 multi-head context-attention mechanism,第三部分是一个 position-wise feed-forward network.
同时,在Encoder和Decoder的每个部分后面都会连接一个Layer normalization.
Layer normalization
Normalization有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为0方差为1的数据.我们在把数据送入激活函数之前进行normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区.我们可能会对输入数据进行归一化,但是经过该网络层的作用后,我们的数据已经不再是归一化的了.随着这种情况的发展,数据的偏差越来越大,我的反向传播需要考虑到这些大的偏差,这就迫使我们只能使用较小的学习率来防止梯度消失或者梯度爆炸.
Batch normalization和Layer normalization的区别是,BN是对一批数据进行归一化,而LN是对每一个样本进行归一化.
最后将上述模块组合到一起就是Transformer.
本文是作者的学习笔记,所以有些知识写的不是很详细,可以参考其他大佬文章:
苏神:https://kexue.fm/archives/4765
简枫:https://zhuanlan.zhihu.com/p/47812375