Transformer
Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer。Transformer 模型使用了 Self-Attention 机制,不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。
Transformer整体结构

Transformer 由 Encoder 和 Decoder 两个部分组成,Encoder 和 Decoder 都包含 6 个 block。Transformer 的工作流程大体如下:
第一步: 获取输入句子的每一个单词的表示向量 X,X由单词的 Embedding 和单词位置的 Embedding 相加得到。

第二步: 将得到的单词表示向量矩阵 (如上图所示矩阵)作为输入矩阵传入Encorder中,在经过了6个编码器后输出transformer对所有句子的编码信息矩阵C,其大小和输入矩阵相同。
第三步:将 Encoder 输出的编码信息矩阵 C传递到Decoder 中,Decoder 依次会根据当前翻译过的i个单词,翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译单词的时候需要通过 Mask (掩盖) 操作遮盖住该单词之后的所有单词。

上图 Decoder 接收了 Encoder 的编码矩阵 C,然后首先输入一个翻译开始符 “
Transformer详解
Transformer 的输入
Transformer 中单词的输入表示 x由单词 Embedding 和位置 Embedding (Positional Encoding)相加得到。
单词 Embedding
单词的 Embedding 就是将词语向量化,向量化的方式有很多种,可以采用 Word2Vec、Glove、FastText 等得到,也可以在 Transformer 中训练得到。
位置 Embedding
Transformer 中除了单词的 Embedding,还需要使用位置 Embedding 表示单词出现在句子中的位置。因为 Transformer 中需要使用位置 Embedding 保存单词在序列中的相对或绝对位置。
位置编码公式:
PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}}) 其中,pos 表示单词在句子中的位置,d 表示 PE的维度(就是词 Embedding的维度),也就是偶数位置采用sin,奇数位置采用cos。  将单词的词 Embedding 和位置 Embedding 相加,就可以得到单词的表示向量 **x**,**x** 就是 Transformer 的输入。  ### Encoder结构  上图是 Transformer 的 Encoder 部分结构,可以看到是由 **Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm** 组成的。 #### Self-Attention(自注意力机制) <img src="https://pic4.zhimg.com/80/v2-f6380627207ff4d1e72addfafeaff0bb_720w.webp" alt="img" style="zoom:67%;" /> 上图是论文中 Transformer 的内部结构图,左侧为 Encoder,右侧为 Decoder。红色圈中的部分为 **Multi-Head Attention**,是由多个 **Self-Attention**组成的,可以看到 Encoder包含一个 Multi-Head Attention,Decoder包含两个 Multi-Head Attention (其中有一个用到 Masked)。 **Self-Attention**是 Transformer 的重点,首先详细了解一下 Self-Attention 的内部逻辑。 **Self-Attention 结构** 公式如下: Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V 其中$\ d_k$是设置的常数,其目的是为了使得结果在softmax中变化更明显;Q,K,V三个矩阵通过输入矩阵和随机初始化的权重矩阵WQ,WK,WV进行相乘得到。 <img src="https://pic3.zhimg.com/80/v2-4f4958704952dcf2c4b652a1cd38f32e_720w.webp" alt="img" style="zoom:50%;" /> 经过softmax后最终得到Attention矩阵Z <img src="https://pic4.zhimg.com/80/v2-7ac99bce83713d568d04e6ecfb31463b_720w.webp" alt="img" style="zoom:67%;" /> 由于在经过 Softmax 后矩阵的第 1 行中各个数值表示单词 1 与其他所有单词的attention系数,其实矩阵 Z 第 j 行的输出 Z[j] 就是所有单词 i 的值 $\ V_i$ 根据 attention 系数的比例加在一起得到,如下图所示: <img src="https://pic3.zhimg.com/80/v2-27822b2292cd6c38357803093bea5d0e_720w.webp" alt="img" style="zoom: 80%;" /> **Multi-Head Attention** Multi-Head Attention 是由多个 **Self-Attention** 组合形成的 将输入**X**分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵**Z**。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵**Z**。 <img src="https://pic1.zhimg.com/80/v2-6bdaf739fd6b827b2087b4e151c560f4_720w.webp" alt="img" style="zoom:67%;" /> 得到 8 个输出矩阵 **Z**1 到 **Z**8 之后,Multi-Head Attention 将它们拼接在一起 (**Concat**),然后传入一个 **Linear**层,得到 Multi-Head Attention 最终的输出 **Z**。  使得最后输出的矩阵维度和输入矩阵维度相同 #### **Add & Norm** Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下: 在**Multi-Head Attention**之后的**Add&Norm**: LayerNorm(X+MultiHeadAttention(x)) 其中 **X**表示**输入矩阵** ,MultiHeadAttention(**X**) 表示在经过**Multi-Head Attention**之后的输出矩阵**Z** 在**Feed Forward**之后的**Add&Norm**: LayerNorm(X+FeedForward(x)) 其中 **X**表示经过**Multi-Head Attention**之后的输出Z,MultiHeadAttention(**X**) 表示在经过**Feed Forward**之后的输出 **Add**指 X+F(x)结构,结构图示如下:  **Norm**指 Layer Norm(x),LayerNorm把一个样本的所有词义向量(如下图红色部分)视为一个分布(有几个句子就有几个分布),并将其标准化。这意味着: * 同一句子中词义向量(下图中的V1, V2, …, VL)的相对大小是保留的,或者也可以说LayerNorm不改变词义向量的方向,只改变它的模。  #### **Feed Forward** Feed Forward 层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下。 encoder=max(0,XW_1+b_1)W_2+b_2 encoder为经过一层Encoder后的输出 ### **组成 Encoder** 通过上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一层 Encoder ,接收输入矩阵 **X**(n×d),并输出一个矩阵 **O**(n×d)。通过多层 Encoder 叠加就可以组成最终的**编码器**。 第一层的 Encoder的输入为句子单词的表示向量矩阵,后续每层 Encoder 的输入是前一层输出,最后一层 Encoder 输出的矩阵就是 **编码信息矩阵 C**,这一矩阵后续会用到 Decoder 中。 <img src="https://pic3.zhimg.com/80/v2-45db05405cb96248aff98ee07a565baa_720w.webp" alt="img" style="zoom:50%;" /> ### **Decoder 结构** <img src="https://pic3.zhimg.com/80/v2-f5049e8711c3abe8f8938ced9e7fc3da_720w.webp" alt="img" style="zoom:50%;" /> 上图红色部分为 Transformer 的一层 Decoder 结构,与 Encoder 相似,但是存在一些区别: - 包含两个 Multi-Head Attention 层。 - 第二个 Multi-Head Attention 层的**K, V**矩阵使用 Encoder 的**编码信息矩阵C**进行计算(就是将矩阵C与权重矩阵WK,WV相乘),而**Q**使用上一个 Decoder block 的输出计算。 > 预测时:第i个decoder的输入 = encoder输出 + 第(i-1)个decoder输出 > 训练时因为知道ground truth embeding,相当于知道正确答案,网络可以一次训练完成。 > > > - Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。 - Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。 ## 参考文献 > [《Transformer 模型详解》](https://baijiahao.baidu.com/s?id=1651219987457222196&wfr=spider&for=pc)