Transformer总结

目录

1 Transformer的主要框架

1.1 输入编码

1.2 位置编码

1.3 Self-Attention

1.4 Multi-Head Attention

1.4 Encoder-Decoder Attention

2 常见问题


Transformer整个网络结构由且仅由self-Attenion和Feed Forward Neural Network组成(Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence aligned RNNs or convolution)

注意力机制(Attention)广泛应用在深度学习中的各个领域,例如在计算机视觉方向用于捕捉图像上的感受野,或者NLP中用于定位关键token或者特征。作者采用Attention机制的原因是由于RNN相关算法(LSTM、GRU等)只能从左向右依次计算或者从右向左依次计算,这种顺序计算的机制带来了两个问题:

  1. 时间片 t 的计算依赖 t-1 时刻的计算结果,限制了模型的并行能力;
  2. 顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。

Transformer的提出解决了上面两个问题:

  1. 不是类似RNN的顺序结构,具有更好的并行性,符合现有的GPU框架;
  2. 使用Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量,可以有效解决NLP中的长程依赖问题。

1 Transformer的主要框架

Transformer本质上是一个Encoder-Decoder的结构,一个基于Transformer的可训练的神经网络可以通过堆叠Transformer block的形式进行搭建,下图是编码器和解码器各6层block,总共12层的Encoder-Decoder。

Transformer总结_第1张图片                 Transformer总结_第2张图片

Transformer的Encoder由self-attention和Feed Forward neural network组成:

Transformer总结_第3张图片

在Encoder中,数据首先会经过self-attention的模块得到一个加权之后的特征向量Transformer总结_第4张图片

 简称为 Z,它会被送到encoder的下一个模块Feed Forward Neural Network。这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:

 Decoder的结构和Encoder的不同之处在于Decoder多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值:

  1. Self-Attention:当前翻译和已经翻译的前文之间的关系;
  2. Encoder-Decnoder Attention:当前翻译和编码的特征向量之间的关系。

1.1 输入编码

将输入单词通过Word2Vec等词嵌入方法将输入语料转化成特征向量X( 论文中使用的词嵌入的维度) 

在最底层的block中,X将直接作为Transformer的输入,而在其他层中,输入是上一个block的输出:

Transformer总结_第5张图片

1.2 位置编码

如果不加入单词间的位置信息,那么无论句子的结构怎么打乱,Transformer都会得到类似的结果,这样的话Transformer只是一个功能更强大的词袋模型而已。为了解决Transformer没有捕捉顺序序列的能力,在编码词向量时引入了位置编码(Position Embedding)的特征,在词向量中加入了单词的位置信息。

作者设计了一个位置编码规则,为了便于和词向量进行单位加的操作,位置编码是一个长度为的特征向量。

Transformer总结_第6张图片

 论文给出的编码公式如下:

Transformer总结_第7张图片

上式中,pos 表示单词的位置,i 表示单词的维度。

作者这么设计的原因是考虑到在NLP任务中,除了单词的绝对位置,单词的相对位置也非常重要。根据公式以及,这表明位置 K+P 的位置向量可以表示为位置K的特征向量的线性变化,这为模型捕捉单词之间的相对位置关系提供了非常大的便利。

1.3 Self-Attention

Self-Attention是Transformer最核心的内容,在self-attention中,每个单词有3个不同的向量,它们分别是Query向量(Q),Key向量(K)和Value向量(V)。它们是通过3个不同的权值矩阵由嵌入向量 X 乘以三个不同的权值矩阵得到(三个矩阵的尺寸相同)。

Query,Key,Value的概念来自于信息检索系统,当在某电商平台搜索某件商品(蓝色薄款羽绒服)时,在搜索引擎上输入的内容是Query,搜索引擎根据Query为你匹配Key(商品的种类,颜色,描述等),然后根据Query和Key的相似度得到匹配的内容(Value)

self-attention中的Q,K,V也起着类似的作用,在矩阵计算中,点积是计算两个矩阵相似度的方法之一,因此使用进行相似度的计算。然后根据相似度进行输出的加权匹配(权值是query与key的相似度)。

