Transformer 关键技术
除了自注意力机制,Transformer 的成功还依赖于几个关键的技术组件,它们共同保证了模型的强大性能和稳定训练。
位置编码 (Positional Encoding)
核心问题:自注意力机制本身并不包含任何关于单词顺序的信息(它平等地看待所有词)。但在语言中,“我爱她”和“她爱我”的顺序是至关重要的。位置编码就是为了解决这个问题而生的。
解决方案:在将词向量输入模型之前,为每个词向量加上一个独特的“位置向量”。这个位置向量是通过正弦和余弦函数生成的,它为每个位置提供了一个独特的、有规律的信号,让模型能够学习到单词的相对和绝对位置信息。
import numpy as np
def get_positional_encoding(seq_len, d_model):
# ... sin/cos function implementation ...
# pos_encoding[:, 0::2] = np.sin(...)
# pos_encoding[:, 1::2] = np.cos(...)
return pos_encoding
# 词向量 + 位置编码
# final_embedding = word_embedding + pos_encoding
残差连接 (Add) 与 层归一化 (Norm)
在 Transformer 的每个子层(如自注意力层、前馈网络层)之后,都会紧跟着一个“Add & Norm”操作。这是保证深度 Transformer 能够成功训练的关键。
输入 x
子层 (如自注意力)
+
残差连接
层归一化
输出
- 残差连接 (Residual Connection): 允许信息通过“跳线”直接流向下一层,极大地缓解了深度网络中的梯度消失问题,使得训练非常深的网络成为可能。
- 层归一化 (Layer Normalization): 对每个样本在层内的所有神经元输出进行归一化,使得数据分布更加稳定,从而加速和稳定训练过程。
from tensorflow import keras
from keras import layers
# Add & Norm 的 Keras 实现
inputs = ...
sublayer_output = layers.MultiHeadAttention(...)(inputs, inputs)
# 残差连接
x = layers.Add()([inputs, sublayer_output])
# 层归一化
x = layers.LayerNormalization()(x)