Unlimited OCR 论文精读:R-SWA 如何实现一次性长文档解析

写在前面

AIGC时代的 《三年面试五年模拟》AI算法工程师/开发工程师求职面试秘籍独家资源: 【三年面试五年模拟】AI算法工程师面试秘籍

AIGC算法岗/开发岗面试面经交流社群(涵盖AI Agent 、AIGC图像创作、AI视频、LLM大模型、AI多模态、数字人、传统深度学习、具身智能等AIGC面试干货资源)欢迎大家加入:https://t.zsxq.com/hHb1C

论文标题 :Unlimited OCR Works Welcome the Era of One-shot Long-horizon Parsing

机构 :百度(Baidu Inc.)

论文链接https://arxiv.org/abs/2606.23050

HTML 版https://arxiv.org/html/2606.23050v1

开源地址https://github.com/baidu/Unlimited-OCR

类型 :Technical Report(技术报告,非 peer-review 论文)

基线模型 :DeepSeek OCR(3B 总参数,0.5B 激活 MoE)

关键词:长序列 OCR、Reference Sliding Window Attention、KV Cache、端到端文档解析、MoE


零、30 秒速览

维度 内容
解决什么问题 现有端到端 OCR 模型输出越长,KV Cache 线性膨胀,解码越来越慢,无法一次性解析整本书
核心创新 R-SWA(Reference Sliding Window Attention):视觉 token 全量可见 + 输出 token 仅看最近 n 个(默认 128)
效果 OmniDocBench v1.5 Overall 93.23% (DeepSeek OCR 87.01%,+6.22pp );可一次 forward 解析 40+ 页
效率 KV Cache 从 O ( T ) O(T) O(T) 降到 O ( L m + n ) O(L_m + n) O(Lm+n) 常数级;6K token 输出时 TPS 比 DeepSeek OCR 高 35%
训练成本 仅 200 万 PDF 数据、4000 step 继续训练,冻结 DeepEncoder,只训 LLM

一、问题背景:为什么现有 OCR 做不到"抄整本书"?

1.1 人类 vs 机器的根本差异

人类可以连续抄写数百页书、翻译数小时音频,认知负荷并不会随篇幅线性爆炸。当前 OCR 模型却做不到------没有任何现有模型能在单次 forward 中解析超过 10 页,只能 for-loop 逐页处理,每页重置记忆。

论文指出,这不是简单的"context 不够长"问题,而是工作记忆(Working Memory)机制的差异:

复制代码
人类抄书时的注意力焦点:
  ① 原书(参考源,始终可见)
  ② 刚写出的几个字(局部上下文,追踪进度)
  ③ 即将写的下一个字

  → 远端输出"软遗忘",近端上下文追踪进度
  → 不需要回顾全部已写内容

现有 for-loop OCR:
  页1 → 解析 → 丢弃状态
  页2 → 解析 → 丢弃状态
  ...
  → 外部调度器拼接,不是 AGI 级别的连续认知

1.2 端到端 OCR 的两条技术路线

路线 代表 特点 长序列瓶颈
Pipeline PaddleOCR、MinerU、MonkeyOCR 检测→裁剪→识别,启发式拼接 工程 workaround,非模型内生能力
End-to-end VLM DeepSeek OCR、dots.ocr、Nougat 单页一次 forward,LLM 解码 KV Cache 随输出长度线性增长

端到端路线中,Decoder 是成本大头:

  • 激活参数量:DeepSeek OCR 用 MoE,推理仅激活 500M
  • KV Cache :标准 MHA 下,Cache 大小 = L m + T L_m + T Lm+T(前缀 + 已生成长度), T T T 越大越慢

假设视觉 token 与文本 token 压缩比 1:10,10K 视觉 token(约 20--30 页 @1024×1024)需要 100K+ 文本 token 才能完整解码------这对 vanilla LLM OCR 是 KV 存储和注意力计算的灾难。

1.3 为什么不能用现有"高效注意力"直接套?

论文明确排除了两类替代方案:

方案 为何不适用
标准 Full Attention 每个 token attend 全部历史,KV Cache 无界增长
Linear Attention(状态转移) 视觉/reference token 也会参与 recurrent 状态更新 → 视觉特征逐步模糊,OCR 精度下降
Vanilla SWA(滑动窗口) 视觉 token 也被滑出窗口 → 丢失参考源,无法持续 OCR

R-SWA 的关键洞察:视觉 token 是静态参考,不参与状态转移;只有输出 token 做因果滑动窗口。


