银行收到40万页无标签扫描件,且不能出内网。作者用289k页文档从零训练JEPA编码器,冻结后用每类几十个标签即可分类,还附带异常检测能力。文章复盘了架构、预处理、消融实验和踩过的坑,少标签场景下表现超过42M页预训练模型。
银行接入一个企业客户,一夜间多出四万页扫描件。每个页面是发票、报表、身份文件还是合同,没人标注。标注不能外包,因为看得懂财务文件的人不多,所以现实预算是每类几百个例子,不是几万个。
第二个限制:页面不能离开银行内网,调用云端视觉API不可行。
监督学习出局。剩下的路是:无标签学文档结构,冻结编码器,在小向量上接轻量分类器。
作者原本的想法:文档有布局,掩码应该隐藏整个语义区域,让模型推断“这里有签名块”。这个想法在消融中排第四,最终用的是反块掩码。
这不是新架构,是实证研究。组件来自I-JEPA和CAPI,没有用于生产。
两个数据集:
共28.9万页无标签。RVL-CDIP的标签只用于评估。
两个坑:
datasets streaming迭代器直接关闭生成器,丢掉整个流。要用decode=False手动解码。作者承认:RVL-CDIP不是银行数据,占语料76%,模型可能学到的是90年代传真退化特征。
离线阶段(每页一次):解码 → 灰度 → 可选块检测 → cv2.resize到256×256(INTER_AREA)→ 存uint8 memmap。
in_chans=1,扫描件没有有用颜色。INTER_AREA避免文字混叠成摩尔纹。uint8:28.9万页256×256,float32要19GB,bytes只要4.7GB。在线阶段(每个样本每epoch):uint8 → float32 → [-1,1],唯一变换是scale和shift。没有数据增强,唯一的随机性是每次重新生成掩码。
块检测是唯一需要额外预处理的方案:Otsu二值化、膨胀、轮廓、按垂直中心分header/footer/body。
检测在原生分辨率跑,结果归一化到[0,1],写入boxes.jsonl。
但消融发现,最终模型用的是inverse_block_roll掩码,从不看这些box。检测器跑完全部28.9万页,DataLoader每次加载——为一个没人用的列。复刻的话跳过这一步。
DocViT:ViT-B(768维,12层),输入256×256灰度patch=16。
最难的是变长掩码批处理。布局掩码每页可见patch数不同,需要padding索引到PAD_IDX=-1,gather前clamp到0,再用key padding mask让注意力忽略。三步缺一会破坏整个前提。
目标编码器用EMA更新,0.996→1.0余弦。预测器故意做窄:192维,4层,避免它直接学走文档统计。
损失是预测和layer-normed目标的MSE。LayerNorm防止模型缩小目标幅度来降损失。
初始化:torchvision的ImageNet ViT-B/16,通道平均,位置插值。
四种:
控制组很关键:inverse_block_roll和基线同时差在形状和覆盖率,不控制就无法归因。
训练:ViT-B 86M参数,40 epoch,batch 96,AdamW,LR 5e-5按batch缩放,3 epoch warmup,cosine,EMA cosine。掩码inverse_block_roll 65%,单张RTX 4090,7.7分钟/epoch,约5小时。
防崩塌三个指标:emb_std、RankMe、cosine kNN probe。三个都要,因为作者见过emb_std正常而RankMe滑了十个epoch。RankMe要非中心化计算。
四策略×3种子,ViT-S on 100k页。分解因素:
结论范围:只在30%覆盖率处成立。layout_zones没在65%覆盖率测试,这是网格的洞。
layout_zones输是因为平均只覆盖13%,任务太容易。17%页面检测器返回无结果,抽样器悄悄退回随机块。作者训练了好几个月“两种策略的混合”。
单种子时,效果符号是反的。
第一个ViT-B在epoch 15达到峰值0.617,然后掉到0.578。最自然的解释是过拟合。换了新掩码重跑,退化消失。真正的问题是预任务饱和:13%掩码下模型早就解决任务,剩余epoch只是压缩已有知识。
太容易的预任务不会响亮失败,反而像过拟合,让你把修复用在错误的东西上。
协议:编码器冻结,只训练线性分类器(约1.2万参数)。k=每类标签数,k=5共80个标签,机会水平6.3%。
少标签对比(同测试集同16类):
优势在低标签端。
两个问题,一个有解一个无解:
实现:每页新颖性1−max cosine对比参考目录;批次漂移用MMD²+排列检验。控制检验AUC 0.500,p=0.69。新文档类型MMD² 0.267,领域变化0.658。
手写页面新颖性高,原因不是模型没看过手写。预训练语料有9535张手写页。但目录里没有手写,最近邻是表格(横线纸、相似墨水密度)。向目录加20页手写,分数下降4.8倍,无需重训练。
最伤的:memo、budget、letter、invoice四个最像银行的类型,新颖性检测最差。信号弱在银行最需要强的地方。
布局损坏检测完全不行:合成delete/move/shuffle,整体AUROC 0.61,move只有0.52(随机)。用预测器误差做新颖性会反,AUROC 0.256。
六边形架构,Airflow驱动。三个DAG:onboarding(每客户一次)、inference(每天)、arrival(每10分钟)。
模式:不能运行的阶段应该跳过,而不是失败。
成本(作者实测):
CPU延迟四线程饱和,值得测而不是猜。
一个8600万参数编码器,单GPU五小时,80个标签分类胜过42M页预训练模型。诚实边界:1600评估页、单次运行、无OCR、非银行数据。
三个习惯最好:
作者说:“我最初的假设输了。基于这个失败行动,产生了图表里的模型。这个交易我随时做。”
注:所有数字都在官方RVL-CDIP测试集上用冻结编码器测量,来自脚本而非一次性notebook。
免费获取企业 AI 成熟度诊断报告,发现转型机会
关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断