1. Transformer架构的核心模块解析
在深入理解Transformer架构之前,我们需要先明确其核心设计理念:通过自注意力机制实现全局上下文建模,摆脱传统RNN/LSTM的序列处理限制。这种设计带来了三个革命性突破:完全并行化的计算流程、任意距离的token关联捕捉能力,以及高度模块化的架构设计。
1.1 多头自注意力机制的实现细节
多头自注意力(Multi-Head Attention)是Transformer区别于传统神经网络的核心组件。其本质是将单一维度的注意力计算扩展为多维度并行计算,每个"头"相当于一个独立的特征提取器。
具体实现上,假设我们有一个维度为d_model=512的输入向量,要拆分为h=8个头:
- 首先通过线性变换生成Q、K、V矩阵
- 将每个矩阵在特征维度上均等分割,得到8个64维的子矩阵
- 每个头独立计算缩放点积注意力:
python复制# 伪代码示例:单个头的注意力计算
def scaled_dot_product_attention(Q, K, V, mask=None):
matmul_qk = tf.matmul(Q, K, transpose_b=True) # Q*K^T
dk = tf.cast(tf.shape(K)[-1], tf.float32) # 获取维度dk
scaled_attention_logits = matmul_qk / tf.math.sqrt(dk) # 缩放
if mask is not None: # 解码器使用
scaled_attention_logits += (mask * -1e9)
attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1)
output = tf.matmul(attention_weights, V) # 加权求和
return output
实际工程实现中,为了优化计算效率,通常会使用合并矩阵运算:
python复制# 实际实现会将所有头的计算合并
combined_q = tf.concat([q_proj1, q_proj2, ..., q_proj8], axis=-1)
combined_k = tf.concat([k_proj1, k_proj2, ..., k_proj8], axis=-1)
combined_v = tf.concat([v_proj1, v_proj2, ..., v_proj8], axis=-1)
# 然后统一计算后再分割
split_q = tf.split(combined_q, num_or_size_splits=8, axis=-1)
...
关键细节:虽然原始论文设定头数为8,但在现代大模型中这个参数是可配置的。例如GPT-3 175B模型使用了96个注意力头,而较小的GPT-3 13B模型则使用40个头。头的数量通常与模型总参数量成正比。
1.2 位置编码的工程实现
Transformer抛弃了传统RNN的序列处理方式,因此需要显式的位置编码来保留序列顺序信息。原始论文使用正弦余弦函数:
python复制def positional_encoding(position, d_model):
angle_rates = 1 / np.power(10000, (2 * (i//2)) / np.float32(d_model))
angle_rads = np.arange(position)[:, np.newaxis] * angle_rates[np.newaxis, :]
# 正弦波应用于偶数索引
pe[:, 0::2] = np.sin(angle_rads[:,
