Transformer
cyq总结,就是博主啦
attention without RNN
Original paper Attention is All You Need. In NIPS, 2017
- Transformer 是一个 Sep2Sep模型
- Transformer不是RNN
- Transformer的效果完胜RNN,业界已经基本不用RNN了
文章目录
- Transformer
- Review of Attention on RNN
- Attention without RNN
- Attention Layer
- Key, Vlue, Query
- Compute weights
- Compute context vector
- Output
- Example
- Self-Attention without RNN
- From Shallow to Deep
- Multi-head Attention
- Stacked Self-Attention Layers
- Transformer's Encoder
- Transformer's Decoder
- Transformer
- BERT(Bidirectional Encoder Representations from Transformers)
- Predict masked words
- Predict next sentence
- Combining the two methods
- Input
- Training
Review of Attention on RNN
权重weight计算方法如上图所示,有m个encoder的状态hi,对应的就有m个ki,将这些ki组成矩阵K,K中每一列是一个原来的ki
-
Query q:j = Wqsj (To match others)
-
Key k:i = Wkhi (To be matched)
-
Value v:i = Wvhi (To be weighted averaged)
给出一种新的计算context vector cj的方法如下:
这种方法和之前的Attention的区别在于,计算的是Value的加权平均,而非状态hi的加权平均
Attention without RNN
Attention Layer
Key, Vlue, Query
计算第一步如上图所示,Wk和Wv将m个输入xi分别映射到Key和Value向量,这样m个输入向量就对应m个Key和m个Value
用Wq将输出xj’映射到Query q:j,得到t个query向量
这里的Key, Value, Qurey和之前RNN中提到的概念已经有了本质的区别。
这里每一个Key, Value只与当前对应的输入单词有关,而和之前的输入无关。
每一个Qurey只与当前对应的输出单词有关,而和之前的输出,以及encoder中的内容无关
Compute weights
第二步计算权重a如上图所示。
计算权重的时候用到所有的Key和一个Qurey向量,计算出q:1与所有k:i的相关性列在向量a:1中,具体的计算方法为矩阵乘法
注意这里每一个向量都对应且只对应一个词
Compute context vector
第三步计算context vector如上图所示。
用到所有的Value向量和a:1向量,实际上就是计算所有value向量的加权平均。
可以看到,每计算一个c:j,就要用到所有的Value, 所有的Key,和一个Query向量
Output
重复上述过程直到计算出所有t个Query向量,所有Query向量组成的矩阵即为输出,如下图所示:
Example
将context vector c2输入 Softmax Classifier得到概率分布p2, 再根据p2得到下一个预测的单词x3’
Attention Layer可以抽象成如上图所示,输入为两个向量,输出为一个context vector的集合,其中用到的参数为三个矩阵
Self-Attention without RNN
self-attention的结构如上图所示,Attn函数和Attention的Attn函数完全相同,只是输入的两个参数都是X,这里的输出中的每一个ci都和所有的xi相关
self-attention的过程和attention的过程完全相同,每次计算context vector ci依赖于所有的Value, Key和一个Query(对每个xi计算相应的Value,Key,Query三个向量,计算方法同上)
From Shallow to Deep
Multi-head Attention
上面所学习的是单头的attention,Multi-head Attention是由l个单头attention组成,它们各自有各自的参数,不共享参数,Multi-head Self-Attention结构如下图所示,即把l个单头的结果堆叠:
Multi-head Attention结构如下图所示,也是单头之间不共享参数,将各自的结果堆叠得到最终结果
Stacked Self-Attention Layers
搭建全连接层,全连接层的Dense是完全相同的,如下所示:
搭建深度神经网络的结构如下图所示,类似与RNN中的过程:
Transformer’s Encoder
encoder的一层就是一个self-attention layer + dense layer,一个block的输入和输出的大小是一样的,可以用 ResNet中的skip connection将输入加到输出上
总的结构如下图所示,所有的block之间不共享参数
Transformer’s Decoder
一个block的第一层,是一个Multi-Head Self-Attention:
第二层如下,是一个Multi-Head Attention,输入是encoder的输出m个向量和decoder的第一层t个向量,输出为t个向量
最后搭一个全连接层如下:
上面所描述的是一个block,结构如下图所示:
Transformer
总的网络就是上面模块的堆叠,如下图所示
BERT(Bidirectional Encoder Representations from Transformers)
BERT用来预训练Transformer模型的encoder
- Predict masked word
- Predict next sentence
Predict masked words
如图所示,用mask表示遮住一个词,经过embedding后得到向量xm,再经过transformer得到um,这里um知道的是上下文的信息,可以用来预测。再经过classifier得到概率分布p以预测被遮住的单词,我们希望p接近cat的one-hot向量
- e:one-hot vector of the masked word “cat”
- p:output probability distribution at masked position
- Loss = CrossEntropy(e, p)
mask自动生成,不用人工标记,足够训练大型网络
Predict next sentence
网络结构如上图所示,c对应于[CLS],但是c包含的是两句话的所有信息,所以可以用c来做分类任务。注意这里的数据是带标签的,标签true表示两句话相邻,false表示两句话不相邻
[CLS] is token for classification
[SEP] is for separating sentences
相邻两句话通常有关联,这样训练可以强化这种关联,可以训练self-attention找到正确的相关性
Combining the two methods
Input
如图所示,input是上面两种任务输入的综合
Training
损失函数是predict masked words的损失函数和predict next sentence的损失函数的和
优点: 不用人工标注数据,自动生成标签,参数是公开的
缺点: 代价大