大家的AI
机器学习AI论文

学习

  • AI论文
  • 理论·数学基础
    • CPAL2026
      • Kernel von Mises Formula of the Influence Function
  • 模型优化·轻量化
    • PolarQuant: Quantizing KV Caches with Polar Transformation
  • 核心架构·算法
    • CPAL2026
      • AlphaFormer: End-to-End Symbolic Regression of Alpha Factors with Transformers
  • 预测·表格数据
  • AutoML·ML 流水线
    • ICML 2025
      • AutoML-Agent: A Multi-Agent LLM Framework for Full-Pipeline AutoML
  • 视觉·多模态
  • NLP·大模型
    • CPAL2026
      • The Curse of Depth in Large Language Models
  • 可信·可解释
  • 数据为中心·特征
  • 边缘·网页·服务
  • 领域应用
🏅我的成就
学习/AI论文/模型优化·轻量化/Chapter 1: PolarQuant: Quantizing KV Caches with Polar Transformation

Chapter 1: PolarQuant: Quantizing KV Caches with Polar Transformation

在长上下文 LLM 服务里,真正先爆掉的往往不是参数,而是 KV cache 内存。PolarQuant 直接瞄准这个瓶颈:先做随机预处理,再把向量改写成极坐标形式,把角度紧凑地存下来,从而少背那种 「如何把短码还原成原数」的附加信息。本文会从公式、直觉和工程意义三条线把它讲清楚。
PDF查看原论文 PDF↗
[摘要与引言] 3 行总结 + 问题提出
3 行总结
- 长上下文 LLM 必须缓存历史 token 的 Key 和 Value,因此 KV cache 会成为真正的 VRAM 瓶颈。
- 老办法: 即便把数压得很短,每个块通常还要附带「如何把短码映射回原始范围」的辅助数字。这些辅助信息往往用 高精度(例如 FP16) 另存,所以 显存未必省得像你想的那么多。
- PolarQuant 先随机打散,再转到极坐标,紧凑地保存角度。不那么依赖那层 沉重的附加说明 后,仍可实现 4.2 倍以上 缓存压缩与强长上下文质量。
比喻
传统方法像是把仓库里的箱子缩小了,但每个箱子仍要贴一张很重的标签。PolarQuant 更像先把货物充分混匀,再只记一个半径和方向信息,辅助标签自然就轻得多。
用大白话讲
- 两难: 不只把数字压小——每个块还要贴 说明书(元数据),用 FP16 存 scale、zero-point 等,容易出现 包装比东西还重 的情况。
- PolarQuant 的做法: 不用轴坐标堆数字,而存 一个半径 rrr(整体大小) 和 若干角度(方向);其余信息变成“往哪边倾”。
- 搅拌机(SSS)与 45∘45^\circ45∘: 进极坐标 之前 先随机混匀,大块对半切时 前后能量 往往更接近,用比例算角度时容易落在 π/4\pi/4π/4(45∘45^\circ45∘)附近。知道角度 常落在窄区间,就能用 很少比特 做角度量化。
- 论文里提到的结果: KV 缓存 4.2 倍以上 压缩、约 104K 超长上下文下 needle 类任务仍强、离线码本 可把 Prefill 大幅缩短(论文中约 11.6 秒 vs 3.4 秒 等)。
一句话: 利用混匀后角度 可预测地集中 的结构,大幅压低「还原用的附加负担」。
[背景知识] 必要基础概念
先搞懂这些 — 读正文之前
- 浮点数(FP32 与 FP16)
神经网络中间激活一般用 浮点数 存。FP32 是 32 位单精度;FP16 是 半精度,每个数只占 FP32 大约一半比特,所以 同样多格子里大致能省一半显存,但可表示的刻度会略粗。文中说「KV 用 FP16 保存」多指 未压缩时的基准格式是 16 位浮点。
- 量化(quantization)是什么
把连续实数 映射到很少几种整数码(例如 4 比特只有 24=162^4=1624=16 个档位),像用 刻度很粗的尺子量长度。常见目的是 省显存、有时也加速计算;用的时候再 反量化 成近似实数。通常还需要 辅助数(scale、zero-point 等)说明 短码对应原始哪个范围。
- 为什么 INT4 和 FP16 会一起出现
主体数值可以压成 INT4,但 每个块如何解码、映射回原范围 的规则往往用 FP16 这类更宽、更精的格式 另存。这些 附加信息 会吃掉不少收益。下文说明 PolarQuant 如何减轻这一层。

