资料摘要:personal chatgpt 17 — llama2 源码分析(RMSNorm 与 SwiGLU)
本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列。
本讲拆解 Llama 2 Transformer block 的两个组件:RMSNorm 只做基于均方根的 re-scaling,并以 Pre-Norm 形式放在 attention 与 FFN 前;SwiGLU 位于前馈网络,以 SiLU/Swish 门控另一条线性投影。课程用小张量和曲线图验证 RMSNorm 的尺度性质以及 SiLU 的函数形状。
1. RMSNorm 在 block 中的位置
Section titled “1. RMSNorm 在 block 中的位置”课程查看源码后指出 RMSNorm 出现两次:attention 前和 feed-forward network 前,属于 Pre-Norm。它的作用是控制输入尺度,而不是像 LayerNorm 那样同时做 re-centering 和 re-scaling。
2. RMSNorm 与 LayerNorm
Section titled “2. RMSNorm 与 LayerNorm”LayerNorm 会减均值并按方差缩放;RMSNorm 不减均值,只除以均方根,再乘可学习权重。Notebook 用 x.float() 计算归一化,再转回输入 dtype,避免低精度下统计计算过于不稳。
忽略 eps 与可学习权重时,归一化后向量的 范数为 。这不是“每个元素都等于 1”,而是整体平方和被规范到 。
3. SiLU/Swish 与 SwiGLU
Section titled “3. SiLU/Swish 与 SwiGLU”Notebook 先实现 swish(x)=x·sigmoid(x) 并与 PyTorch F.silu 对照。课程标题与 Llama 源码上下文是 SwiGLU;Notebook 实际可执行部分主要验证 SiLU 激活本身,没有完整重写 Llama 的三投影 FFN,因此应区分“激活函数演示”和“完整门控 FFN”。
Llama 形式可概括为:一支做 SiLU 门控,一支保留线性内容,逐元素相乘后再投影回模型维度。
公式 / 代码
Section titled “公式 / 代码”
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.weightLlama 式门控的结构化表达:
| 时间 | 内容 |
|---|---|
| 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 左右 | 验证归一化后 范数为 |
| 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 或本地资源依赖。
与前后讲关系
Section titled “与前后讲关系”- 承接第 15 讲: 从运行入口进入 Llama 2 block 内部。
- 引出第 18、19 讲: attention 前 RMSNorm 之后,Q/K 会进入 RoPE;后两讲专门拆解位置编码。
- 连接第 20 讲: attention 中的 K/V 随后会进入 KV Cache。
- RMSNorm 相比 LayerNorm 省略了哪个统计步骤?
- 为什么 RMSNorm 后向量的 范数约为 而不是 1?
- Llama 2 为什么被称为 Pre-Norm 结构?
- SiLU 激活与完整 SwiGLU FFN 的区别是什么?
x.float()后再type_as(x)的实现意图是什么?
- 视频:llama2 源码分析(RMSNorm 与 SwiGLU)
- 转录:🔒 personal chatgpt 17 视频转录
- 课件 / 代码:🔒 llama2_src_02_RMSNorm_SwiGLU.ipynb
- 视频描述中的补充资料:https://www.bilibili.com/video/BV1Fa411p7W3/
- 滴答清单抓取时学习状态:已完成。
- 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
- notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。