跳转到内容

输入关键词开始搜索

    资料摘要:personal chatgpt 18 — llama2 源码分析 RoPE 相对位置编码的复数形式

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

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

    本讲先回顾欧拉公式、复平面和单位圆,再把正弦位置编码中相邻的 sin/cos 维度组成一个复数,解释 Llama 2 如何用 torch.polar 预计算单位复数频率 freqs_cis。该表示为下一讲对 Q/K 执行复数乘法、得到相对位置性质做准备。

    eiθ=cosθ+isinθe^{i\theta}=\cos\theta+i\sin\theta

    当模长为 1 时,角度 θ\theta 决定复平面上的旋转。复数乘法会让角度相加,这正适合表达“按位置旋转”。

    课程用偶数维 sin、奇数维 cos 回顾经典位置编码。Notebook 把 sequence positions 与各维频率做 outer product,得到 [max_sequence_length, d_model/2] 的角度矩阵,再交错拼回实数特征。

    Llama 2 的预计算函数先生成不同维度的频率:

    ωi=θ2i/d\omega_i=\theta^{-2i/d}

    再令位置 tt 与频率做外积 tωit\omega_i,最终用 torch.polar(1, angle) 生成:

    cis(tωi)=cos(tωi)+isin(tωi)\operatorname{cis}(t\omega_i)=\cos(t\omega_i)+i\sin(t\omega_i)

    Notebook 通过 torch.view_as_real 把复数恢复为实部/虚部,并用翻转与 flatten 对齐此前的 sin/cos 排列。这里证明的是两种表示之间的重排关系;它还没有证明 attention score 只依赖相对位置,第 19 讲才完成该推导。

    经典位置编码:

    PE(t,2i)=sin(t100002i/d),PE(t,2i+1)=cos(t100002i/d)PE(t,2i)=\sin\left(\frac{t}{10000^{2i/d}}\right),\qquad PE(t,2i+1)=\cos\left(\frac{t}{10000^{2i/d}}\right)

    def precompute_freqs_cis(dim: int, end: int, theta: float = 10000.0):
    freqs = 1.0 / (
    theta ** (torch.arange(0, dim, 2).float() / dim)
    )
    t = torch.arange(end, device=freqs.device)
    freqs = torch.outer(t, freqs).float()
    return torch.polar(torch.ones_like(freqs), freqs)

    dim=6end=10,角度和复数结果的形状都是 [10, 3]

    时间 内容
    01:05 引入复平面与 complex number
    01:13 欧拉公式与单位圆
    02:33 回顾 sinusoidal position encoding
    03:26 位置与不同频率做 outer product
    05:22 进入 Llama 的 precompute_freqs_cis
    08:56 解释 CIS 记号
    10:23 torch.polar 生成单位复数
    11:18 复数表示转回交错的 sin/cos 实数表示
    • 运行标签:direct-static。 仅需 PyTorch、NumPy、Matplotlib,使用小张量,CPU 可运行。
    • Notebook 中 Wikipedia URL 的自动提取会因括号截断;正文原意是 CIS 数学条目,不影响本地代码。
    • 课程没有在本讲实现 apply_rotary_emb,不得把第 19 讲的 Q/K 旋转代码倒灌为本讲已讲内容。
    • 本次未重跑 Notebook,但静态上没有模型下载、CUDA 或写盘副作用。
    • 承接第 17 讲: 在 Llama block 中,RMSNorm 后得到的表示会投影为 Q/K,再施加 RoPE。
    • 引出第 19 讲: 本讲只预计算旋转因子;下一讲把它广播到 Q/K,并推导 nmn-m 相对位置。
    • 引出第 20 讲: 旋转后的 K 会与 V 一起进入 KV Cache。
    1. 为什么 eiθe^{i\theta} 可以看成单位圆上的旋转?
    2. precompute_freqs_cis(dim, end) 的两个输出维度分别代表什么?
    3. torch.outer(t, freqs) 计算了什么?
    4. 本讲与第 19 讲在 RoPE 流程中的分工是什么?
    5. 把复数 freqs_cis 转回实数后,为什么会出现 sin/cos 两个分量?
    • 滴答清单抓取时学习状态:已完成
    • 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
    • notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。