下面每条都写了 定义,并点出它在 PolarQuant 里 到底在解决什么问题。
- KV cache:自回归生成时缓存过去的 Key 和 Value,用来避免重复计算。
在此处的含义: 后文向量 xxx 更接近 缓存里的激活,不是模型权重;方法改的是 缓存表示,不是注意力公式本身。
- 量化开销 要把值压成 很短的整数,通常每个块还需要 「把短码对齐回原范围」的辅助数字(论文/代码里常叫 scale、zero-point 等)。若这些辅助数 逐块 且 高精度 保存,就会带来隐藏成本。
在此处的含义: 「比特降了显存没降」往往因为 这些辅助数字跟着堆。PolarQuant 通过换坐标来减轻这一层。
- 极坐标:把原始坐标改写为半径和角度。PolarQuant 将这个思想递归扩展到高维。
在此处的含义: 用 一个整体尺度(半径)+ 多个方向(角度) 拆分信息,为 紧凑地存角度、少背旧的逐块缩放模式留空间。
- 随机预处理:用随机矩阵把坐标打散,让分布更接近高斯、也更容易分析。
在此处的含义: SSS 不是摆设,而是让后续 用分布论设计角度码本 说得通的关键步骤。
- 集中现象:高维中某些角度会高度集中,因此非常适合用少量比特编码。
在此处的含义: “角度概率质量集中在哪”几乎就等于 能用多粗的码本——越集中越省比特。
生活化理解: KV 缓存是记住长对话的 过往 token 仓库;量化是把仓库里的数压小。但若每个块还要贴 「怎么把短码解码回去」的便签,便签可能比货还占地方。
【方法】核心公式详解
PolarQuant 要回答的是:随机混合后的向量换成极坐标后,哪部分信息最便宜、最好量化。
阅读本节的顺序(路线图)
不必背下每一个符号,抓住流程即可;卡住的段落可以跳过。
1. 用 SSS 混匀 — 减轻坐标“只贴在少数轴上”,方便后面按角度分开分析、量化。
2. 分层取角 — Level 1 看相邻两维的方向;更高层看更大左/右半块的能量比,一层一个角。
3. 联合密度可分解 — 半径与各层角度近似独立,工程上可分开设计码本。
4. 角往 π/4\pi/4π/4 挤 — 常见角落在窄区间就省比特。
5. 存角 → 还原向量 → 原注意力 — 注意力公式不变。
减负提示:
(4) (5) 的指数、归一化常数可略读;记住“概率质量集中在 π/4\pi/4π/4 附近”即可把握主旨。

1)随机预处理:为何 SxSxSx 近似各向同性高斯
先讲直觉: Sx∼N(⋯ )Sx \sim \mathcal{N}(\cdots)Sx∼N(⋯) 是分析用的近似图:各分量起伏程度相近、可近似独立处理,从而便于按角度分别量化。真实张量不必处处严格高斯。
对 x∈Rdx \in \mathbb{R}^{d}x∈Rd 左乘 S∈Rm×dS \in \mathbb{R}^{m \times d}S∈Rm×d:
Sx∼N(0,∥x∥22Im)Sx \sim \mathcal{N}(0, \|x\|_2^2 I_m)Sx∼N(0,∥x∥22​Im​)
一句话: SxSxSx 的每个分量独立,均值为 0,方差为 ∥x∥22\|x\|_2^2∥x∥22​。
符号表
  • 符号xxx
  • 含义待量化的 KV 向量
  • 符号ddd
  • 含义原维度
  • 符号SSS
  • 含义随机预处理(草图)矩阵
  • 符号mmm
  • 含义草图后维度
  • 符号ImI_mIm​
  • 含义mmm 维单位阵
  • 符号∥x∥2\|x\|_2∥x∥2​
  • 含义欧氏范数
符号含义
xxx待量化的 KV 向量
ddd原维度
SSS随机预处理(草图)矩阵
mmm草图后维度
ImI_mIm​mmm 维单位阵
∥x∥2\|x\|_2∥x∥2​欧氏范数
这层写法在说什么: ∼N(⋅)\sim\mathcal{N}(\cdot)∼N(⋅) 表示“把 SxSxSx 当作 各向同性、分量近似独立 的随机向量来分析”。目的不是咬死“永远严格高斯”,而是让 按角度分别量化 时不必先处理复杂的坐标间耦合。
直觉: 混匀后不必为每个坐标单独存 scale;用 半径 + 角度 更自然。

