编码器 (Encoder) 与解码器 (Decoder) 结构

一个完整的 Transformer 由一堆编码器和一堆解码器堆叠而成。与 RNN 不同的是,所有输入词元可以并行地通过编码器堆栈,极大地提高了训练效率。

  • 编码器 (Encoder): 负责处理输入序列,它的每个子层都包含一个自注意力模块和一个前馈神经网络。它的任务是为输入序列中的每个词元生成一个富含上下文信息的表示。
  • 解码器 (Decoder): 负责生成输出序列。它的每个子层比编码器多一个“交叉注意力”模块,使其在生成每个词元时,能够“关注”编码器输出的所有信息。
输入序列
编码器 xN
解码器 xN
输出概率
from tensorflow import keras from keras import layers # 编码器子层 (简化) def encoder_block(inputs): attention_output = layers.MultiHeadAttention(...)(inputs, inputs) # ... Add & Norm, Feed Forward, Add & Norm ... return ... # 解码器子层 (简化) def decoder_block(inputs, encoder_outputs): # Masked Self-Attention # Cross-Attention attention_output = layers.MultiHeadAttention(...)(inputs, encoder_outputs) # ... Add & Norm, Feed Forward, Add & Norm ... return ...

多头注意力 (Multi-Head Attention)

核心思想:与其让一个自注意力机制独自承担理解所有复杂关系的重任,不如让多个自注意力机制“分头行动”。这就像一个专家团队,每个“头”都是一个专家,它们从不同的角度(不同的表示子空间)来分析输入序列中词与词之间的关系,例如一个头可能关注语法关系,另一个头关注语义关系。

最后,将所有“头”的分析结果拼接起来,通过一个线性层进行整合,从而得到一个更全面、更丰富的表示。

输入
注意力头 1
注意力头 2
... 头 h
拼接 (Concat)
线性层
输出
from tensorflow import keras from keras import layers # 在 Keras 中使用 MultiHeadAttention 层 # num_heads: 头的数量 # key_dim: 每个头的维度 multi_head_attention = layers.MultiHeadAttention( num_heads=8, key_dim=64 ) # Q, K, V 来自输入 # output = multi_head_attention(query=Q, key=K, value=V)