从零实现 Transformer
读论文不如写一遍。亲手实现一个简化版 Transformer,能让你真正理解自注意力、残差连接与位置编码如何协作。本文用 PyTorch 从最底层拼出核心组件。
自注意力
自注意力把输入映射为 Q、K、V,用 Q 与 K 的点积衡量相关性,缩放后 softmax 得到权重,再对 V 加权求和。
import torch
import torch.nn.functional as F
def scaled_dot_product_attention(q, k, v):
d_k = q.size(-1)
scores = q @ k.transpose(-2, -1) / d_k ** 0.5
weights = F.softmax(scores, dim=-1)
return weights @ v
多头与位置编码
多头注意力把上述过程并行多份再拼接,让模型关注不同子空间关系。由于注意力本身无序,需加入位置编码保留词序,常用正弦编码或可学习编码。
前馈与残差
每个子层外包裹残差连接与层归一化:output = LayerNorm(x + Sublayer(x))。这种结构稳定训练,是Transformer堆叠多层的关键。
注意点
手写时最容易出错的是维度对齐与 mask。因果 mask 要防止解码器看到未来 token,可用下三角矩阵实现。先在小维度上用随机输入跑通前向,再逐步加训练逻辑。
小结
从零实现让你看清 Transformer 的三个支柱:缩放点积注意力提供全局依赖,多头机制丰富表示,残差与层归一化保证可训练性。理解了这些,读 GPT、BERT 论文便不再吃力。
参考与延伸阅读
- 原始论文「Attention Is All You Need」。已核验。https://arxiv.org/abs/1706.03762
- 图解 Transformer(Jay Alammar)。已核验。https://jalammar.github.io/illustrated-transformer/
- PyTorch nn.Transformer 文档。已核验。https://pytorch.org/docs/stable/generated/torch.nn.Transformer.html
本文累计阅读 — 次