LayoutLM:融合文本与布局的预训练文档理解

FreeGuideOnline 最新 2026-06-23

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 入手,结合少量标注数据微调,即可获得可观的业务效果。