Transformer 是一种 Seq2seq 模型,即 input a sequence, output a sequence. 应用包括语音识别(输入语音,输出文本)、机器翻译(输入一种语言文本,输出另一种语言文本)、语言翻译(输入一种语言的语音,输出是另一种语言的文本,如字幕)、语音合成(输入一种语言文本,输出另一种语言的语音)、聊天机器人(对话)等,这些都可以看作 QA(Question & Answering)问题,都可以使用 Seq2seq 模型解决。

Seq2seq

一般的 Seq2seq 模型的一般框架

markdown
1
input sequence -> Encoder -> Decoder -> output sequence

如 Transformer 就是该模型的一种。李宏毅老师的课件:Transformer

Self-attention

self-attention 中文是自注意力,它对于输入的向量输出相同数量的向量。

如上图所示,ai,i=1,2,3,4 为输入向量(如词嵌入向量),qi,i=1,2,3,4 为 query,ki,i=1,2,3,4 为 key,vi,i=1,2,3,4 为 value,后三者分别有输入向量 ai 得到

qi=Wqai

ki=Wkai

vi=Wvai

这里,Wq,Wk,Wv 是矩阵,但不一定是方阵,一般是行大于列。行数代表输入向量的维数,列代表乘积后输出的向量 qi,ki,vi 维数。

α2,1 是由 q2k1 做 dot product 而得到的,其他依次类推 α2,2,α2,3,α2,4. 然后,通过 Softmax 激活函数,得到 α2,i,i=1,2,3,4 作为系数与 vi,i=1,2,3,4 相乘得到 b2=iα2,ivi,对于其他 b1,b3,b4 依次类推。

其实,Self-attention 能够利用矩阵简洁表示如下,这也是其并行化计算的原因

这里 I=(ai),i=1,2,3,4 为输入向量列,Wq,Wk,Wv 为需要学习的参数矩阵,Q,K,V 分别为 query, key, value 矩阵,A 为 attention 系数,A 为经过 Sigmoid 归一化后的 attention matrix. O=(bi),i=1,2,3,4 为 self-attention 输出的向量列。

在实际使用中,常常采用 multi-head self-attention,如下图所示

与上面的 self-attention 类似,先通过 Wq,Wk,Wv 得到 qi,ki,vi,然后再分别经过 2 个(这里例子 multi-head 为 2 头的)矩阵得到 2 个

qi,1=Wq,1qi,qi,2=Wq,2qi

ki,1=Wk,1ki,ki,2=Wk,2ki

vi,1=Wv,1vi,vi,2=Wv,2vi

那计算 bi,2 时,只需要 qi,2kj,2,j=1,2,3,4 相乘后然后经过 Sigmoid 归一化后得到 attention 系数,然后组合 vi,2 相乘得到

bi,2=jαi,2,jvj,2

注意,这里只需要计算相同头(如 (qi,1,ki,1,vi,1),(qj,1,kj,1,vj,1),相同标号 1)的值,计算方法同上面的 selft-attention.

最后,bi=W0(bi,1,bi,2)T .

这样,就从 ai,i=1,2,3,4 得到 bi,i=1,2,3,4.

CNN 和 Self-attention 的关系:On The Relationship Between Self-attention And Convolutional Layers

Encoder

输入一排向量,输出另一排同样长度的向量。在 Transformer 中的 Encoder 里用的是 Self-attention.

BERT 是仅仅使用 Transformer 的 Encoder 构建起来的。

Encoder 是由 N 个 self-attention 模块线性拼接而成,输入向量列增加了位置信息。

Decoder

输入是 Encoder 的输出向量和一个 special token (标识开始 BEGIN)。

GPT-2, GPT-3 是仅仅使用 Transformer 的 Decoder 构建起来的,属于 Unsupervised Pre-training model。 在 300 billion tokens of text 上训练得到,它的目标(能够做)Predict the next word.

Decoder 与 Encoder 的区别是调整为 masked multi-head attention,并在中间增加 cross attention,引入 encoder 的信息。而 masked multi-head attention 是因为后面的单词或向量还未得到,不能像 encoder 里的 multi-head attention 那样使用全面的向量的信息,只能使用已经得到的向量的信息。

在 cross attention 中,对于 decoder 中 masked multi-head attenion 得到的每一个 q 分别与 encoder 中的 ki=Wkai,vi=Wvai 做 self-attention 操作得到 v,如图所示

v=i=13viαiαi=f(kiq/d)

这里映射 f 表示 sigmoid 激活,d 表示 q 的维度。

代码实现

TensorFlow: tensor2tensor

pyTorch: The Annotated Transformer

参考链接

  1. What is Covariate Shift?
  2. 详解Transformer (Attention Is All You Need)
  3. The Illustrated Transformer