跳转到内容

输入关键词开始搜索

    资料摘要:personal chatgpt 17 — llama2 源码分析(RMSNorm 与 SwiGLU)

    视频摘要更新 2026-08-02置信度 high待阅读原始来源 ↗#深度#大模型#课程#personal-chatgpt

    本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列

    本讲拆解 Llama 2 Transformer block 的两个组件:RMSNorm 只做基于均方根的 re-scaling,并以 Pre-Norm 形式放在 attention 与 FFN 前;SwiGLU 位于前馈网络,以 SiLU/Swish 门控另一条线性投影。课程用小张量和曲线图验证 RMSNorm 的尺度性质以及 SiLU 的函数形状。

    课程查看源码后指出 RMSNorm 出现两次:attention 前和 feed-forward network 前,属于 Pre-Norm。它的作用是控制输入尺度,而不是像 LayerNorm 那样同时做 re-centering 和 re-scaling。

    LayerNorm 会减均值并按方差缩放;RMSNorm 不减均值,只除以均方根,再乘可学习权重。Notebook 用 x.float() 计算归一化,再转回输入 dtype,避免低精度下统计计算过于不稳。

    忽略 eps 与可学习权重时,归一化后向量的 2\ell_2 范数为 n\sqrt n。这不是“每个元素都等于 1”,而是整体平方和被规范到 nn

    Notebook 先实现 swish(x)=x·sigmoid(x) 并与 PyTorch F.silu 对照。课程标题与 Llama 源码上下文是 SwiGLU;Notebook 实际可执行部分主要验证 SiLU 激活本身,没有完整重写 Llama 的三投影 FFN,因此应区分“激活函数演示”和“完整门控 FFN”。

    Llama 形式可概括为:一支做 SiLU 门控,一支保留线性内容,逐元素相乘后再投影回模型维度。

    RMS(x)=1ni=1nxi2,RMSNorm(x)=xRMS(x)g\operatorname{RMS}(x)=\sqrt{\frac1n\sum_{i=1}^n x_i^2},\qquad \operatorname{RMSNorm}(x)=\frac{x}{\operatorname{RMS}(x)}\odot g

    xRMS(x)2=n\left|\frac{x}{\operatorname{RMS}(x)}\right|_2=\sqrt n

    SiLU(x)=xσ(x)=x1+ex\operatorname{SiLU}(x)=x\sigma(x)=\frac{x}{1+e^{-x}}

    class RMSNorm(torch.nn.Module):
    def _norm(self, x):
    return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)
    def forward(self, x):
    output = self._norm(x.float()).type_as(x)
    return output * self.weight

    Llama 式门控的结构化表达:

    FFN(x)=W2(SiLU(W1x)W3x)\operatorname{FFN}(x)=W_2\left(\operatorname{SiLU}(W_1x)\odot W_3x\right)

    时间 内容
    00:00 引入 RMSNorm 与 SwiGLU
    01:21 阅读 RMSNorm 源码
    01:39 attention 前与 FFN 前两处使用
    02:23 Pre-Norm 与 RMS 全称
    02:40 回顾 LayerNorm 的中心化与缩放
    05:16 对比 LayerNorm 与 RMSNorm
    07:00 左右 验证归一化后 2\ell_2 范数为 n\sqrt n
    09:01 进入 SwiGLU/SiLU
    10:00 左右 F.silu 对照手写 Swish
    • 运行标签:direct-static。 主要是 CPU 可运行的小张量、NumPy、Matplotlib 与 PyTorch 计算,不下载模型、不训练。
    • Notebook 未锁定依赖版本,但使用的 API 基础且副作用较小。
    • 完整 SwiGLU FFN 公式来自 Notebook 的 Llama 源码上下文;可执行单元只实现了 SiLU/Swish 曲线,不应声称已经完整复现 FFN。
    • 本次未逐单元重跑,但静态上无外部模型、CUDA 或本地资源依赖。
    • 承接第 15 讲: 从运行入口进入 Llama 2 block 内部。
    • 引出第 18、19 讲: attention 前 RMSNorm 之后,Q/K 会进入 RoPE;后两讲专门拆解位置编码。
    • 连接第 20 讲: attention 中的 K/V 随后会进入 KV Cache。
    1. RMSNorm 相比 LayerNorm 省略了哪个统计步骤?
    2. 为什么 RMSNorm 后向量的 2\ell_2 范数约为 n\sqrt n 而不是 1?
    3. Llama 2 为什么被称为 Pre-Norm 结构?
    4. SiLU 激活与完整 SwiGLU FFN 的区别是什么?
    5. x.float() 后再 type_as(x) 的实现意图是什么?
    • 滴答清单抓取时学习状态:已完成
    • 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
    • notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。