2)Level 1:相邻两维成角
先讲直觉: 与平面向量 (a,b)(a,b)(a,b) 用 tan⁡−1(b/a)\tan^{-1}(b/a)tan−1(b/a) 取倾角一样;这里先抽方向,长度留到后面用范数处理。两两配对得到 d/2d/2d/2 个小角。
ψj(1):=tan⁡−1 ⁣(x2jx2j−1)\psi_j^{(1)} := \tan^{-1}\!\left(\frac{x_{2j}}{x_{2j-1}}\right)ψj(1)​:=tan−1(x2j−1​x2j​​)
即二维向量 (x2j−1,x2j)(x_{2j-1}, x_{2j})(x2j−1​,x2j​) 的方位角。
含义: 先把 相邻两维的“朝向” 抽成 ψ(1)\psi^{(1)}ψ(1),全局长度稍后再用范数在各层比较;相当于“先记局部方向,再记更大块的左右平衡”。

3)Level ℓ≥2\ell \ge 2ℓ≥2:左右子块范数之比
先讲直觉: 把一段坐标切成左半 / 右半,用右半范数 / 左半范数再套 tan⁡−1\tan^{-1}tan−1。比 ≈1\approx 1≈1 表示两边能量接近 → 角落在 π/4\pi/4π/4 附近;ℓ\ellℓ 越大,比较的块越大。
分子是右半段块的 ℓ2\ell_2ℓ2​ 范数,分母是左半段块。比值接近 1 时,tan⁡−1\tan^{-1}tan−1 接近 π/4\pi/4π/4,这就是高阶角度 向 45° 集中 的来源。

4)联合密度分解
先讲直觉: 联合密度写成乘积,意味着半径与各层角度近似可分开讨论——不必把所有角绑在一个巨型联合量化器里一次性优化。
fR,Ψd(r,ψd(x))=fR(r)∏ℓ=1log⁡2dfΨ(ℓ) ⁣(ψ(ℓ))f_{R,\Psi_d}(r, \psi_d(x)) = f_R(r) \prod_{\ell=1}^{\log_2 d} f_{\Psi^{(\ell)}}\!\left(\psi^{(\ell)}\right)fR,Ψd​​(r,ψd​(x))=fR​(r)ℓ=1∏log2​d​fΨ(ℓ)​(ψ(ℓ))
半径与各层角度 独立 → 可把角度当成 一维量化 问题分别处理。
分解式在说什么: 联合密度写成乘积,相当于 “定半径”与“定各层角度” 在概率上可分开讨论,工程上便于 半径一份、角度码本若干份 地设计,而不是一个巨型耦合量化器。

5)ℓ≥2\ell \ge 2ℓ≥2 的角度边缘密度
先讲直觉: 问的是“角 ψ\psiψ 最可能出现在哪”。sin⁡(2ψ)\sin(2\psi)sin(2ψ) 在 ψ=π/4\psi=\pi/4ψ=π/4 最大;外面再套高次幂就像滤镜,把概率挤到 45° 附近的窄带 → 少比特也够用。
fℓ(ψi(ℓ))∝sin⁡2ℓ−1−1(2ψi(ℓ))f_{\ell}(\psi_i^{(\ell)}) \propto \sin^{2^{\ell-1}-1}(2\psi_i^{(\ell)})fℓ​(ψi(ℓ)​)∝sin2ℓ−1−1(2ψi(ℓ)​)
(前有归一化常数。)sin⁡(2ψ)\sin(2\psi)sin(2ψ) 在 ψ=π/4\psi=\pi/4ψ=π/4 最大,高次幂把概率质量 压到窄区间,利于低比特码本。

6)角度量化目标(类 K-means)
先讲直觉: 在数轴上放若干代表角(码本),把真实角就近舍入——典型的一维量化;bbb 比特对应 2b2^b2b 个区间。
Eψi(ℓ)∼fℓ[∑j∈[2b]:ψi(ℓ)∈Ij(ℓ)∣ψi(ℓ)−θj(ℓ)∣2]\mathbb{E}_{\psi_i^{(\ell)} \sim f_{\ell}} \left[ \sum_{j \in [2^b] : \psi_i^{(\ell)} \in I_j^{(\ell)}} \left| \psi_i^{(\ell)} - \theta_j^{(\ell)} \right|^2 \right]Eψi(ℓ)​∼fℓ​​​j∈[2b]:ψi(ℓ)​∈Ij(ℓ)​∑​​ψi(ℓ)​−θj(ℓ)​​2​
其中 bbb 为每个角度分配比特数(共 2b2^b2b 个区间),Ij(ℓ)I_j^{(\ell)}Ij(ℓ)​ 为区间,θj(ℓ)\theta_j^{(\ell)}θj(ℓ)​ 为质心(码本代表值)。

