Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Optimal Power Quantization (OPQ)

A Generalized Nonlinear Quantization Framework for Large Language Models

从 "10000 = 100²" 到 "开几次方最优" 的完整研究脉络 —— 以算代存的深度学习版本。

OPQ 是一种基于可调幂次变换的非线性量化框架。核心思想源于一个朴素直觉:10000 = 100² 可以用一次平方运算代替存储大数。OPQ 将这一思想推广到任意幂次 α,并系统性地找到了每个比特宽度下的最优值。


目录


核心贡献

  1. 通用框架:将固定平方根量化(Sqrt)推广为带可调参数 α 的 OPQ 框架
  2. 经验公式:给出 α*(b) ≈ 0.1/(b+3.3) + 0.462,覆盖 3~8 bit
  3. 工程验证α = 0.4(开 2.5 次方)达到 99.9% 最优性能,计算友好
  4. 理论解释:从高斯变换分布的角度解释了为何 α* ≈ 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 高阶根对比实验

快速开始

1. 编译论文

cd OPQ_Paper
pdflatex opq_full_paper.tex
bibtex opq_full_paper      # 如有参考文献
pdflatex opq_full_paper.tex
pdflatex opq_full_paper.tex

2. 运行核心实验

cd code
python opq_sweep.py                 # 网格搜索,约 30 秒
python opq_generate_all_figures.py  # 生成全部图表

3. 最小使用示例(OPQ 量化)

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)

$$W_q = \text{sign}(W) \cdot \text{Round}\left( \frac{|W|^\alpha}{\epsilon^\alpha} \cdot s \right)$$

反量化(Decoding)

$$\hat{W} = \text{sign}(W_q) \cdot \left( \frac{\text{Abs}(W_q)}{s} \right)^{1/\alpha} \cdot \epsilon$$

其中:

  • α ∈ (0, 1) 为幂次参数(本文核心研究对象)
  • ε = 1.00001 为防零常数
  • s = (2^(b-1)-1) / (1/ε)^α 为缩放因子
  • b 为总比特数,符号占 1-bit,幅值占 b-1 bits

依赖

Pythonnumpymatplotlibscipy

LaTeXarticle 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 中的 authoryear 等字段请在正式发表后替换为官方元数据。


License

本项目仅供学术研究使用。如需商用,请联系作者。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages