从零实现 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 论文便不再吃力。

参考与延伸阅读

本文累计阅读