在[#260814]中,
前馈神经网络、注意力机制、
残差连接与归一化组成了一个Transformer层。


但在一开始,
Transformer还需要知道每个Token所在的位置。


并且还需要把多个Transformer层,
组合为完整的Encoder与Decoder。


一、位置编码


注意力机制只会计算Token之间的关联,
本身并不知道Token在句子中的前后顺序。


例如:

我喜欢你

你喜欢我


两个句子中的Token相同,
但排列顺序不同,表达的意思也不同。


因此,
需要在Token的Embedding向量中,
加入表示位置的向量。


形似:

$$ X = \text{Embedding}(Token) + PE $$


其中${PE}$,
即为Positional Encoding,位置编码。


原始Transformer中,
使用正弦函数与余弦函数生成位置编码:

$$ PE_{(pos,2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$

$$ PE_{(pos,2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$


其中${pos}$为Token所在的位置,
${i}$为向量中的维度。


不同位置会得到不同的向量,
模型便可以根据这些数值,
判断Token的先后关系。


二、Encoder


Encoder负责读取输入内容,
将输入Token转换为带有上下文信息的向量。


输入Token先经过Embedding与位置编码,
再进入多个相同的Encoder层。


每个Encoder层都包含:

  1. 多头注意力机制。
  2. 残差连接与LayerNorm。
  3. 前馈神经网络。
  4. 残差连接与LayerNorm。

形似:

$$ H = \text{LayerNorm}(X + \text{MultiHeadAttention}(X)) $$

$$ Y = \text{LayerNorm}(H + \text{FFN}(H)) $$


原始Transformer中,
这样的Encoder层重复6次。


经过多层计算后,
每个Token都带有其他Token的信息。


三、Decoder


Decoder负责根据Encoder的输出,
一个一个生成新的Token。


它与Encoder相似,
但多了两处不同。


第一处:

Decoder使用Masked Self-Attention
即带遮罩的自注意力。


生成当前Token时,
只能查看已经生成的Token,
不能提前看到后面的答案。


第二处:

Decoder会使用Cross-Attention
读取Encoder输出的内容。


此时:

  • ${Q}$来自Decoder。
  • ${K}$和${V}$来自Encoder。

这样Decoder在生成文字时,
既能参考已经生成的内容,
也能参考输入文本的信息。


四、完整流程


完整的Transformer,
可以简单分为以下步骤:

  1. 输入Token经过Embedding与位置编码。
  2. 输入进入多层Encoder,得到上下文向量。
  3. 已生成Token进入多层Decoder。
  4. Decoder通过Cross-Attention读取Encoder输出。
  5. 最终经过线性层与Softmax,得到下一个Token的概率。
  6. 选出一个Token后,重复以上过程。

最后一步形似:

$$ P = \text{Softmax}(\text{Linear}(H)) $$


其中${P}$,
就是每个Token作为下一个输出的概率。


图解:


至此,
从Embedding、注意力机制、FFN,
到位置编码、Encoder与Decoder,
Transformer的基本结构就完整了。


而目前的大语言模型,
大多是在Transformer的基础上继续发展而来。