7)均方误差与相对误差
先讲直觉: 向量大时绝对误差也可稍大,因此用相对承诺:误差与 ∥x∥22\|x\|_2^2∥x∥22​ 成比例;ε\varepsilonε 越小越好。
E[∥x−x′∥22]=ε∥x∥22\mathbb{E}\left[\|x - x'\|_2^2\right] = \varepsilon \|x\|_2^2E[∥x−x′∥22​]=ε∥x∥22​

8)由半径与角度还原坐标
先讲直觉: 坐标 iii 对应二分树上的一条路径;每层乘 cos⁡ψ\cos\psicosψ 或 sin⁡ψ\sin\psisinψ,整体再乘 ∥x∥2\|x\|_2∥x∥2​。细节索引不必死记。
公式与论文一致:用 ∥x∥2\|x\|_2∥x∥2​ 与各级 ψ(ℓ)\psi^{(\ell)}ψ(ℓ),通过 cos⁡/sin⁡\cos/\sincos/sin 与指示函数逐层还原 xix_ixi​。

9)注意力不变
先讲直觉: K^,V^\hat{K},\hat{V}K^,V^ 是解压后的缓存;softmax、d\sqrt{d}d​ 缩放与训练时同一套式子,只换张量内容。
softmax⁡ ⁣(K^:i⋅qid)V^:i\operatorname{softmax}\!\left(\frac{\hat{K}_{:i} \cdot q_i}{\sqrt{d}}\right) \hat{V}_{:i}softmax(d​K^:i​⋅qi​​)V^:i​
只改 缓存表示与反量化,不改注意力结构。
【玩具推演】整数示例
用具体数字把 Level 1 → Level 2 → π/4\pi/4π/4 走一遍;比背符号更有用。
设 x=(3,4,4,3)x=(3,4,4,3)x=(3,4,4,3)。为便于手算,取整数预处理向量 x′=(3,4,4,3)x'=(3,4,4,3)x′=(3,4,4,3)(实际 SxSxSx 多为非整数)。
为何令 xxx 与 x′x'x′ 相同: 真实流程里 x′=Sxx'=Sxx′=Sx 会改变数值;此处只为 算范数与比值时数字整齐,算法步骤不变。
Level 1
ψ1(1)=tan⁡−1(4/3),ψ2(1)=tan⁡−1(3/4)\psi_1^{ (1) } = \tan^{-1}(4/3),\quad \psi_2^{ (1) } = \tan^{-1}(3/4)ψ1(1)​=tan−1(4/3),ψ2(1)​=tan−1(3/4)
约 0.930.930.93 rad 与 0.640.640.64 rad,远离 0°/90° 极端。
Level 2
∥x1:2′∥2=32+42=5,∥x3:4′∥2=42+32=5\|x'_{1:2}\|_2 = \sqrt{3^2+4^2}=5,\quad \|x'_{3:4}\|_2 = \sqrt{4^2+3^2}=5∥x1:2′​∥2​=32+42​=5,∥x3:4′​∥2​=42+32​=5
比值为 111,故 ψ1(2)=tan⁡−1(1)=π/4\psi_1^{ (2) }=\tan^{-1} (1) =\pi/4ψ1(2)​=tan−1(1)=π/4。3–4–5 使两半块范数相等,本例中上级角恰好为 π/4\pi/4π/4。随后对角度做码本量化,将 K^,V^\hat{K},\hat{V}K^,V^ 代入标准注意力。
[实验与实现] 从公式到 PyTorch、CUDA 与基准测试
读论文时,公式再漂亮也会落到同一个问题:代码怎么写、数字到底怎样? PolarQuant 的作者没有把想法停在黑板上,而是在 Llama-3.1 等真实模型上做了苛刻评测。下面从实现细节到四项核心实验串起来看。

1. 硬件与实现
把数学变成可运行代码,是可复现性的第一步。
- 硬件: 全部实验在单卡 NVIDIA RTX A6000(48GB VRAM)上完成。
- 框架与数据类型: PyTorch 实现;量化后的角度索引用最小的 8 位整型(torch.uint8)做 packing 存储。
- 自定义 CUDA 核: 为 query × 反量化 Key 缓存、注意力分数 × 反量化 Value 缓存等关键乘法编写专用 CUDA 核以加速。
- 共享预处理矩阵 SSS: 随机预处理用的矩阵 SSS 在 K/V 嵌入、所有层、所有注意力头之间共享同一套。
- 两种码本策略: 角度量化使用 一维 k-means++。
- 在线: 每个 prompt 现场算角度并实时聚类(像每单现调酱料)。
- 离线: 预先算好角度分布码本,所有 prompt 复用(像预制万能酱料)。

