知乎:Transformer模型详解(图解最完整版)
知乎:详解Transformer (Attention Is All You Need)
知乎:[整理] 聊聊 Transformer
知乎:Vision Transformer 超详细解读 (原理分析+代码解读) (一)
CSDN:史上最小白之Transformer详解
Attention? Attention!
代码:https://github.com/pengshuang/Transformer
代码:https://github.com/Kyubyong/transformer
论文:Attention Is All You Need
书籍:《Transformer自然语言处理Natural Language Processing with Transformers》
CNN 的缺点: 要获得大的感受野需要堆叠很多层卷积
Transformer的优点: 不需要堆叠即可以获得全局信息
Transformer相比于RNN/LSTM,有什么优势?为什么?
Transformer是一个基于Encoder-Decoder框架的模型。其中:
一个encoder由Multi-Head Attention 和 全连接神经网络Feed Forward Network构成;两个部分,都有一个残差连接(residual connection),然后接着一个 Layer Normalization。
一个decoder由Masked Multi-Head Attention,Multi-Head Attention 和 FFN 构成。比Encoder多了一个Masked Multi-Head Attention;和 encoder 一样,上面三个部分的每一个部分,都有一个残差连接,后接一个 Layer Normalization。
输入inputs embedding后需要给每个word的词向量添加位置编码positional encoding
输入 x 和其添加的位置编码 t 示例:
Encoder的结构如图:
由self-attention和 Feed Forward neural network组成
Decoder的结构如图:
它和encoder的不同之处在于Decoder多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值:
Normalization 有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为 0 方差为 1 的数据。我们在把数据送入激活函数之前进行 normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。
Batch Normalization强行让一个batch的数据的某个channel的 μ = 0 , σ = 1 \mu =0,\sigma =1 μ=0,σ=1
而Layer Normalization让一个数据的所有channel的 μ = 0 , σ = 1 \mu =0,\sigma =1 μ=0,σ=1 。
BN 的主要思想就是:在每一层的每一批数据上进行归一化。我们可能会对输入数据进行归一化,但是经过该网络层的作用后,我们的数据已经不再是归一化的了。随着这种情况的发展,数据的偏差越来越大,我的反向传播需要考虑到这些大的偏差,这就迫使我们只能使用较小的学习率来防止梯度消失或者梯度爆炸。
BN 的具体做法就是对每一小批数据,在批这个方向上做归一化。
LN 是在每一个样本上计算均值和方差,而不是 BN 那种在批方向计算均值和方差!
注意力背后的主要想法是,编码器不是为输入序列产生一个单一的隐藏状态,而是在每一步输出一个隐藏状态,供解码器访问。这就是注意力的作用:它让解码器在每个解码时间段为每个编码器状态分配不同的权重,或称 “注意力”。下图说明了这个过程,其中注意力的作用是预测输出序列中的第三个符号。
通过关注在每个时间点上哪些输入标记是最相关的,这些基于注意力的模型能够学习生成的翻译中的词和源句中的词之间的非线性排列。例如,下图直观地显示了英译法模型的注意力权重,其中每个像素表示一个权重。图中显示了解码器是如何正确对齐 "zone "和 "Area "这两个词的,这两个词在两种语言中的排序不同。
The “self” part of self-attention refers to the fact that these weights are computed for all hidden
states in the same set—for example, all the hidden states of the encoder. By contrast, the attention mechanism associated with recurrent models involves computing the relevance of each encoder hidden state to the decoder hidden state at a given decoding timestep.
The main idea behind self-attention is that instead of using a fixed embedding for each token, we can use the whole sequence to compute a weighted average of each embedding. Another way to formulate this is to say that given a sequence of token embeddings x1, …, xn, self-attention produces a sequence of new embeddings x′1, …, x′n where each x′i is a linear combination of all the xj:
——《Transformer自然语言处理Natural Language Processing with Transformers 》
self attention 的“self”部分指的是这些权重是针对同一集合中的所有隐藏状态计算的——例如,编码器的所有隐藏状态。相比之下,与递归模型相关的注意机制涉及在给定的解码时间步计算每个编码器隐藏状态与解码器隐藏状态的相关性。上式中 系数 w j i w_{ji} wji 称为注意力权重
在使用self-attention去处理一张图片的时候,1的那个pixel产生query,其他的各个pixel产生key。在做inner-product的时候,考虑的不是一个小的范围,而是一整张图片。
但是在做CNN的时候是只考虑感受野红框里面的资讯,而不是图片的全局信息。
即:CNN考虑感受野范围,而self-attention考虑的不是一个小的范围,而是一整张图片
但是self-attention由attention找到相关的pixel,就好像是感受野的范围和大小是自动被学出来的,所以CNN可以看做是self-attention的特例
但,既然self-attention是更广义的CNN,则这个模型更加flexible,训练它所需要的数据量就越多,所以在训练self-attention模型时就需要更多的数据,这一点在论文 ViT 中有印证,它需要的数据集是有3亿张图片的JFT-300,而如果不使用这么多数据而只使用ImageNet,则性能不如CNN。
三个需要训练的矩阵
Q: query,要去查询的
K: key,等着被查的
V: value,实际的特征信息
在self-attention中,每个单词有3个不同的向量,它们分别是Query向量( Q Q Q ),Key向量( K K K )和Value向量( V V V),长度均是64。它们是通过3个不同的权值矩阵由嵌入向量 X X X 乘以三个不同的权值矩阵 W Q W^Q WQ , W K W^K WK , W V W^V WV 得到,其中三个矩阵的尺寸也均是 512 x 64 。
假如输入序列是"Thinking Machines",x1,x2就是对应地"Thinking"和"Machines"添加过位置编码之后的词向量,然后词向量通过三个权值矩阵 W Q W^Q WQ , W K W^K WK , W V W^V WV ,转变成为计算Attention值所需的Query,Keys,Values向量。
不管是哪种 attention,我们在计算 attention 权重的时候,可以选择很多方式,常用的方法有
Transformer模型采用的是最后一种:scaled dot-product attention。
通过 query 和 key 的相似性程度来确定 value 的权重分布,计算公式如下:
Self-Attention的向量计算:
其中 d k d_{k} dk 表示 Key 的维度,默认用 64。
Multi-Head Attention相当于 h 个不同的self-attention的集成(ensemble),在这里我们以 h=8 举例说明。Multi-Head Attention的输出分成3步:
不同的注意力结果
得到的特征向量表达也不相同
一组q,k,v得到了一组当前词的特征表达
类似卷积神经网络中的filter
原论文中说到进行Multi-head Attention的原因是将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。其实直观上也可以想到,如果自己设计这样的一个模型,必然也不会只做一次attention,多次attention综合的结果至少能够起到增强模型的作用,也可以类比CNN中同时使用多个卷积核的作用,直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。
在self-attention中每个词都会考虑整个序列的加权,所以其出现位置并不会对结果产生什么影响,相当于放哪都无所谓,(类似功能更强大的词袋模型),但是这跟实际就有些不符合了,我们希望模型能对位置有额外的认识。
为了解决这个问题,论文在编码词向量时引入了位置编码 PE(Position Embedding)。具体地说,位置编码会在词向量中加入了单词的位置信息,这样Transformer就能区分不同位置的单词了。
如果缺失了位置信息,可能的结果就是:所有词语都对了,但是无法组成有意义的语句。
在实现的时候使用正余弦函数。公式如下:
其中,pos 是指词语在序列中的位置。可以看出,在偶数位置,使用正弦编码,在奇数位置,使用余弦编码。
本篇是 Transformer 基础原理知识点, 对小白友好
Transformer最初提出是针对NLP领域的
对于计算机视觉方向,Vision Transformer (ViT) 将 CV 和 NLP 领域知识结合起来
可以参考下篇文章 :Vision Transformer