LayoutLM:融合文本与布局的预训练文档理解
LayoutLM:融合文本与布局的预训练文档理解
1. 什么是文档智能与 LayoutLM?
文档智能(Document Intelligence)旨在让机器像人类一样理解扫描件、PDF、票据、表单等富文本文档。传统 OCR 只能提取文字,但丢失了文字的位置、字体、表格结构等视觉信息。LayoutLM 是由微软提出的预训练模型,首次将文本内容与布局信息统一建模,通过自监督学习从海量文档中学习通用表示,大幅提升下游任务(表单理解、发票提取、文档分类等)的效果。
2. 模型架构:文本 + 布局 + 图像的多模态融合
LayoutLM 以 BERT 为骨架,创新性地在输入层嵌入了二维位置信息。基础版 LayoutLMv1 的输入由三部分组成:
- 文本嵌入(Token Embedding):与 BERT 一致,使用 WordPiece 分词。
- 1D 位置嵌入(Position Embedding):序列中 Token 的顺序位置。
- 2D 位置嵌入(2D Position Embedding):每个 Token 在文档页面上的边界框坐标
(x0, y0, x1, y1)编码为四个 Embedding 向量,总计构成 Layout Embedding。
最终的输入表示是三者之和:
Input = Token_Embed + Position_Embed + Layout_Embed
在 LayoutLMv2 及后续版本中,更进一步融入了视觉特征。将文档图像切分成块,通过 CNN(如 ResNet)或 ViT 提取视觉 Token,与文本 Token 在 Transformer 中交叉注意力,实现真正的多模态对齐。
3. 预训练任务:让模型学会阅读文档
LayoutLM 设计了两个与布局强相关的预训练任务,与 BERT 的 MLM 结合使用:
3.1 掩码视觉语言建模(Masked Visual-Language Modeling, MVLM)
类似 BERT 的 Masked Language Model,随机掩盖部分文本 Token,但要求模型不仅依赖上下文文字,还要利用布局和视觉线索来还原被掩盖的词。这迫使模型理解“版面中某个位置的词可能是什么”。
3.2 文本-图像对齐(Text-Image Alignment, TIA)
随机替换文档页面中的部分图像行(Token 对应的图像块),模型需要预测该图像块与文本是否对齐。该任务帮助模型学习文本与视觉区域的对应关系,对理解图表、签名等非文本元素至关重要。
3.3 文本-布局匹配(Text-Layout Matching, TLM)
(部分版本中使用)随机交换两个文档片段的布局坐标,让模型判断文本与布局是否匹配,进一步强化布局敏感性。
4. 动手实践:使用 LayoutLM 进行发票字段提取
我们将使用 Hugging Face 的 transformers 库,加载 LayoutLMv2 并微调到发票理解任务(抽取发票号码、日期、总金额等)。
4.1 环境安装
pip install transformers datasets torch torchvision pillow
4.2 加载预训练模型与处理器
from transformers import LayoutLMv2Processor, LayoutLMv2ForTokenClassification
processor = LayoutLMv2Processor.from_pretrained("microsoft/layoutlmv2-base-uncased")
model = LayoutLMv2ForTokenClassification.from_pretrained("microsoft/layoutlmv2-base-uncased")
LayoutLMv2Processor 内部集成了分词器和图像处理,可同时处理文本、边界框和图像。
4.3 准备数据格式
每个训练样本需要包含:
image: PIL 图像对象words: 单词列表(OCR 结果)boxes: 每个单词的归一化边界框[x0, y0, x1, y1](0-1000 范围内)word_labels: 每个单词对应的 BIO 标签列表(如B-INVOICE_NUM,I-INVOICE_NUM,O)
示例:
example = {
"image": Image.open("invoice.jpg").convert("RGB"),
"words": ["INVOICE", "#", "12345", "DATE", "2024-01-15"],
"boxes": [[100, 50, 200, 70], [220, 50, 250, 70], ...],
"word_labels": ["O", "O", "B-INVOICE_NUM", "O", "B-DATE"]
}
4.4 数据编码与模型输入
encoding = processor(
example["image"],
example["words"],
boxes=example["boxes"],
word_labels=example["word_labels"],
return_tensors="pt",
padding="max_length",
truncation=True,
max_length=512
)
# encoding包含:input_ids, attention_mask, bbox, image, labels
注意:bbox 输入形状为 [batch_size, seq_len, 4],坐标被缩放至 0-1000 范围。
4.5 微调模型
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="./layoutlmv2-invoice",
per_device_train_batch_size=4,
num_train_epochs=3,
logging_steps=50,
evaluation_strategy="steps",
save_steps=500,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset, # 需事先转换为 Hugging Face Dataset
eval_dataset=eval_dataset,
)
trainer.train()
4.6 推理与解码
inputs = processor(image, words, boxes=boxes, return_tensors="pt")
outputs = model(**inputs)
predictions = torch.argmax(outputs.logits, dim=-1)
# 将预测 id 映射回标签
id2label = model.config.id2label
true_predictions = [id2label[p.item()] for p in predictions[0] if p != -100]
对于真实的业务场景,还需要后处理将 BIO 标签合并为完整的实体字段。
5. 进阶应用与变体
- LayoutLMv3:使用 Unified Transformer,移除 CNN 视觉骨干,直接用图像块作为输入,更简洁高效。
- LayoutXLM:多语言扩展,支持跨语言文档理解。
- Donut:无 OCR 范式,直接以图像-文本方式端到端生成结构化信息,适合简单场景。
6. 总结
LayoutLM 系列通过预训练阶段融合文本、布局与视觉信号,解决了传统 OCR 后处理繁琐、语义理解弱的痛点。对于初学者,可快速基于 Hugging Face 的模型与处理器构建表单提取、文档分类等应用。建议从 LayoutLMv2 或 v3 入手,结合少量标注数据微调,即可获得可观的业务效果。