文章目录
- 12. Transformer
- 12.1 Introduction
- 12.2 在 Seq2Seq 架构中计算 Attention
- 12.3 Attention without RNN
- 12.4 Attention 与 Self-Attention 之 Summary
- 12.5 搭建 Multi-Head
- 12.6 Stacked Self-Attention Layers
- 12.7 第一个里程碑:Transformer’s Encoder
- 12.8 Stacked Attention Layers
- 12.9 第二个里程碑 — 终点:Transformer
- 12.10 Seq2Seq vs. Transformer
- 12.11 Summary
- 12.12 再理解 Transformer
- 12.13 Transformer 的思考
12. Transformer
12.1 Introduction
12.2 在 Seq2Seq 架构中计算 Attention
在 Seq2Seq 章节中,我们并没有深入讨论如何求解 α i \alpha_i αi 的过程。本节中,我们将使用和 Transformer 中一样的计算方式在 Seq2Seq 架构中计算权重向量 α i \alpha_i αi。
12.2.1 计算 Key k : i k_{:i} k:i 和 Query q : j q_{:j} q:j
h 有 m 个,s 有 j 个。每个 h 都与 W k W_k Wk 相乘,得到一个 k,共计有 m 个 k,拼接在一起组成大 K。同理,将当前的 s j s_j sj 与 W Q W_Q WQ 相乘,得到一个 q。注意,这里就一个 q,不是所有 s 都要与 W Q W_Q WQ 相乘。
12.2.2 计算 α : j \alpha_{:j} α:j
将 K 转置后与 q : j q_{:j} q:j 相乘,再经过 Softmax 得到 α : j \alpha_{:j} α:j。
12.2.3 计算 Value v : i v_{:i} v:i
正如前面所说,本章节中我们使用和 Transformer 一样的 Attention 计算方法。这里我们还需要计算 Value。上面的 k : i k_{:i} k:i 叫做 Key, q : j q_{:j} q:j 叫做 Query。
12.2.4 千呼万唤始出来:计算 c j c_j cj
如下图所以,每一个 h i h_i hi 与 W V W_V WV 相乘,得到 v : i v_{:i} v:i,共有 m 个。 α : j \alpha_{:j} α:j 一共也有 m 个。对应相乘,再累加,得到 c j c_j cj。千呼万唤始出来,终于求得了 c j c_j cj。 问:现在求得了 c j c_j cj,那么之后怎么求得 s j + 1 s_{j+1} sj+1 你知道么?不知道的赶紧去看 Seq2Seq + Attention 章节。快,跑步快去看。
12.3 Attention without RNN
上一节是在 RNN 网络中应用 Attention。我们之前说过:Attention 可以脱离 RNN 而存在,可以用在任何 NN 上。现在我们来搭建一个 脱离 RNN 的 Attention 网络。
Transformer 就是由 Attention 层 和 Self-Attention 层组成的。
你现在还记得 Self-Attention 是怎么计算的么?不记得,再跑回去看,跑快点。看完再回来。
既然是由 Attention 层和 Self-Attention 层组成的,现在我们先来搭建 Attention 层。
12.3.1 Attention 层
现在回忆 Seq2Seq 模型的基本元素。
12.3.1.1 计算 Encoder 中的两个变量:Key、Value
现在计算 Key, Value,Query。其中,Encoder 中有两个:Key、Value。
12.3.1.5 计算 Decoder 中的变量:Value
计算完Encoder中的两个变量:Key、Value。再来计算 Decoder 中的变量:Value。
12.3.1.3 计算 α i \alpha_i αi
12.3.1.4 计算 c i c_i ci
12.3.1.5 重复上面的四个步骤
同样,对于 x 2 ′ x_2^{\prime} x2′ 的计算过程如下:
第 j 个位置 c o n t e x t j context_j contextj 的计算过程如下:
12.3.1.6 Summary
在第 j 个位置, c o n t e x t j context_j contextj 的计算公式是: c : j = V ⋅ S o f t m a x ( K T q : j ) c_{:j} = V \cdot Softmax(K^Tq_{:j}) c:j=V⋅Softmax(KTq:j)。而 q : j q_{:j} q:j 与 x j ′ x_j^{\prime} xj′ 相关,矩阵 K K K 、矩阵 V V V 又和 [ x 1 , … , x m ] [x_1, \ldots, x_m] [x1,…,xm] 相关。所以, c : j c_{:j} c:j 是一个关于 x j ′ x_j^{\prime} xj′ 和 [ x 1 , … , x m ] [x_1, \ldots, x_m] [x1,…,xm] 的函数。
现在来终极总结 Attention 层:全在图中。
三个变量:Encoder 中有两个:Key: W K W_K WK; Query: W Q W_Q WQ,Decoder 中有一个: Value: W V W_V WV。
12.3.2 Self-Attention
搭建了 Attention 层,现在来搭建 Self-Attention 层。现在你还记得为什么要搭建 Self-Attention 层么?不记得?真的不记得了?要不,你再想想?
因为 Transformer 就是由 Attention 层 和 Self-Attention 层组成的。现在我们要来自己搭建一个 Transformer 。
这里,我们就不一步步从头开始搭建 Self-Attention 层了,不懂的同学多读几遍 前面章节的 Self-Attention 和 上一小节的 Attention 层。直接上图:
我又要来重复一下:Attention 层用于 Seq2Seq 架构,里面有 Encoder 和 Decoder。而 Self-Attention 不是用在 Seq2Seq 架构上的,只有一个序列。所以图中的 context 是自己和自己计算的,所以叫做 Self-Attention。
对比这幅图和上一张图,你发现区别在哪里了么?区别是:C 的计算公式不一样。Attention 层中是: C = A t t n ( X , X ′ ) C = Attn(X, X^{\prime}) C=Attn(X,X′),而在 Self-Attention 中是: C = A t t n ( X , X ) C = Attn(X, X) C=Attn(X,X)。
划重点,敲黑板了!在 Self-Attention 中, c i c_i ci 并非只依赖 x i x_i xi,而是依赖于所有 x x x。关键词:所有 x x x。
12.3.2.1 计算 Key, Value, Query
你不会在 Self-Attention 中计算 Attention?私信我,给我发红包,我给你单独补课。
那我手把手教你一遍。红包不要忘了喂。
首先,Key, Value, Query 公式般上来。
12.3.2.2 计算 α i \alpha_i αi
第二步:Key 与 Query 计算得到 α i \alpha_i αi。
12.3.2.3 计算 c i c_i ci
第三步: α : i \alpha_{:i} α:i 与 v : 1 , … , v : m v_{:1}, \ldots, v_{:m} v:1,…,v:m 计算得到 c : i c_{:i} c:i。注意,仔细看下图的公式,是第 i 个位置的 α \alpha α 与 所有 value,计算得到第 i 个位置的 context。
12.3.2.4 Summary
12.4 Attention 与 Self-Attention 之 Summary
前面两个章节,我们搭建了 Attention 和 Self-Attention,现在我们来总结一下上面的内容。学习就要勤于总结,在总结中思考,在总结中强化记忆。
12.5 搭建 Multi-Head
如图,Multi-Head 就是一个多头怪,是将多个 Single Attention 组合在一起。
12.5.1 Multi-Head Self-Attention
上一节中,我们搭建了 Self-Attention。这个就是 single-head self-attention。
我们将 L 个 single-head self-attention 组合在一起就变成了 Multi-Head Self-Attention。但是这 L 个single-head self-attention 不共享参数。
12.5.2 Multi-Head Attention
同样,Multi-Head Attention 就是将 L个Single-Head Attentions 组合在一起。同理,她们之间也不共享参数。
12.6 Stacked Self-Attention Layers
现在,我们来堆叠多层 Self-Attention。
基本架构是:一个 Self-Attention Layer 上面堆一个 Dense Layer。
注意:1. 全联接层是用的同一个参数矩阵 W U W_U WU。2. u : i u_{:i} u:i 依赖于所有 x x x。
我们还可以将上面的结构–Self-Attention Layer + Dense Layer 重复多层。
注意:一个 encoder block 不是等于 multi-head self-attention + dense layer,是约等于。为了方便理解,我们简化了模型。在真正的 Transformer 中,还需要添加 Add & Norm 层。在 Multi-Head Self-Attention Layer 上添加一层 Add & Norm,之后添加 Dense Layer,之后再添加 Add & Norm 层。
12.7 第一个里程碑:Transformer’s Encoder
首先,我们来定义 Block:Self-Attention Layer + Dense Layer。
我们来堆叠 6 层,中国人喜欢 6,天天说 666。发明 Transformer 的老外是不是来中国住了一段时间,被 666 洗脑了,于是就搭了6 层。
12.8 Stacked Attention Layers
首先,我们来回忆一下 Attention 层。
Transformer 是一个 Seq2Seq 架构的模型。前面我们也说了 Attention 是一个用于 Seq2Seq 架构的计算方法。既然是 Seq2Seq 架构就有 Encoder 和 Decoder 了。
上一小节中,我们搭建好了 Encoder 网络,由 6 个 blocks 组成。每个 block 由 Self-Attention + Dense Layer 组成。如图所示:
搭建好了 Encoder ,我们再来搭建 Decoder。同样,也是由 Multi-Head Self-Attention 组成。
现在,我们来搭建多层 Attention Layers。
第一层的 Encoder 输出 是 u : i u_{:i} u:i,有 m 个。Decoder 输出是: c : j c_{:j} c:j,有 t 个。我们用 一个 Multi-Head Attention Layer 将 u : i u_{:i} u:i 和 c : j c_{:j} c:j 两者桥接起来,输出是 z : k z_{:k} z:k,有 t 个。
最后搭一个全联接层。注意,这里和前面一样,全联接层共享 W S W_S WS。
我们将上面的结构称作一个 Decoder 网络的 Block。
注意,一个 decoder block 不是等于 multi-head self-attention + multi-head attention + dense layer,是约等于。为了方便理解,我们简化了模型。在真正的 Transformer 中,还需要添加 Add & Norm 层。
在这个 Block 中,Encoder 的输入是 512 * m 维,Decoder 的输入是 512 * t 维。如果是翻译中-英任务,m 就是中文句子的长度,t 就是英语句子的长度。
12.9 第二个里程碑 — 终点:Transformer
直接上图。
左边是 Encoder 的 Block。右边是 Decoder 的 Block。
划重点,敲黑板。Encoder 的输出 U U U 会当作为 Decoder 中每个 Block 的输入。Decoder 中每个Block 的另一个输入是前一个Block的输出。
12.10 Seq2Seq vs. Transformer
在 Seq2Seq 模型中,Encoder 的输入是 m 个向量,Decoder 的输入是 t 个向量。看上图,是不是和 Transformer 的Encoder 和 Decoder输入一样。所以,Seq2Seq 模型能做的事都可以用 Transformer 做,而且效果会更好。当前,代价是巨大的计算量。
12.11 Summary
12.11.1 From Single-Head to Multi-Head
12.11.2 Encoder Network of Transformer
注意:一个 encoder block 不是等于 multi-head self-attention + dense layer,是约等于。为了方便理解,我们简化了模型。在真正的 Transformer 中,还需要添加 Add & Norm 层。
12.11.3 Decoder Network of Transformer
注意,同样:一个 decoder block 不是等于 multi-head self-attention + multi-head attention + dense layer,是约等于。为了方便理解,我们简化了模型。在真正的 Transformer 中,还需要添加 Add & Norm 层。
12.11.4 Transformer Model
12.12 再理解 Transformer
12.12.1 Introduction
注意,在 Decoder 中,第一个 Multi-Head Attention 是 Masked Multi-Head Attention。因为 Decoder 网络,Attention 只能 Attention 之前的词汇,不能 Attention 之后的词汇。
12.12.2 Scaled Dot-Product Attention
https://paperswithcode.com/method/scaled
首先,Key 和 Query 通过 矩阵乘计算,然后进行 Scale。之后进行 Mask 操作,这是为了防止前面词看到后面词的一种方法,在 Decoder 中使用,但在 Encoder 中不使用。然后,进行 Softmax,得到的是 权重,是 Query 中每个样本在 Key 中所有样本上的分布。之后再与 Value 进行矩阵乘法。
12.12.2.1 为什么要除以根号 d k d_k dk?
答案是:防止内积总和过大。
如图所示,112 和 96 如果直接做 Softmax,由于 S o f t m a x ( x i ) = e x i ∑ c = 1 C e x c Softmax(x_i) = \frac{e^{x_i}}{\sum_{c=1}^{C}e^{x_c}} Softmax(xi)=∑c=1Cexcexi,虽然 112 比 96 大不了多少,但当使用 指数函数的时候,112 得到的值会远大于 96,那么,112 经过 Softmax 就会接近 1,而 96 经过 Softmax 就会接近 0,这样就会达不到 Attention 的效果。通过 除以根号 d k d_k dk 就能比较好的处理这种“过于分散”的情况,效果也好很多。
12.12.2.2 为什么是根号 d k d_k dk,而不是别的数?
Scaled dot-product attention is an attention mechanism where the dot products are scaled down by d k \sqrt{d_k} dk. Formally we have a query Q, a key K and a value V and calculate the attention as:
A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T d k ) V Attention(Q,K,V)=Softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=Softmax(dkQKT)V
If we assume that q and k are d k − d i m e n s i o n a l d_k-dimensional dk−dimensional vectors whose components are independent random variables with mean 0 and variance 1, then their dot product, q ⋅ k = ∑ i = 1 d k u i v i q \cdot k=\sum_{i=1}^{d_k}u_iv_i q⋅k=∑i=1dkuivi, has mean 0 and variance dk. Since we would prefer these values to have variance 1, we divide by d k \sqrt{d_k} dk.
12.12.3 Multi-Head Attention
Multi-Head Attention 是 Scaled Dot-Product Attention 的一个封装。
首先,将 Key、Query、Value 切分成多份,每一份分别做 Scaled Dot-Product Attention,得到的结果在 Concat 拼接起来,再通过一个全联接层,得到 Multi-Head Attention 的结果。
12.12.4 位置编码
在普通的RNN中,隐式的就含有位置编码,因为当前步的运算必须等前一步运算完才能进行。Transformer 的位置编码方式是:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ PE_{pos, 2i} &…
偶数位置使用 sin 函数。奇数位置使用 cos 函数。
d
m
o
d
e
l
d_{model}
dmodel 表示词汇的embedding的长度。
假设第一个位置的词汇Embeddings的长度是128,Pos = 1, d = 128,位置向量编码为:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ PE = [sin(1/10…
词汇原先的 Embedding 向量会和 位置编码向量拼接在一起,拼接得到的值会作为词汇的最终 表示向量。
12.12.5 Add & Norm
如图所示,在 Transformer 结构中有很多 Add & Norm 层。在 Encoder 和 Decoder 中都有。
Add & Norm 具体就是一个归一化操作。输入 X 经过 Self-Attention 得到输出 Z,此时将 X 与 Z 相加,再做一个Batch Normalization。
将 X 与 Z 相加,这个操作就是残差联接,可以将神经网络堆叠到很深的网络结构。Self-Attention 是对 X 进行提取,通过将 X 与 Z 相加,不仅可以获得进一步富集的特征,还可以保留原始的特征。将 X 与 Z 相加,等于是让神经网络只负责富集特征的工作,原始的特征会通过相加操作保留下来。而如果没有这种操作,相当于让神经网络不仅要做富集特征的事情,还要保留原始特征的任务,神经网络的任务就会比较繁重。可以理解成“集中力量办大事”,让神经网络集中力量只干一件事:富集特征。
12.12.6 Decoder 中的几个要点
仔细看下图的 Decoding 过程。
12.13 Transformer 的思考
Transformer 现在成为很多任务的标配了。刚开始学习 Transformer 时,感觉是惊为天人。随着时间的积累,对 Transformer 的不断反刍、不断思考,慢慢有了新的感悟,发觉 Transformer 应该是作者基本功扎实,不死看论文 & 懂得融汇变通、集众家所长的产物。正如李笑来在《把时间当作朋友》中说的:把时间当作朋友,去积累,去感悟。Transformer 就是作者对各种技术的思考和感悟。抛砖引玉,欢迎交流。
- Attention 非常有用,CNN里的 Kernel 也很有用,两者结合在一起,变成了 Multi-Head Attention;
- Attention 可以脱离 RNN存在,但 RNN 天然带有 位置编码,位置编码很有用,于是 Transformer 引入了 位置编码。为什么位置编码用了正弦和余弦函数,是为了并行化。
- Seq2Seq 是 NLP 问题建模的标准范式,所以 Transformer 依然沿用了 Seq2Seq 架构。
- 深的神经网络总是比浅的网络好,所以,作者沿用了 Residual 的方法,通过 Add & Norm 将网络堆叠多层。