2. 实验 1:角度分布是否在真实数据上也“好看”
检验理论里的角度分布假设在真实 KV上是否成立。
- 设置: 从 LongBench 的 Qasper 抽 prompt,提取 KV,再做 L=4L=4L=4 层极坐标变换。
- 结果: 不做随机预处理时角度较散;做了预处理后离群减弱,越高阶的角度越尖锐地集中在 π/4\pi/4π/4 附近,并在真实数据上得到展示。

3. 实验 2:Needle-In-A-Haystack(极限上下文)
强压缩后还能不能找回关键信息——著名的“草垛寻针”。
- 设置: Llama-3.1-8B-Instruct,输入长度从 4K 拉到 104K。
- 公平显存: 与 SnapKV、PyramidKV、KIVI 等对比时,把所有方法的 KV 统一压到原缓存的 25%(压缩率 0.25)。
- 结果: 以删 token省内存的方法更容易漏信息;PolarQuant 超过 KIVI,recall 最接近满分表现。

4. 实验 3:LongBench(通用长文本)
- 设置: LongBench-V1。注意:论文写明,为保精度,新生成 token 的缓存仍用 FP16。
- 结果: 未压缩(Exact)平均 48.63,PolarQuant-R(在线) 48.37,几乎持平;并报告高于 KIVI(46.70)、SnapKV(44.57)。

5. 实验 4:运行时间
- 设置: 输入 16384 token,生成 1024 token,测总耗时。
- 解码: 生成阶段比 KIVI 快约 14%(论文报告)。
- Prefill: 在线码本约 11.633 秒,离线约 3.364 秒;聚类成本差异大。质量差距不大时,作者强烈建议为速度选离线码本。

一句话: PolarQuant 不是“只写在纸上”,而是在 PyTorch + CUDA + 真模型上,把分布—极限上下文—通用基准—速度串成闭环验证过的工作。
直观理解: 这些数字体现的是 精细压缩 保住信息,而不是靠 删 token 硬撑。离线码本像 预先印好的角度表,比每个 prompt 现聚类的 在线 方式 Prefill 快得多,对落地更关键。
[结论与局限]
实践价值
1. 它打破了“量化一定要保存正则化元数据”的惯性思路。
2. 它直接命中长上下文服务最痛的内存热点。
3. 它不改 attention 结构,只改 cache 表示方式。
局限
- codebook 构造仍有进一步解析化改进空间。
- 是否能同样有效迁移到权重或 activation 量化,还需要更多证据。
- 真正部署时仍依赖高效 kernel、packing 和工程实现。
[图示规划] 强对比可视化
左侧画传统 block 量化:每个 block 都背着 用于还原存储值的额外辅助数字。右侧画 PolarQuant:随机预处理后,只保留一个半径和若干集中在 45∘45^\circ45∘ 附近的角度。

KV 存储对照

传统:每块 FP16 元数据叠加;PolarQuant:半径与角度。

分块量化

每个块仍需要 **把短码还原成可用数值的辅助数字**,所以即便数值看起来被压缩了,开销仍在。
KVINT4+metaFP16× N+FP16 元数据 / 块元数据负担 ↑

PolarQuant

随机预处理后转为极坐标,只量化集中分布的角度。
KVSrθcodebookr + θ codebook占用 ↓

图中符号怎么读

FP16
半精度浮点数(16 位)。比特数约为 FP32 的一半,同样多格子大致省一半显存,但刻度略粗。
量化
把连续实数 映射成很短的整数码 以省空间;使用时要 反量化,且常需 按块说明范围的辅助数。
KV
保存过去 token 的 Key/Value 向量的一整块缓存。
INT4
把数值压成 4 位整数;要还原通常还需要额外信息。
+meta / FP16
把短码还原到可用尺度所需的 额外数字;通常 高精度(如 FP16) 另存。
× N
块越多,这类元数据大致也要跟存 N 份。
S
随机混洗坐标的预处理矩阵,便于后面做极坐标变换。
r
极坐标里的半径,即向量整体长度。
θ
角度(方向)。往往用码本序号存,而不是完整浮点。
codebook
常见角度的候选表,只存索引就能省比特。
PolarQuant 的优雅之处在于它换了一个坐标系来处理问题。与其在原始坐标上硬做裁剪,不如先把向量拆成长度与方向,再利用角度集中现象去压缩。对于真正受 KV cache 限制的系统,这比单纯谈参数量更有现实价值。