A Generalized Nonlinear Quantization Framework for Large Language Models
从 "10000 = 100²" 到 "开几次方最优" 的完整研究脉络 —— 以算代存的深度学习版本。
OPQ 是一种基于可调幂次变换的非线性量化框架。核心思想源于一个朴素直觉:10000 = 100² 可以用一次平方运算代替存储大数。OPQ 将这一思想推广到任意幂次 α,并系统性地找到了每个比特宽度下的最优值。
- 通用框架:将固定平方根量化(Sqrt)推广为带可调参数
α的 OPQ 框架 - 经验公式:给出
α*(b) ≈ 0.1/(b+3.3) + 0.462,覆盖 3~8 bit - 工程验证:
α = 0.4(开 2.5 次方)达到 99.9% 最优性能,计算友好 - 理论解释:从高斯变换分布的角度解释了为何
α* ≈ 0.45
OPQ_Paper/
├── opq_full_paper.tex ← 完整论文 LaTeX 源文件(6 章)
├── opq_paper_section.tex ← 核心章节(OPQ 理论)单独版
├── README.md ← 本文件
│
├── figures/ ← 全部图表
│ ├── opq_master_figure.png ← 综合大图(6 子图,论文 Figure 1)
│ ├── opq_fig_a.png ← Bit-width vs α*
│ ├── opq_fig_b.png ← 4-bit MSE vs α(平坦最优区)
│ ├── opq_fig_d.png ← 小值区重建曲线对比
│ ├── fig1_bit_vs_alpha.png ← 比特 vs 最优幂次
│ ├── fig2_4bit_fine.png ← 4-bit 精细搜索
│ ├── fig3_summary.png ← 综合汇总图
│ ├── opq_alpha_fit.png ← 闭式公式拟合
│ ├── opq_mse_curves.png ← 各 bit MSE 曲线
│ ├── ssrq_comparison.png ← 8-bit SSRQ vs Linear
│ └── ssrq_higher_root_comparison.png ← 4-bit 高阶根对比
│
└── code/ ← 全部可运行 Python 脚本
├── opq_sweep.py ← 网格搜索最优 α*(核心实验)
├── opq_final_plots.py ← 论文图表生成
├── opq_generate_all_figures.py ← 综合大图生成
├── ssrq_table.py ← 8-bit 误差对照表
└── ssrq_higher_root.py ← 4-bit 高阶根对比实验
cd OPQ_Paper
pdflatex opq_full_paper.tex
bibtex opq_full_paper # 如有参考文献
pdflatex opq_full_paper.tex
pdflatex opq_full_paper.texcd code
python opq_sweep.py # 网格搜索,约 30 秒
python opq_generate_all_figures.py # 生成全部图表import numpy as np
class OPQuantizer:
def __init__(self, bits=4, alpha=0.45):
self.bits = bits
self.alpha = alpha
self.mag_levels = 1 << (bits - 1)
self.epsilon = 1.00001
def calibrate(self, weight):
max_val = np.max(np.abs(weight))
self.scale = (self.mag_levels - 1) / np.power(max_val / self.epsilon, self.alpha)
def quantize(self, weight):
mag = np.abs(weight)
transformed = np.power(mag / self.epsilon, self.alpha) * self.scale
q_mag = np.clip(np.round(transformed), 0, self.mag_levels - 1)
sign_bit = (weight < 0).astype(np.int64) << (self.bits - 1)
return (q_mag.astype(np.int64) | sign_bit).astype(np.uint8)
def dequantize(self, q):
sign_bit_val = 1 << (self.bits - 1)
sign = np.where((q & sign_bit_val) != 0, -1.0, 1.0)
q_mag = (q & (sign_bit_val - 1)).astype(np.float64)
return sign * np.power(q_mag / self.scale, 1.0 / self.alpha) * self.epsilon
# 推荐配置快速查表
CONFIGS = {3: 0.49, 4: 0.45, 5: 0.45, 6: 0.45, 8: 0.47}
bits = 4
q = OPQuantizer(bits=bits, alpha=CONFIGS[bits])
q.calibrate(weight)
w_q = q.quantize(weight)
w_hat = q.dequantize(w_q)
mse = np.mean((weight - w_hat) ** 2)| Bits | Levels | α* | 推理反变换 |
|---|---|---|---|
| 2-bit | 2 | 0.89 | y^1.12 |
| 3-bit | 4 | 0.49 | y^2.04 |
| 4-bit | 8 | 0.45 | y^2.22 |
| 5-bit | 16 | 0.45 | y^2.22 |
| 6-bit | 32 | 0.45 | y^2.22 |
| 8-bit | 128 | 0.47 | y^2.13 |
闭式公式:α*(b) ≈ 0.1/(b+3.3) + 0.462
关键发现:
b ≥ 4时α* ≈ 0.45几乎不变,只需记一个常数即可覆盖所有主流量化场景。
| Step | 内容 | 产出 |
|---|---|---|
| 1 | 10000 = 100² → 以算代存的基本直觉 |
— |
| 2 | 归一化 + sqrt 变换 → 发现小值精度提升 | ssrq_table.py |
| 3 | 带符号的 sqrt 量化 (SSRQ) → 完整方案 | ssrq_comparison.png |
| 4 | 4-bit 下试开 3 次 / 4 次根 → 发现 Cbrt 过冲 | ssrq_higher_root.py |
| 5 | "可以开 2.5 次方呀" → α=0.4 的洞察 |
— |
| 6 | 网格搜索全部 bit × α → 找到 α*=0.45 |
opq_sweep.py |
| 7 | 拟合闭式公式 → OPQ 通用框架 | opq_alpha_fit.png |
每个 Step 都有对应的 .py 脚本和 .png 图表可追溯。
量化(Encoding):
反量化(Decoding):
其中:
α ∈ (0, 1)为幂次参数(本文核心研究对象)ε = 1.00001为防零常数s = (2^(b-1)-1) / (1/ε)^α为缩放因子b为总比特数,符号占 1-bit,幅值占b-1bits
Python:numpy、matplotlib、scipy
LaTeX:article class, amsmath, amssymb, graphicx, booktabs
如果本工作对您的研究有帮助,请引用:
@misc{opq2026,
author = {dfytensor},
title = {Optimal Power Quantization (OPQ): A Generalized Nonlinear Quantization Framework for Large Language Models},
year = {2026},
note = {Accessed: 2026-07-24},
howpublished = {\url{https://github.com/dfytensor/OPQ_Paper}},
}或引用本仓库的核心公式与发现:
@article{opq2026,
title = {Optimal Power Quantization: 自适应幂次量化理论},
author = {dfytensor},
journal = {Technical Report},
year = {2026},
month = {July},
note = {从实验到理论:α*(b) ≈ 0.1/(b+3.3) + 0.462}
}BibTeX 中的
author、year等字段请在正式发表后替换为官方元数据。
本项目仅供学术研究使用。如需商用,请联系作者。