Transformer解读

Transformer 原文 《Attention is All You Need》

Transformer 整体结构

1 模型输入表示

1.1 单词编码

对于给定的语料库,将其进行分词,统计词频,按照词频进行降序排序,给每一个词分配一个索引,也就是说词频越大的单词,其索引值越小,词频最大的单词索引为0。
然后将每一个单词映射为一个向量,这个向量就是单词的编码,向量可以使用one-hot编码(也可以使用其他的方法得到,如word2vec等,这里简单的以onehot编码为例);例如我们的语料库总计有100000个单词,而单词“tower”的索引可能是1111,那么"tower"的one-hot编码向量即为一个100000维度的向量,向量中第1111个元素为1,其余元素为0。

1.2 句子编码

对于给定的句子,将其进行分词,然后将每一个词的编码进行拼接,得到句子的编码向量矩阵。
例如
句子: The cat is on the mat

索引:

单词 The cat is on the mat
索引 2101 2102 2103 2104 2105 2106

编码向量:
The:(0,0,…,1,0,…,0),第2101个位置上的值为1;
cat:(0,0,…,0,1,0,…,0),第2102个位置上的值为1;
is:(0,0,…,0,0,1,0,…,0),第2103个位置上的值为1;
on:(0,0,…,0,0,0,1,0,…,0),第2104个位置上的值为1;
the:(0,0,…,0,0,0,0,1,0,…,0),第2105个位置上的值为1;
mat:(0,0,…,0,0,0,0,0,1,0,…,0),第2106个位置上的值为1。

句子编码向量矩阵:
将单词的编码向量进行拼接,得到句子的向量表示矩阵

(001000000000100000000010000000001000000000100000000010)\begin{pmatrix} 0 & 0 & \cdots & 1 & 0 & 0 & 0 & 0 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 & 1 & 0 & 0 & 0 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 & 0 & 1 & 0 & 0 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 & 0 & 0 & 1 & 0 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 & 0 & 0 & 0 & 1 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 & 0 & 0 & 0 & 0 & 1 & \cdots & 0 \end{pmatrix}

1.3 位置编码

除了得到句子得向量表示矩阵之外,我们需要知道每个单词在句子中的相对位置是怎么样的。transformer中使用位置编码来解决这个问题。

位置编码的原理是:对于一个句子,假设其长度为L,那么对于每一个单词,我们将其在句子中的位置编码为:

PEpos,2i=sin(pos100002id)PEpos,2i+1=cos(pos100002id)PE_{pos_,2i} = sin(\frac{pos}{10000^{\frac{2i}{d}}}) \\ PE_{pos_,2i+1} = cos(\frac{pos}{10000^{\frac{2i}{d}}})

其中,pos表示单词在句子中的位置,d表示位置表示向量的维度,i从0开始,到L结束。当i为偶数时使用sin,当i为奇数时使用cos。

1.4句子的综合表示

将句子的编码向量矩阵和位置编码向量矩阵直接相加,得到句子的综合表示向量矩阵。

2 注意力机制

句子表示矩阵输入模型之后,首先会经过多头注意力机制层,然后通过layer normalization层和残差连接。而其中的多头注意力机制层,是由多个自注意力机制组成的。

2.1 自注意力机制

自注意力机制涉及到Q(查询)、K(键)、V(值)三个矩阵,self-attention接收的参数是句子表示矩阵,或者上一个encoder模块的输出,而Q,K,V是通过self-attention的输入句子表示矩阵进行线性变换之后得到的。

2.2 Q、K、V的计算

随机初始化矩阵W,Q,K,V后,再通过一个线性表示矩阵,将输入句子表示矩阵映射为Q,K,V。即

Q=X×WQK=X×WKV=X×WVQ = X \times WQ \\ K = X \times WK \\ V = X \times WV

这里X是输入的句子表示向量矩阵。

2.3 self-attention 的输出

Attention(Q,K,V)=softmax(QKTdk)×VAttention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}}) \times V

这里dkd_{k}是Q和K的维度(列数)。QKTQK^{T}的意思是计算Q和K的点积,除以dk\sqrt{d_k}的目的是防止内积过大,softmax操作的作用是将点积矩阵的每一行都进行归一化,得到每个单词相对于其他单词的attention系数,也即相对重要性系数。

我们记Z=Attention(Q,K,V)Z = Attention(Q,K,V)为自注意力的输出。

2.4 多头注意力机制

多头注意力机制由多个self-attention组成,每个self-attention的输出作为下一个self-attention的输入。

也就是说同时将输入X分发到多个self-attention中,然后将每个attention的输出拼接起来,再进行一次线性变换,得到多头注意力的输出Z。这个输出Z和输入的X的维度相同。

3 Encoder 编码器

编码器部分由多头注意力机制层、layer normalization层、前馈神经网络层,最后再连接一个layer normalization层组成。
多头注意力机制层前面已经描述,下面描述其余的部分。

3.1 add & norm层

Add & Norm 层由 Add 和 Norm 两部分组成;

第一个add & normal层的计算公式如下:

LayerNormal(X+MultiHeadAttention(X))LayerNormal(X + MultiHeadAttention(X))

第二个add & normal层的计算公式如下:

LayerNormal(X+FeedForward(X))LayerNormal(X + FeedForward(X))

这里X表示MultiHeadAttention或者FeedForward的输入(而不是最开始的输入X),MultiHeadAttention和FeedForward的输出与输入的维度相同,因此是可以直接相加的。

add 相加部分是残差连接方式,norm是layer normalization,用于加快收敛。

3.2 前馈神经网络层

前馈神经网络层由两个全连接层组成,第一个全连接层的输出作为第二个全连接层的输入;第一层的激活函数使用ReLu,第二层不使用激活函数。

FeedForward层的计算公式如下:

max(0,XW1+b1)W2+b2max(0, XW_{1}+b_{1})W_{2}+b_{2}

FeedForward层的输出与输入的维度保持一致。

3.3 编码器模块

编码器模块由多个Encoder层构成,其中第一个Encoder的输入是句子的表示向量矩阵,后续的Encoder的输入是前一个Encoder的输出,最后一个Encoder的输出就是编码信息矩阵C。而矩阵C将会输入到解码器中。

4 Decoder 解码器

解码器首先是一个 masked 多头注意力,然后连接一个 add & norm 层,再连接一个 多头注意力层和 add & norm 层,最后连接一个前馈神经网络层和add & normal层。但是第二个多头注意力中的K,V使用编码层输出的信息矩阵C来计算,而Q则使用上一个decoder的输出来计算

4.1 masked 多头注意力

masked 多头注意力与 self-attention 基本相同,只是多了一个mask操作。


Transformer解读
https://www.lihaibao.cn/2024/04/03/Transformer解析/
Author
Seal Li
Posted on
April 3, 2024
Licensed under