在[#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层都包含:
- 多头注意力机制。
- 残差连接与LayerNorm。
- 前馈神经网络。
- 残差连接与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,
可以简单分为以下步骤:
- 输入Token经过Embedding与位置编码。
- 输入进入多层Encoder,得到上下文向量。
- 已生成Token进入多层Decoder。
- Decoder通过Cross-Attention读取Encoder输出。
- 最终经过线性层与Softmax,得到下一个Token的概率。
- 选出一个Token后,重复以上过程。
最后一步形似:
$$ P = \text{Softmax}(\text{Linear}(H)) $$
其中${P}$,
就是每个Token作为下一个输出的概率。
图解:
至此,
从Embedding、注意力机制、FFN,
到位置编码、Encoder与Decoder,
Transformer的基本结构就完整了。
而目前的大语言模型,
大多是在Transformer的基础上继续发展而来。