二、核心方法:Reference Sliding Window Attention (R-SWA)

2.1 直觉图解

图 1:每个生成 token attend 全部 reference token(视觉 token + prompt)+ 前 n 个输出 token(默认 128)。对比 Full Attention:KV Cache 恒定;对比 Vanilla SWA:视觉 token 不被滑出,避免渐进模糊。

2.2 数学形式化

对于解码第 t t t 个 token,可 attend 的位置集合为:

N ( t ) = P ∪ D n ( t ) \mathcal{N}(t) = \mathcal{P} \cup \mathcal{D}_n(t) N(t)=P∪Dn(t)

其中:

  • P = { 1 , ... , L m } \mathcal{P} = \{1, \dots, L_m\} P={1,...,Lm}:前缀段 (视觉 token + prompt),长度 L m L_m Lm,全局可见、固定不变
  • D n ( t ) = { j ∣ max ⁡ ( L m + 1 ,    L m + t − n ) ≤ j ≤ L m + t − 1 } \mathcal{D}_n(t) = \{j \mid \max(L_m+1,\; L_m+t-n) \leq j \leq L_m+t-1\} Dn(t)={j∣max(Lm+1,Lm+t−n)≤j≤Lm+t−1}:解码段 的因果滑动窗口,宽度 n n n

注意力权重:

α t j = exp ⁡ ( q t ⊤ k j / d k ) ∑ i ∈ N ( t ) exp ⁡ ( q t ⊤ k i / d k ) , j ∈ N ( t ) \alpha_{tj} = \frac{\exp(\mathbf{q}_t^\top \mathbf{k}j / \sqrt{d_k})}{\sum{i \in \mathcal{N}(t)} \exp(\mathbf{q}_t^\top \mathbf{k}_i / \sqrt{d_k})}, \quad j \in \mathcal{N}(t) αtj=∑i∈N(t)exp(qt⊤ki/dk )exp(qt⊤kj/dk ),j∈N(t)

输出: o t = ∑ j ∈ N ( t ) α t j v j \mathbf{o}t = \sum{j \in \mathcal{N}(t)} \alpha_{tj} \mathbf{v}_j ot=∑j∈N(t)αtjvj

两个窗口的含义:

  • m m m(前缀窗口)= L m L_m Lm:取决于文档页数/分辨率,与解码长度无关
  • n n n(解码窗口)= 128(默认):只保留最近 128 个输出 token 的 KV

2.3 KV Cache 管理:从线性增长到常数上界

注意力类型 KV Cache 大小 随解码长度 T T T 的变化
标准 MHA C M H A ( T ) = L m + T C_{MHA}(T) = L_m + T CMHA(T)=Lm+T 线性增长
R-SWA C R - S W A ( T ) = L m + min ⁡ ( n , T ) ≤ L m + n C_{R\text{-}SWA}(T) = L_m + \min(n, T) \leq L_m + n CR-SWA(T)=Lm+min(n,T)≤Lm+n 常数上界

Cache 压缩比:

ρ ( T ) = L m + min ⁡ ( n , T ) L m + T \rho(T) = \frac{L_m + \min(n, T)}{L_m + T} ρ(T)=Lm+TLm+min(n,T)

当 T ≫ n T \gg n T≫n 时, ρ ( T ) ≈ L m + n T → 0 \rho(T) \approx \frac{L_m + n}{T} \to 0 ρ(T)≈TLm+n→0

Concrete 例子:

  • 前缀 L m = 2560 L_m = 2560 Lm=2560(10 页 × 256 token/页)
  • 窗口 n = 128 n = 128 n=128
  • 已生成 T = 50000 T = 50000 T=50000 token

MHA Cache = 2560 + 50000 = 52560

