深度学习的乐高积木:每一个 Block 都是一个独立的特征加工厂

积木的逻辑:Block 是如何组成的

在大型语言模型中,我们很少直接讨论成千上万层神经元,而是讨论“Block”。一个 Transformer Block 是一个自成一体的处理单元,它接收一个序列向量,进行加工后,输出一个形状完全相同的向量。

项目 06 的目标是将你之前写好的注意力机制嵌入到一个标准化的外壳中。这个外壳包含三个关键组件:残差连接(Residual Connection)、层归一化(Layer Normalization)和前馈网络(Feed-Forward Network)。

第一阶段:残差连接——防止梯度消失的捷径

残差连接的公式非常简单:$Output = Sublayer(x) + x$。 但在深度学习中,它的意义极其重大。它建立了一条“梯度高速公路”,允许信息在不经过复杂非线性变换的情况下直接流向更深层。在实现中,这意味着你的 Block 输入向量会绕过注意力层,直接与注意力层的输出相加。这保证了即是在模型初始化阶段,初始信息也能传播到最后一层。

第二阶段:归一化策略(Pre-Norm vs Post-Norm)

归一化层的作用是将神经元的激活值限制在合理的数值范围内,防止梯度爆炸。 目前的工业界共识是采用 Pre-Norm:即在进入子层(如注意力或 FFN)之前先进行归一化。 $x = x + Sublayer(Norm(x))$ 这种结构的优势在于训练极度稳定,不需要像原始 Transformer 论文(Post-Norm)那样使用极其复杂的 Learning Rate Warmup。

第三阶段:前馈网络(FFN)——非线性的力量

注意力机制本质上是“信息搬运”,它决定了每个 Token 应该从邻居那里搬运多少信息。而 FFN 则是“信息加工”,它在每个 Token 内部进行深度的特征提取。 典型的 FFN 包含两层线性映射和一个激活函数(如 GELU)。第一层通常会将维度扩大 4 倍(即维度从 512 扩充到 2048),再由第二层压缩回 512。这种“膨胀-压缩”的过程能够让模型学习到更复杂的特征组合。

核心代码结构参考

class TransformerBlock(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.ln_1 = nn.LayerNorm(config.n_embd)
        self.attn = MultiHeadAttention(config)
        self.ln_2 = nn.LayerNorm(config.n_embd)
        self.mlp = nn.Sequential(
            nn.Linear(config.n_embd, 4 * config.n_embd),
            nn.GELU(),
            nn.Linear(4 * config.n_embd, config.n_embd),
            nn.Dropout(config.dropout),
        )

    def forward(self, x):
        # Attention 路径
        x = x + self.attn(self.ln_1(x))
        # MLP 路径
        x = x + self.mlp(self.ln_2(x))
        return x

观察与思考

当你组合好这个 Block 后,尝试思考以下工程细节:

  1. 隐藏层维度的一致性:为什么 Block 的输入和输出维度必须一致?(为了方便无限堆叠)。
  2. 计算量分布:在一个标准的 GPT Block 中,大部分参数其实都在 MLP 层,而不是注意力层。这意味着模型的“知识存储”很大程度上依赖于 MLP 的宽度。
  3. Dropout 的位置:在残差相加之前应用 Dropout 是防止过拟合的关键技巧。

总结

Transformer Block 是现代 LLM 的基本解剖单位。它通过残差连接解决了深度的痛点,通过归一化解决了数值的痛点,通过 FFN 解决了特征表达的痛点。理解了 Block 的运作方式,你就理解了为什么 GPT 系列可以从 12 层一直堆叠到 100 多层。

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:项目 06:构建完整的 Transformer Decoder Block

本文链接:https://www.sshipanoo.com/blog/ai/llm-roadmap/lab-06-block/

本文最后一次更新为 天前,文章中的某些内容可能已过时!