LogoCookLLM文档
LogoCookLLM文档
首页CookLLM

原理精讲

词元化
Tokenization 基础BPE 算法详解GPT 系列 TokenizerBPE 训练工程化
模型架构
Transformer LM
从 token ids 到 logitsEmbedding 与 LM Head
Attention 机制
Self-Attention 到 GQAAttention Sink
位置编码
位置编码基础RoPE 数学推导RoPE 代码实现长度外推
GPU 编程基础
GPU 架构基础张量布局Triton 入门:向量加法
FlashAttention
Flash Attention 原理详解从朴素实现到 Auto-TuningBlock Pointer 与多维支持Causal Masking 优化Grouped Query Attention反向传播实现
分布式训练
数据并行ZeRO 优化器全分片数据并行张量并行流水线并行多维混合并行
推理优化
KV CacheContinuous BatchingPagedAttention

动手训练

概述
预训练
预训练数据Tokenizer 训练模型架构数据流水线训练循环监控与验证
X (Twitter)
基础知识模型架构位置编码

长度外推

会员专享

NTK-aware Scaling、YaRN 等方法让 RoPE 模型处理超长序列

在权益中心获取代码

转圈视角:理解长度外推

假设模型在 max_seq_len = 4096 上训练。当推理时输入长度为 8192,会发生什么?

一个常见的直觉是"位置编号超出了训练范围,所以 OOD 了"。但这个说法不够精确,位置编号跟位置嵌入不是一回事。位置编号 mmm 是无界的,但 RoPE 的位置嵌入是三角函数组成的,有界。跟模型直接打交道的是位置嵌入,不是位置编号。所以要真正理解 OOD,我们需要从位置嵌入的角度来分析。

单位圆上的转圈

回顾上一章的内积公式,加了 RoPE 之后的 Q/K 内积可以用复数表示为:

(Rmq)⊤(Rnk)=Re[∑i=0d/2−1q[2i:2i+1] k[2i:2i+1]∗ ei(m−n)θi](R_m q)^\top (R_n k) = \text{Re}\left[\sum_{i=0}^{d/2-1} q_{[2i:2i+1]} \, k^*_{[2i:2i+1]} \, e^{i(m-n)\theta_i}\right](Rm​q)⊤(Rn​k)=Re​i=0∑d/2−1​q[2i:2i+1]​k[2i:2i+1]∗​ei(m−n)θi​​

关键在 ei(m−n)θie^{i(m-n)\theta_i}ei(m−n)θi​ 这一项。从欧拉公式 eit=cos⁡t+isin⁡te^{it} = \cos t + i\sin teit=cost+isint 可以知道,它就是单位圆上的一个点。当相对距离 m−nm - nm−n 逐渐变大时,这个点在单位圆上转圈,θi\theta_iθi​ 越大转得越快,θi\theta_iθi​ 越小转得越慢。

这就是"转圈视角"的核心:位置编号 m−nm - nm−n 是否 OOD 根本不重要,重要的是单位圆上的点是否被充分训练过。

高频 vs 低频:覆盖度的差异

假设训练长度为 LtrainL_{\text{train}}Ltrain​,那么 m−n∈[0,Ltrain−1]m - n \in [0, L_{\text{train}} - 1]m−n∈[0,Ltrain​−1]。对于每个维度 iii,我们可以算出训练期间转了多少圈:

ri=θi⋅Ltrain2πr_i = \frac{\theta_i \cdot L_{\text{train}}}{2\pi}ri​=2πθi​⋅Ltrain​​
  • 高频维度(θi\theta_iθi​ 大,iii 小):转速快,训练期间已经转了很多圈,圆上的每一个点几乎都被训练过。即使测试时 m−nm - nm−n 更大,也只是在已经见过的圆上继续转,不存在 OOD 问题
  • 低频维度(θi\theta_iθi​ 小,iii 大):转速慢,训练期间可能还没转完一圈,被训练过的点顶多只是圆上的一段弧。测试时如果超出了这段弧的范围,就进入了模型从未见过的区域,这才是真正的 OOD
Unit Circle Coverage
4096
8192
High freq (i=0)
i = 0, θ = 1.0000
Rotations
651.9
Period
6
Full coverage — safe
Low freq (i=63)
i = 63, θ = 0.0001
Rotations
0.1
Period
54410
Arc only — OOD risk
Trained arcExtrapolation (OOD)

用具体数值来感受一下(d=128d = 128d=128,base=10000\text{base} = 10000base=10000,Ltrain=4096L_{\text{train}} = 4096Ltrain​=4096):

# 最高频维度 (i=0): θ₀ = 1.0
# 圈数: 1.0 × 4096 / (2π) ≈ 651 圈 → 圆上全覆盖,安全

# 最低频维度 (i=63): θ₆₃ ≈ 0.00011
# 圈数: 0.00011 × 4096 / (2π) ≈ 0.07 圈 → 只走了一小段弧,OOD 风险极高

问题的本质不是"旋转角度太大",而是低频维度在单位圆上的覆盖不足。高频维度转了几百圈,反而是最安全的。

从转圈到解法

有了这个视角,解决思路就很清晰了:

  • 圈数充足的维度(高频)→ 不需要改动,直接外推
  • 圈数不足的维度(低频)→ 需要把超出弧范围的部分压缩回已训练的弧内(位置内插)
  • 中间地带 → 在两者之间平滑过渡

这正是后面各种方法的核心思想。区别只在于"怎么压缩"和"压缩多少"。

登录以继续阅读

这是一篇付费内容,请登录您的账户以访问完整内容。

RoPE 代码实现

逆频率计算、cos/sin 缓存与 apply_rotary_pos_emb 的向量化实现

GPU 编程基础

入门 CUDA 与 Triton,写出高效的 GPU Kernel

目录

转圈视角:理解长度外推
单位圆上的转圈
高频 vs 低频:覆盖度的差异
从转圈到解法
Position Interpolation(位置插值)
NTK-aware Scaling
核心思想
推导
实现
NTK-aware 的优势
Dynamic NTK
YaRN
动机
YaRN 的三个组件
1. NTK-by-parts(分段插值)
2. Attention 缩放
YaRN 的效果
各方法对比总结
总结