1. Transformer架构原理解析
1.1 自注意力机制实现细节
Transformer架构的核心创新在于自注意力机制(Self-Attention)的巧妙设计。这个机制让模型能够动态计算输入序列中每个位置与其他位置的关联权重,具体通过Query、Key、Value三个矩阵实现。在实际计算中,假设输入维度为d_model=512,则每个头的维度d_k=d_v=d_model/h=64(h=8个头)。注意力分数的计算公式为:
$$
Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V
$$
其中除以$\sqrt{d_k}$的操作是为了防止点积结果过大导致softmax梯度消失。我曾在实际训练中发现,当去掉这个缩放因子时,模型收敛速度会明显变慢。
关键技巧:多头注意力的并行计算可以通过矩阵拼接实现,在PyTorch中通常用
torch.bmm进行批量矩阵乘法,比循环计算效率提升5-8倍。
1.2 位置编码的工程实践
Transformer抛弃RNN的时序结构后,必须显式注入位置信息。原始论文采用的正弦位置编码公式为:
$$
PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})
$$
但在实际项目中,我测试过以下几种变体:
- 可学习的位置嵌入(效果提升约0.5-1.2%)
- 相对位置编码(适合长文本任务)
- 旋转位置编码(RoPE,现被LLaMA系列采用)
特别是在处理超过训练时最大长度的文本时,需要特别注意位置外推(extrapolation)问题。一个实用技巧是对位置索引进行缩放:
python复制# 位置外推示例
if pos > max_train_len:
pos = max_train_len * (pos / seq_len)**0.7
1.3 前馈网络的隐藏设计
FFN层看似简单却有几个关键细节:
- 中间维度通常放大4倍(512→2048)
- 使用GeLU激活而非ReLU(提升约0.3-0.8%效果)
- 添加残差连接时的LayerNorm位置有Pre-LN和Post-LN两种方案
在微调BERT时,我发现Post-LN在深层网络(>12层)中更容易训练,但Pre-LN在