Transformer总结_第8张图片                   Transformer总结_第9张图片

 Self-Attention整个过程可以分成7步:

  1. 将输入单词转化成embedding向量;
  2. 根据embedding向量得到 q,k,v 三个向量
  3. 为每个向量计算一个score:score=q*k;
  4. 为了梯度的稳定,Transformer使用了score归一化,即除以
  5. 对score施以softmax激活函数;
  6. softmax点乘Value值v,得到加权的每个输入向量的评分v;
  7. 相加之后得到最终的输出结果z:

Transformer总结_第10张图片            Transformer总结_第11张图片

为了解决深度学习中的梯度消失问题,在self-attention中采用了残差网络中的short-cut连接结构:

Transformer总结_第12张图片

1.4 Multi-Head Attention

Multi-Head Attention相当于h个不同self-attention的集成(ensemble),假设h=8,Multi-Head Attention的输出分成3步:

  1. 将数据X分别输入到8个self-attention中,得到8个加权后的特征矩阵
  2. 将8个按列拼成一个大的特征矩阵;
  3. 特征矩阵经过一层全连接后得到输出Z

Multi-Head Attention整个过程如图所示:

Transformer总结_第13张图片

同self-attention一样,multi-head attention也加入了short-cut机制。

1.4 Encoder-Decoder Attention

在解码器中,Transformer block比编码器中多了个encoder-cecoder attention。在encoder-decoder attention中,Q来自于解码器的上一个输出,K和V则来自于与编码器的输出。其计算方式完全和图10的过程相同。

由于在机器翻译中,解码过程是一个顺序操作的过程,也就是当解码第K个特征向量时,我们只能看到第K-1及其之前的解码结果,论文中把这种情况下的multi-head attention叫做masked multi-head attention。

解码器解码之后,解码的特征向量经过一层激活函数为softmax的全连接层之后得到反映每个单词概率的输出向量。此时我们便可以通过CTC等损失函数训练模型了。

2 常见问题

缺点

  1. 没有使用RNN和CNN,模型丧失了捕捉局部特征的能力,RNN + CNN + Transformer的结合可能会带来更好的效果
  2. Transformer失去的位置信息其实在NLP中非常重要,而论文中在特征向量中加入Position Embedding也只是一个权宜之计,并没有改变Transformer结构上的固有缺陷

Attention核心内容是为输入向量的每个embedding学习一个权重

  1. Transformer为何使用多头注意力机制?(为什么不使用一个头)
  2. Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘? (注意和第一个问题的区别)
  3. Transformer计算attention的时候为何选择点乘而不是加法?两者计算复杂度和效果上有什么区别?
  4. 为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根),并使用公式推导进行讲解
  5. 在计算attention score的时候如何对padding做mask操作?
  6. 为什么在进行多头注意力的时候需要对每个head进行降维?(可以参考上面一个问题)
  7. 大概讲一下Transformer的Encoder模块?
  8. 为何在获取输入词向量之后需要对矩阵乘以embedding size的开方?意义是什么?
  9. 简单介绍一下Transformer的位置编码?有什么意义和优缺点?
  10. 你还了解哪些关于位置编码的技术,各自的优缺点是什么?
  11. 简单讲一下Transformer中的残差结构以及意义。
  12. 为什么transformer块使用LayerNorm而不是BatchNorm?LayerNorm 在Transformer的位置是哪里?
  13. 简答讲一下BatchNorm技术,以及它的优缺点。
  14. 简单描述一下Transformer中的前馈神经网络?使用了什么激活函数?相关优缺点?
  15. Encoder端和Decoder端是如何进行交互的?(在这里可以问一下关于seq2seq的attention知识)
  16. Decoder阶段的多头自注意力和encoder的多头自注意力有什么区别?(为什么需要decoder自注意力需要进行 sequence mask)
  17. Transformer的并行化提现在哪个地方?Decoder端可以做并行化吗?
  18. 简单描述一下wordpiece model 和 byte pair encoding,有实际应用过吗?
  19. Transformer训练的时候学习率是如何设定的?Dropout是如何设定的,位置在哪里?Dropout 在测试的需要有什么需要注意的吗?
  20. 引申一个关于bert问题,bert的mask为何不学习transformer在attention处进行屏蔽score的技巧?

你可能感兴趣的:(推荐系统)