自注意力机制 20 年了,我们终于让它学会"压缩记忆"

一个 8KB 的参数,让 7B 大模型推理速度提升 4 倍,内存压缩 248 倍


问题:Attention 跑不了长序列

Transformer 的自注意力机制有个根本性问题:

r 复制代码
A_ij = exp(q_i^T k_j / √d) / Σ_l exp(q_i^T k_l / √d)

序列长度 n 翻倍 → 计算量翻 4 倍,KV Cache 也翻 4 倍。

一个 7B 模型处理 4K 序列,KV Cache 就要占 168MB;处理 64K 序列,需要 2GB+ ,普通笔记本根本跑不动。

20 年来,大家一直在想办法绕开这个 O(n²):

  • FlashAttention:优化 I/O 路径,不改变复杂度
  • MQA/GQA:多查询/分组查询注意力,共享 K/V
  • 稀疏注意力:预设稀疏模式,灵活度差
  • Mamba/RWKV:线性复杂度,但效果有差距

我们的思路不同:不是近似,而是"聪明地压缩"。


我们的方案:Signal Field Attention

想象你听一个人说话:

  • 刚刚说的(近场),你听得清清楚楚
  • 很久之前说的(远场),你记住了大概意思,不需要一字不差

SFA 就是让 LLM 学会这个机制:

双通道架构

scss 复制代码
                    ┌─────────────────────────┐
输入 Q_t  ───────→ │  SFA 注意力机制          │
                    │                         │
              ┌─────┴─────┐                   │
              │ 近场通道   │──→ softmax(k个token)───→ O_near
              │ 精确计算   │                   │
              └───────────┘                   │
         (最近 k 个 token,精确计算)            │
                                              │
              ┌───────────┐                   │
              │ 远场通道   │──→ EWMA 压缩状态 ──→ α · S_far
              │ 压缩存储   │                   │
              └───────────┘                   │
         (历史所有 token 的加权平均)           │
                                              │
              ┌─────────────────────────┐    │
              │  融合: O = O_near + α·S_far  │
              └─────────────────────────┘    │
                                            ↓
                                          输出

近场通道:对最近的 k 个 token 做标准 softmax 注意力(精确)

远场通道 :用 EWMA(指数加权移动平均) 压缩历史 KV 到固定大小的状态 S

融合:两个通道的输出加权求和

核心公式

ini 复制代码
S_t = γ · S_{t-1} + (1-γ) · mean(K_hist)

O = O_near + α · S_far
  • γ ∈ (0,1):衰变因子,控制"记忆"多远
  • α:可学习混合系数

整个 SFA 只需要约 8KB 的可学习参数。


实验结果(直接上图数据)

推理加速:4.16 倍

在 Qwen2.5-7B-Instruct (4-bit) 上的测试结果:

序列长度 标准注意力 SFA 加速比
128 tokens 45ms 12ms 3.75×
1,024 tokens 720ms 173ms 4.16×
4,096 tokens 11,520ms 2,769ms 4.16×

关键发现:序列越长,加速越稳定。

内存压缩:248 倍

序列长度 标准 KV Cache SFA KV Cache 压缩比
1,024 168 MB 4.2 MB 40×
4,096 672 MB 8.6 MB 78×
8,192 2.1 GB 8.6 MB 248×

到了 64K 序列,标准注意力内存溢出,SFA 正常运行。

困惑度:甚至更好!

在 Qwen2.5-0.5B 上,替换 3 个层做蒸馏训练后:

原始 PPL SFA PPL 变化
第 0 层(浅层) 22.375 23.062 +3.07%
第 11 层(中层) 22.375 22.255 -0.57%
第 23 层(深层) 22.375 20.011 -10.57%

深层反而更好了! 因为我们压缩掉的是冗余的语法细节,保留的是高层语义。

训练成本

指标 数值
额外参数 8.1 KB
训练步数 < 800 步
训练时间 < 2 分钟
显存占用 ~200 MB

为什么深层效果更好?

