本文是对Transformer模型的梳理文章,主要学习资料为知乎的一篇文章 和一篇博客。初学transformer,有讲的不对的地方,可以评论区评论告诉我,我会及时改正的。
文章目录
1 Transformer整体结构
Transformer的整体结构如下图所示:
上图展示的是用于机器翻译的Transformer,Transformer的整体结构分为两部分,分别是Encoder部分和Decoder部分,图中的Encoder和Decoder都包含6个block。Transformer模型的运行流程如下所示:
第一步: 输入部分,获取输入句子的每个单词的表示向量x,表示向量x由单词的Embedding(Embedding就是从原始数据提取出来的特征)和单词位置的Embedding相加得到
第二步: 将得到的单词表示向量矩阵 (如上图所示,每一行是一个单词的表示 x) 传入 Encoder 中,经过 6 个 Encoder block 后可以得到句子所有单词的编码信息矩阵 C,如下图。单词向量矩阵用 X n × d X_{n \times d} Xn×d 表示, n 是句子中单词个数,d 是表示向量的维度 (论文中 d=512)。每一个 Encoder block 输出的矩阵维度与输入完全一致
第三步: 将 Encoder 输出的编码信息矩阵 C传递到 Decoder 中,Decoder 依次会根据当前翻译过的单词 1~ i 翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译到单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 i+1 之后的单词。
上面Decoder接收了Encoder的编码矩阵C,然后结合“<Begin>"预测出I,然后又结合“<Begin>"和"I"预测出have。以此类推。
2 Transformer的输入
Transformer 中单词的输入表示 x由单词 Embedding 和位置 Embedding (Positional Encoding)相加得到。
单词Embedding
有很多种,例如word2vec、Glove等预训练算法。
位置Embedding
因为Transformer不采用RNN结构,只能使用全局信息,不能利用单词的输入顺序,而这部分信息对于NLP来说是十分重要的,所以利用位置Embedding来保存单词的相对位置和绝对位置信息。
位置 Embedding 用 PE表示,PE 的维度与单词 Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:
其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。使用这种公式计算 PE 有以下的好处:
- 使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。
- 可以让模型容易地计算出相对位置,对于固定长度的间距k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。 将单词的词 Embedding和位置 Embedding 相加,就可以得到单词的表示向量 x,x 就是 Transformer 的输入。
3 Self-Attentin(自注意力机制)
上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder block 包含一个 Multi-Head Attention,而 Decoder block 包含两个 Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。
Self-Attention结构
上图是Self-Attention的结构,在计算的时候需要用到矩阵Q(查询),K(键值),V(值)。在实际中,Self-Attention 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V正是通过 Self-Attention 的输入进行线性变换得到的,另外需要注意的是Q,K,V的维度需要小于输入向量(即单词的表示向量X)的维度。
Q、K、V的计算
Self-Attention 的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V。计算如下图所示,注意 X, Q, K, V 的每一行都表示一个单词。
Self-Attention的输出
得到矩阵 Q, K, V之后就可以计算出 Self-Attention 的输出了,计算的公式如下:
公式中计算矩阵Q和K每一行向量的内积,为了防止内积过大,因此除以 d k d_k dk