☰
AnandaSky 的 MRoPE 三维位置编码揭秘:空间坐标如何提升古籍 OCR 识别精度
2026/10/17 15:08:33 网站建设 项目流程

【免费下载链接】AnandaSky

项目地址:https://ai.gitcode.com/hf_mirrors/badianeai/AnandaSky
点击查看免费下载

AnandaSky 是一个约 6.26 亿参数的视觉语言模型(VLM),专门用于历史汉字体系文献的行级转写。它提升古籍 OCR 识别精度的关键之一,就是MRoPE 三维位置编码:给每个视觉块和文本 token 一套 (t, h, w) 空间坐标,让模型真正"看见"图像的二维布局。本文用最少的公式,讲清 t/h/w 三个方向、通道交错分配与"空间重置"各自起什么作用 🔍

AnandaSky 是什么:6.26 亿参数的古籍转写老将 📜

AnandaSky 采用ViT 视觉编码器 + 基于 Qwen3 的自回归解码器:前者把一行文字图像切成视觉 token 序列,后者逐字生成转写文本。它在从 8 世纪到 20 世纪中国、韩国历史文献(涵盖印刷本与手写稿)中抽取的400 万张行级图像上训练,并支持单栏与双栏的竖排版式。

实测效果(CER 字符错误率,越低越好):

测试集CER
Korean Anthologies(域内)0.33%
Sibu Congkan(域内)0.43%
MTHv2(域内)0.92%
CUHK Challenge 2021(留出基准)0.82%
ICDAR2019-HDRC(留出基准)0.96%
Dunhuang Manuscripts(域内)1.38%
CUHK Challenge 2022(留出基准)1.61%
Qing Legal Documents(域内)4.89%

完整数据与使用说明见 README.md。

MRoPE 的三个"方向":(t, h, w) 空间坐标

传统文本 Transformer 只能给每个 token 一个一维编号(0, 1, 2, …),但图像天然是二维网格。MRoPE 的答案是把"一个位置"扩展为三个坐标分量:

  • t(time / 序列):一维顺序位置
  • h(height / 行):token 位于第几行
  • w(width / 列):token 位于第几列

AnandaSky 中的赋值规则非常简洁:

token 类型thw
文本 token位置 i位置 i位置 i
视觉 patch0行号(row)列号(col)

文本 token 三个方向取同一个值时,MRoPE精确退化为普通 RoPE,因此解码器与 Qwen3 的纯文本行为完全兼容;而视觉 patch 用 (0, 行, 列) 把二维版面信息写进了位置编码——这正是源码注释中 "2D structure" 的含义,见 modeling_anandasky.py。

64 个"频率槽位"如何分配:RoPE 通道交错

RoPE 的本质是在若干二维子空间里按位置旋转 Q/K 向量,每"一对维度"对应一个频率。AnandaSky 解码器的 head_dim 为 128,因此共有 128/2 =64 对通道。

MRoPE-I(Interleaved,交错式)把每一对通道指派给 t、h、w 三者之一,让单个 token 能同时携带三个方向的位置信息:

  • 本次发布的默认配置:config.json 中mrope_section为null,64 对通道按T, H, W, T, H, W…轮转分配,三个方向各占约 21~22 对;
  • 可选:也可以通过三元组指定 Qwen3-VL 风格的"分区交错"——H 占用第 1, 4, 7… 对,W 占用第 2, 5, 8… 对,其余归 T。

核心实现在MRoPEInterleavedEmbedding类:modeling_anandasky.py。值得一提的是工程上的优化:三个方向共享同一张 (cos, sin) 频率表,按需取指,避免了各自缓存三张表带来的三倍内存开销。

视觉端:2D RoPE 与"空间重置"技巧

视觉编码器使用 Qwen3-VL 风格的2D RoPE:每个 patch 被换算成以 patch 为单位的网格坐标 (row, col)(patch_size = 10 像素),频率槽位前半段编码行方向、后半段编码列方向,构建过程见 modeling_anandasky.py。

两个细节值得注意:

  1. 特殊 token 占位:当启用 CLS / register token 时,它们分别取坐标 (0,0) 与 (0, 1..R),patch 网格整体平移 +1 以免冲突,坐标生成逻辑见 _get_patch_coordinates;
  2. "空间重置"(spatial reset):无特殊 token 时,patch 坐标一律从 (0,0) 开始。也就是说,每张行级图像共享同一坐标系——第 1 张与第 1000 张图的网格完全对齐。模型不必学习"绝对页面位置",只需专注"一行内部的相对布局",这对古籍行级 OCR 极其友好。

视觉 token 随后带着坐标进入解码器,被组装成三维坐标 (t=0, h=行, w=列),见 modeling_anandasky.py。

文本端:为什么生成的文字要"接在图像最远处"

开始逐字生成后,文本 token 继续沿用三维坐标 (t=h=w),但起点不是 0,而是图像 token 的最大坐标 + 1。这个巧妙的一小步避免图文坐标冲突,让模型隐式理解"文本跟在图像之后"的顺序关系;解码阶段 KV cache 也会自动延续这套坐标,见 modeling_anandasky.py。

空间坐标为什么能提升古籍 OCR 精度?

古籍行级图像通常是窄长的竖条:竖排文字"从上到下、从右到左"阅读,一个字是否认识往往取决于上下左右邻字提供的语境。位置编码在这件事上贡献了三份力量:

  • 保留二维邻接关系:2D RoPE 直接编码行/列方向的邻近性,同一行、同一列的 patch 天然具有更强的位置相似性,模型可以利用局部版面做字形判断;
  • 顺序即坐标:h/w 坐标就是行列号,"阅读顺序"信息被写进了位置编码,降低了形近字的混淆;
  • 坐标系对齐:空间重置让所有行图像共享同一坐标框架,对未见过的历史文档(手稿、残损、褪色)泛化更稳。

最终,这套"空间感知"的编码器-解码器组合,让域内测试集 CER 稳定在 0.3%~1.4% 量级,手写与司法文书等更难场景也保持个位数 ✅

快速上手:加载模型与核心文件定位

AnandaSky 依赖FlashAttention与自定义 modeling 代码,加载时需要trust_remote_code=True:

from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained( "badianeai/AnandaSky", trust_remote_code=True, torch_dtype="auto", device_map="auto", )

环境要求 Python >= 3.10、PyTorch >= 2.1 与 Ampere 及更新的 NVIDIA GPU,并先执行pip install flash-attn --no-build-isolation安装 FlashAttention。

想深入源码,建议从这几处入手:

  • 模型与 MRoPE 完整实现:modeling_anandasky.py
  • 图像预处理(pad、归一化、切 patch):inference_processor.py
  • 关键超参数(rope_theta = 1e6、mrope_section = null):config.json
  • 评测数据与使用示例:README.md

总结

MRoPE 为每个 token 配了一套 (t, h, w) 三维坐标:文本 token 沿用一维顺序,视觉 patch 携带二维行列信息,生成文本从图像最远处接续;再配合"空间重置"的坐标系设计,6.26 亿参数的 AnandaSky 得以稳定读出千年前的窄行文字。如果你也想为自己的视觉语言模型加入二维版面感知,这套"三轴坐标 + 通道交错 + 空间重置"的组合非常值得参考 ✨

【免费下载链接】AnandaSky

项目地址:https://ai.gitcode.com/hf_mirrors/badianeai/AnandaSky
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询