这其实有一个理论直觉:

  • 浅层编码语法、词法细节 → 这些需要精确信息 → 压缩损失大
  • 深层编码语义、抽象概念 → 这些信息天然可压缩 → 压缩后反而更鲁棒

这和其他论文的观察一致:Transformer 的深层表示更"语义化"、更"抽象"。


和 LoRA 的对比

LoRA SFA
目的 微调 推理加速
额外参数 0.1-1% 模型大小 ~8KB
推理加速 4.16×
内存节省 248×
训练数据 需要任务数据 从基础模型蒸馏

两者不冲突,甚至可以组合使用。


局限性(说实话)

  1. 蒸馏训练能获得最优效果(虽然训练超快)
  2. 浅层有 ~3% 的 PPL 退化
  3. 目前只在自回归语言建模上测试过
  4. 最佳压缩窗口 k 可能因模型而异

我们做了什么

完整的技术栈

bash 复制代码
qn1-experiments/
├── 01-signal-field/     # SFA 核心算法(纯 Python)
├── 02-huayue/           # 混合架构探索
├── 03-guiyuan/          # 增量推理:预填/解码分离
├── 04-lingya/           # 正交基微调
├── 05-ring-buffer/      # 环形缓冲区 KV Cache
├── 06-rca/              # 频域注意力
├── 07-metal-kernel/     # Metal 加速内核
├── 08-ultra/            # 极致部署优化
├── src/                 # MLX 完整模型实现
│   ├── taicu_sf_v2.py           # SFA 完整替换
│   ├── taicu_0.5b_distill.py    # 0.5B 蒸馏
│   ├── taicu_7b_benchmark.py    # 7B 基准测试
│   └── ...
├── LICENSE              # MIT
└── TECHNICAL_REPORT.md  # 论文

特性

  • 纯 Python 实验01-08- 目录):零依赖,任何平台可跑
  • MLX 完整实现src/ 目录):Apple Silicon 原生加速
  • MIT 开源:可以商用
  • 论文:完整技术报告 + 参考文献

一键运行

bash 复制代码
cd 01-signal-field
python test_signal_field.py  # 验证 SFA 原理

cd src
python taicu_sf_v2.py        # 7B 模型完整推理

python ../run_all.py         # 运行所有实验

给 SFA 点个赞

代码全开源,MIT 协议:

github.com/CN-QN1-dali...

如果你也在做高效 LLM 推理、长序列处理、或者 Attention 的优化------这个方案值得一试。

8KB 的改动,4 倍的速度,248 倍的内存压缩。

这或许就是"让 AI 学会压缩记忆"的第一步。


本文代码和论文同步开源。欢迎 fork、PR、讨论。

相关推荐
OpenTiny社区11 小时前
从零开发 AI 聊天页要两周?试试这款 Vue3 垂直对话组件库 TinyRobot,直接开箱即用
前端·vue.js·github
逛逛GitHub11 小时前
2 万多 Star!Google 开源了这个神级 GitHub 项目。
github
逛逛GitHub13 小时前
免费 Token 烧掉 5 万亿之后,他们出了个一站式创作平台。
github
用户8055336980314 小时前
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
linux·github·嵌入式
inhere14 小时前
eget:不用等中央仓库,直接安装 GitHub 和任意下载站的工具
程序员·开源·github
YuePeng1 天前
写了五年注解的低代码框架,2.0 决定让你连注解都不用写了
github·产品
小白ai1 天前
从"能 ping 通吗"到"为什么上不了网"——我写了一个网络故障诊断引擎
github
徐小夕1 天前
jitword 协同文档3.2发布:打造浏览器中最强word编辑器
前端·架构·github
齐翊2 天前
分享一个在 Claude Code 里 [同时] 用多个 ApiKey 的方法
程序员·github·agent
A_Lonely_Cat2 天前
记一次 GitHub 幽灵协作者大清洗:强制重写 Git 历史与穿透 CDN 缓存实践
git·github