R-SWA Cache = 2560 + 128 = 2688 (压缩 95%

实现上,KV Cache 是一个容量为 m + n m + n m+n 的队列 :每生成一个新 token,第 ( m + 1 ) (m+1) (m+1) 个位置的 KV 被驱逐。

2.4 Kernel 级验证

图 2:DeepSeek OCR 的 MHA kernel 延迟随解码步数递增;Unlimited OCR(UOW)的 R-SWA 延迟保持恒定。MHA 在 KV Cache 长度跨越对齐边界时还会出现 spike。


三、Unlimited OCR 整体架构

图 3:Encoder(DeepEncoder)+ MoE-LLM Decoder(全部 attention 替换为 R-SWA)。KV Cache 以 m + n m+n m+n 容量队列管理。

3.1 DeepEncoder(冻结,来自 DeepSeek OCR)

DeepEncoder 是长序列 OCR 的输入侧关键 ------高压缩率 = 更短的前缀 = 更小的 L m L_m Lm。

结构: SAM-ViT → 16× token 压缩 → CLIP-ViT

特性 说明
前半段 Window Attention 处理原始图像 token(低激活)
后半段 Global Attention 仅作用于压缩后 token
压缩率 1024×1024 图像 → 256 token(16× 压缩)
分辨率模式 Base(1024×1024,多页)/ Gundam(动态分辨率,单页)

为什么视觉 token 不能参与状态转移?

DeepEncoder 编码一次后,视觉 token 在整个长序列解码过程中保持静态。如果像 Linear Attention 那样对视觉 token 做 recurrent update,特征会逐步"糊掉",识别精度崩溃。

3.2 MoE-LLM Decoder(全部替换 R-SWA)

参数
总参数 3B
激活参数 500M(MoE)
Attention 所有层 MHA → R-SWA
窗口宽度 n n n 128

与 DeepSeek OCR 的唯一架构改动:Decoder 全部 attention 层换成 R-SWA。Encoder 不动。

3.3 信息如何在窗口间传递?

一个自然疑问:窗口只有 128 token,更早的输出被"遗忘"了,模型怎么知道 OCR 进度?

论文的解释是 "软遗忘 + 因果状态传递"

  • 每个新 token 仍能看到全部视觉 reference(知道"整页/整书长什么样")
  • 最近 128 个输出 token 提供局部进度锚点(类似人类"看刚写的几个字")
  • 历史信息通过窗口内的因果链式传递逐步压缩进窗口,而非直接 attend 远端

OmniDocBench 上 Text Edit ↓0.035、Table TEDS ↑5.96% 说明这种机制在单页 PDF 任务上没有精度损失,反而因 forcing model focus 而提升。


四、训练细节

4.1 数据引擎

项目 配置
总量 ~200 万 PDF OCR 样本
单页:多页 9:1
单页标注 PaddleOCR 检测 + 坐标/内容拼接,坐标归一化 0--1000
多页合成 随机拼接 2--50 页单页数据,页间用 `<
合成量多页 ~20 万条
序列长度 全部 pack 到 32K token

4.2 训练配置

项目 配置
初始化 DeepSeek OCR checkpoint
训练步数 4000 steps
Batch size 256(global)
序列长度 32K
GPU 8 × 16 A800
冻结模块 DeepEncoder(全部冻结)
训练模块 LLM(MoE)参数
优化器 AdamW
学习率 1e-4,cosine annealing
并行 DeepEP,Expert Parallelism = 4
框架 Megatron-LM
数据 packing Random packing

关键信息: 仅 200 万数据 + 4000 step 继续训练,不改 Encoder,就在 OmniDocBench 上超越 DeepSeek OCR 6.22pp------说明 R-SWA 本身对 OCR 任务是有效且几乎"免费"的改进

4.3 推理部署

  • Transformers 库:实现 R-SWA 的 KV Cache 管理
  • SGLang 推理引擎:对应优化支持
  • 两个框架均可在恒定 TPS 和 GPU 内存下运行

五、实验结果(详细拆解)

5.1 OmniDocBench v1.5:与 DeepSeek OCR 直接对比

模型 Size Overall↑ Text Edit↓ Formula CDM↑ Table TEDS↑ Table TEDS-S↑ Read-order Edit↓
DeepSeek-OCR 3B-A0.5B 87.01 0.073 83.37 84.97 88.80 0.086
DeepSeek-OCR 2 3B-A0.5B 89.17 0.049 86.85 85.60 90.06 0.060
Unlimited-OCR 3B-A0.5B 93.23 0.038 92.61 90.93 94.07 0.045
vs DeepSeek-OCR --- +6.22 -0.035 +9.24 +5.96 +5.27 -0.041

v1.5 完整榜单中的位置(节选):

模型 Size Overall↑
MinerU2-VLM 0.9B 85.56
Qwen2.5-VL 72B 87.02
Gemini-2.5 Pro --- 88.03
dots.ocr 3B 88.41
Qwen3-VL 235B 89.15
DeepSeek-OCR 2 3B-A0.5B 89.17
Unlimited-OCR 3B-A0.5B 93.23

用 3B-A0.5B 的激活参数量,Overall 93.23%,超越 235B 的 Qwen3-VL(89.15%)和 Gemini-2.5 Pro(88.03%)。

5.2 OmniDocBench v1.6:最新 SOTA 对比

模型 Size Overall↑ Text Edit↓ Formula CDM↑ Table TEDS↑
HunyuanOCR 1B 89.95 0.088 87.68 91.01
DeepSeek-OCR 2 3B-A0.5B 90.25 0.050 91.84 83.89
dots.ocr 3B 90.77 0.048 89.95 87.18
FireRed-OCR 2B 93.26 0.037 95.44 88.04
Logics-Parsing-v2 4B 93.33 0.041 95.65 88.42
Qianfan-OCR 4B 93.90 0.040 95.08 90.53
Unlimited-OCR 3B-A0.5B 93.92 0.042 95.79 90.16

v1.6 上与 Qianfan-OCR(4B,93.90%)基本持平,Formula CDM 95.79% 为最高。

5.3 九类文档子类别分析

文档类型 UOW Text Edit DS-OCR Text DS-OCR 2 Text UOW R-order DS-OCR 2 R-order
PPT 0.025 0.052 0.031 0.023 0.025
Academic Paper 0.023 0.028 0.013 0.012 0.013
Book 0.019 0.022 0.033 0.025 0.027
Colorful Textbook 0.046 0.130 0.053 0.051 0.066
Exam Paper 0.049 0.074 0.047 0.049 0.048
Magazine 0.020 0.049 0.026 0.061 0.100
Newspaper 0.081 0.131 0.139 0.134 0.176
Note 0.066 0.145 0.068 0.018 0.035
Research Report 0.008 0.015 0.008 0.013 0.011

结论:

  • 9 类文档中,UOW 在绝大多数指标上优于 DeepSeek OCR
  • 对比 DeepSeek OCR 2,7/9 的 Text Edit 和 Reading Order 指标 UOW 更优
  • 复杂版面(PPT、报纸、杂志、笔记)无劣势 → R-SWA 替换全部 MHA 是完整且合理

5.4 长序列 OCR(核心能力验证)

页数 Distinct-20↑ Distinct-35↑ Edit Distance↓
2 页 99.76% 99.87% 0.0362
5 页 99.78% 99.98% 0.0452
10 页 97.49% 99.83% 0.0526
15 页 99.92% 99.99% 0.0787
20 页 98.73% 99.89% 0.0572
40+ 页 96.08% 96.90% 0.1069
  • Distinct-n:生成文本中 unique n-gram 占比,越高说明重复/崩溃越少
  • 20 页同时输入仍保持 Edit < 0.06
  • 40+ 页 Edit 0.1069,Distinct-35 仍 96.90%
  • 40+ 页的主要错误来自 DeepEncoder Base 模式(1024×1024)下小字看不清,不是 R-SWA 在长序列中"迷失方向"

5.5 推理效率(TPS 上限对比)

Prefill 固定 10 token,理想并发条件下:

输出长度 DeepSeek OCR TPS Unlimited OCR TPS UOW 优势
256 7229.32 7229.52 ≈ 持平
512 7468.27 7714.78 +3.3%
1024 7422.50 7840.94 +5.6%
2048 7166.85 7881.11 +10.0%
4096 6430.21 7905.18 +23.0%
6144 5822.87 7847.71 +35.0%

OmniDocBench 实测:UOW 5580 TPS vs DeepSeek OCR 4951 TPS (Base 模式,512 并发),+12.7%。文档越短差距越小,输出越长优势越明显


六、R-SWA vs 其他注意力机制对比

机制 Reference 可见性 输出历史 KV Cache OCR 适用性
Full MHA 全部可见 全部可见 O ( L m + T ) O(L_m + T) O(Lm+T) 精度好,长序列不可行
Vanilla SWA 可能被滑出 最近 n 个 O ( n ) O(n) O(n) 丢失参考源,OCR 崩溃
Linear Attention 状态转移 压缩状态 O ( 1 ) O(1) O(1) 视觉特征模糊,精度降
R-SWA 始终全部可见 最近 n 个 O ( L m + n ) O(L_m + n) O(Lm+n) 长序列 + 精度兼顾

R-SWA 的本质是 "Reference-Full + Output-Sliding" 的非对称注意力,这个设计模式可推广到:

  • ASR:音频 token 为 reference,转写文本为 sliding output
  • Translation:源语言 token 为 reference,译文为 sliding output
  • 任何 reference-based long-horizon generation 任务

七、局限性与未来方向

7.1 当前局限

局限 说明
非真正 Unlimited 32K context 下 prefill 页数仍有限;页数越多 L m L_m Lm 越大
Prefill 仍是瓶颈 虽然 decode KV 恒定,但 prefill 阶段的视觉 token 数量随页数线性增长
多页分辨率受限 Base 模式 1024×1024,40+ 页小字识别下降(Encoder 限制,非 R-SWA)
仅验证了 OCR ASR/翻译等任务尚未系统验证

7.2 未来计划

  1. 短期:训练 128K context 模型,支持更多页 prefill
  2. 长期:构建 prefill pool,模型学会自动 fetch prefill KV chunks(模拟人类翻页)
  3. 扩展:R-SWA 迁移到 ASR、翻译等 reference-based 任务

八、与 DeepSeek OCR 的关系

复制代码
DeepSeek OCR                    Unlimited OCR
├── DeepEncoder (SAM+CLIP)  →  DeepEncoder(完全不变,冻结)
├── MoE LLM 3B/0.5B         →  MoE LLM 3B/0.5B(结构不变)
└── 标准 MHA Attention      →  R-SWA Attention(唯一改动)
    KV Cache: O(L_m+T)          KV Cache: O(L_m+n)
    单页 OCR ✓                  单页 OCR ✓✓(+6.22pp)
    多页 for-loop ✗             多页 one-shot ✓(40+页)

开源关系: Unlimited OCR 基于 DeepSeek OCR checkpoint 继续训练,代码和权重在 GitHub 公开。


九、工程落地建议

9.1 什么时候该用 Unlimited OCR?

场景 推荐 原因
单页 PDF/图片 OCR 可用 精度超 DeepSeek OCR,速度 +12.7%
2--20 页文档一次性解析 强烈推荐 核心能力区间,Edit < 0.08
40+ 页整本书 可用但注意分辨率 Edit ~0.11,小字可能漏
实时短文本 OCR 可选 短序列优势不明显
替代 Pipeline OCR 视需求 端到端更简洁,但 32K 有上限

9.2 部署注意事项

  • 推理框架:Transformers 或 SGLang(均已支持 R-SWA KV 管理)
  • 窗口宽度 n = 128 n=128 n=128 为默认值,调大 → 更多历史上下文但 Cache 增大
  • 多页场景用 DeepEncoder Base 模式 (1024×1024);单页高质量用 Gundam 模式
  • Prefill 长度规划:每页 ~256 visual token + 文本输出 ~2500 token/页 → 32K 约容纳 10--12 页 prefill + decode

十、核心 Takeaway

  1. 问题定义精准:长序列 OCR 的瓶颈不在 Encoder 压缩率,而在 Decoder KV Cache 的无界增长
  2. R-SWA 设计优雅:Reference 全可见 + Output 滑动窗口,避免了 Linear Attention 的视觉模糊和 Vanilla SWA 的 reference 丢失
  3. "软遗忘"符合认知科学:128 token 窗口 + 全图 reference ≈ 人类抄书的工作记忆模式
  4. 改进代价极低:冻结 Encoder、200 万数据、4000 step → +6.22pp Overall,几乎 free lunch
  5. 通用性潜力大:R-SWA 是通用 parsing attention,不绑定 OCR

参考链接


相关推荐
满怀冰雪1 小时前
24_中间件系统源码分析_Middleware链的洋葱模型与异常处理
人工智能·python·中间件·langchain
呆呆敲代码的小Y1 小时前
AI Agent 实战:last30days-skill-cn 一键搜索中国 8 大平台,30 秒生成深度研究报告
人工智能
AI行业学习1 小时前
2026 版 Notepad++ 完整图文安装指南|官方渠道无捆绑,一键切换中文界面
开发语言·人工智能·python·html·notepad++
aneasystone本尊1 小时前
OpenMontage 快速入门
人工智能
诚信定制8391 小时前
2025年CSDN年度技术趋势预测:AI、云原生与开发者工具的未来
人工智能·云原生
Bode_20021 小时前
生成式界面设计案例
人工智能
IT_陈寒1 小时前
Vue的v-if和v-show,我竟然用错了这么久
前端·人工智能·后端
鹏易灵1 小时前
C++——7.类与对象,掌握封装、继承、多态.详解
开发语言·c++·算法
mingo_敏1 小时前
大模型Model Architecture模型架构:从Transformer到MoE,架构决定AI上限
人工智能·架构·transformer