microsoft-UniLM项目介绍

发布于:2025-07-12 ⋅ 阅读:(30) ⋅ 点赞:(0)

一、UniLM项目介绍

统一语言模型(Unified Language Model,UniLM)
https://github.com/microsoft/unilm

这个 unilm 仓库是微软的一个研究项目,专注于跨任务、语言和模态的大规模自监督预训练,涵盖了多种基础模型架构和模型,在自然语言处理(NLP)、计算机视觉、语音处理和多模态处理等多个领域开展研究。

在这里插入图片描述

图1:UniLM的网络结构以及它不同的预训练任务。

1. 基础架构

  • TorchScale:一个基础架构库,专注于开发新的基础模型架构,研究建模的通用性、能力、训练稳定性和效率。相关架构有:
    • DeepNet:可将 Transformer 扩展到 1000 层及以上,提升模型稳定性。
    • Foundation Transformers (Magneto):旨在实现跨任务和模态(包括语言、视觉、语音和多模态)的真正通用建模。
    • Length - Extrapolatable Transformer:具有长度外推能力的 Transformer。
    • X - MoE:可扩展且可微调的稀疏专家混合(Mixture - of - Experts, MoE)架构。
  • 模型架构革新
    • BitNet:用于大语言模型的 1 位 Transformer。
    • RetNet:作为 Transformer 的继任者,用于大语言模型。
    • LongNet:可将 Transformer 扩展到处理 10 亿个令牌。

2. 基础模型

多模态大语言模型(MLLM)的演进

  • Kosmos - 2.5:多模态知识模型。
  • Kosmos - 2:将多模态大语言模型与现实世界关联起来。
  • Kosmos - 1:多模态大语言模型。
  • MetaLM:语言模型作为通用接口。

语言和多语言模型

  • UniLM:用于语言理解和生成的统一预训练模型。
  • InfoXLM/XLM - E:支持 100 多种语言的多语言/跨语言预训练模型。
  • DeltaLM/mT6:用于 100 多种语言的语言生成和翻译的编码器 - 解码器预训练模型。
  • MiniLM:用于语言理解和生成的小型快速预训练模型。
  • AdaLM:预训练模型的领域、语言和任务自适应模型。
  • EdgeLM:适用于边缘/客户端设备的小型预训练模型。
  • SimLM:用于相似度匹配的大规模预训练模型。
  • E5:文本嵌入模型。
  • MiniLLM:大语言模型的知识蒸馏模型。

视觉模型

  • BEiT/BEiT - 2:用于视觉的生成式自监督预训练模型,即图像 Transformer 的 BERT 预训练。
  • DiT:用于文档图像 Transformer 的自监督预训练模型。
  • TextDiffuser/TextDiffuser - 2:将扩散模型作为文本绘画工具。

语音模型

  • WavLM:用于全栈语音任务的预训练模型。
  • VALL - E:用于文本转语音(TTS)的神经编解码语言模型。

多模态(X + 语言)模型

  • LayoutLM/LayoutLMv2/LayoutLMv3:用于文档人工智能的多模态(文本 + 布局/格式 + 图像)文档基础模型。
  • LayoutXLM:用于多语言文档人工智能的多模态(文本 + 布局/格式 + 图像)文档基础模型。
  • MarkupLM:用于视觉丰富文档理解的标记语言模型预训练。
  • XDoc:用于跨格式文档理解的统一预训练模型。
  • UniSpeech:用于自动语音识别(ASR)的自监督学习和监督学习的统一预训练模型。
  • UniSpeech - SAT:具有说话人感知预训练的通用语音表示学习模型。
  • SpeechT5:用于口语处理的编码器 - 解码器预训练模型。
  • SpeechLM:利用未配对文本数据增强语音预训练。
  • VLMo:统一的视觉 - 语言预训练模型。
  • VL - BEiT:生成式视觉 - 语言预训练模型,是 BEiT 向多模态的演进。
  • BEiT - 3:通用多模态基础模型,是大规模预训练在任务、语言和模态上融合的重要里程碑。

工具包

  • s2s - ft:序列到序列的微调工具包。
  • Aggressive Decoding:无损且高效的序列到序列解码算法。

其他资源

  • RedStone:为大语言模型整理通用、代码、数学和问答数据。
  • LLMOps:支持使用大语言模型(LLMs)和多模态大语言模型(MLLMs)实现人工智能能力的通用技术。

模型发布记录

  • 2021 年 10 月:MarkupLM 发布。
  • 2021 年 9 月:TrOCR 发布。
  • 2021 年 8 月:LayoutReader 和 DeltaLM 发布。
  • 2021 年 7 月:BEiT 发布。

代码结构

仓库包含多个子目录,每个子目录对应一个具体的项目或模型,例如 beitkosmos - 2layoutlm 等。同时,还包含一些工具和脚本,用于数据处理、模型训练和评估等任务。

二、TrOCR

TrOCR和UniLM的关系:

从代码层面看,trocr/trocr_models.py文件里尝试导入UniLMDecoder,代码如下:

try:
    from .unilm_models import UniLMDecoder
except:
    from unilm_models import UniLMDecoder

这表明TrOCR在模型构建时会借鉴UniLM的解码器,可能会复用UniLM在自然语言处理方面的优势,如对文本生成和理解的能力,以增强自身在文字识别后文本处理的效果。

  • TrOCR:是一种端到端的文本识别方法,主要用于光学字符识别(OCR)任务,通过预训练的图像Transformer和文本Transformer模型,实现对图像中文字的识别和生成。从trocr/README.md可知,它在多个数据集(如IAM、SROIE等)上有出色的表现,能够输出识别的文字结果。
  • UniLM:主要聚焦于自然语言理解(NLU)和生成(NLG)的统一预训练。它可以处理多种自然语言处理任务,如抽象文本摘要、问题生成等,在自然语言处理的多个基准测试中取得了新的最优结果(SOTA)。

TrOCR项目结构的大致介绍:

在这里插入图片描述

  • augmentation :存放数据增强相关代码 。
  • README.md :项目说明,含概述、使用等。
  • __init__.py :使trocr成为Python包。
  • bpe.py :实现字节对编码算法。
  • convert_to_SROIE_format.py :数据转SROIE格式。
  • data.py :负责数据加载与预处理。
  • data_aug.py :具体数据增强操作。
  • deit.py :DEIT模型相关代码。
  • generator.py :生成数据或结果。
  • pic_inference.ipynb/py :图像推理。
  • requirements.txt :记录依赖包。
  • scoring.py :计算评估指标。
  • task.py :定义任务逻辑。
  • trocr_models.py :定义TrOCR模型架构。
  • unilm3-cased.model :UniLM模型权重。
  • unilm_models.py :UniLM模型代码。
  • vit_models.py :ViT模型代码。

IAM数据集上微调代码讲解

Fine-tuning on IAM

export MODEL_NAME=ft_iam
export SAVE_PATH=/path/to/save/${MODEL_NAME}
export LOG_DIR=log_${MODEL_NAME}
export DATA=/path/to/data
mkdir ${LOG_DIR}
export BSZ=8
export valid_BSZ=16

CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
    $(which fairseq-train) \
    --data-type STR --user-dir ./ --task text_recognition --input-size 384 \
    --arch trocr_large \   # or trocr_base
    --seed 1111 --optimizer adam --lr 2e-05 --lr-scheduler inverse_sqrt \
    --warmup-init-lr 1e-8 --warmup-updates 500 --weight-decay 0.0001 --log-format tqdm \
    --log-interval 10 --batch-size ${BSZ} --batch-size-valid ${valid_BSZ} --save-dir ${SAVE_PATH} \
    --tensorboard-logdir ${LOG_DIR} --max-epoch 300 --patience 20 --ddp-backend legacy_ddp \
    --num-workers 8 --preprocess DA2 --update-freq 1 \
    --bpe gpt2 --decoder-pretrained roberta2 \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --decoder-pretrained unilm ## For small models
    --finetune-from-model /path/to/model --fp16 \
    ${DATA} 

这段代码用于在IAM数据集上对TrOCR模型进行微调的脚本,它使用了fairseq框架,用了fairseq-train命令,设置了一系列的训练参数,包括学习率、批量大小、训练轮数等。通过分布式训练的方式来加速模型的微调过程。以下是对代码各部分的详细解释:

1. 环境变量设置

export MODEL_NAME=ft_iam
export SAVE_PATH=/path/to/save/${MODEL_NAME}
export LOG_DIR=log_${MODEL_NAME}
export DATA=/path/to/data
mkdir ${LOG_DIR}
export BSZ=8
export valid_BSZ=16
  • MODEL_NAME:微调模型的名称,这里设置为ft_iam,表示在IAM数据集上进行微调。
  • SAVE_PATH:保存微调后模型的路径,使用了环境变量MODEL_NAME
  • LOG_DIR:保存训练日志的目录,同样使用了环境变量MODEL_NAME
  • DATA:训练数据的路径。
  • mkdir ${LOG_DIR}:创建日志目录。
  • BSZ:训练时的批量大小,设置为8。
  • valid_BSZ:验证时的批量大小,设置为16。

2. 分布式训练启动

CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
    $(which fairseq-train) \
  • CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7:指定使用的GPU设备编号,这里使用了8块GPU。
  • python -m torch.distributed.launch --nproc_per_node=8:使用torch.distributed.launch工具启动分布式训练,每个节点使用8个进程。
  • $(which fairseq-train):调用fairseq-train命令进行模型训练。

3. 训练参数设置

--data-type STR --user-dir ./ --task text_recognition --input-size 384 \
--arch trocr_large \   # or trocr_base
--seed 1111 --optimizer adam --lr 2e-05 --lr-scheduler inverse_sqrt \
--warmup-init-lr 1e-8 --warmup-updates 500 --weight-decay 0.0001 --log-format tqdm \
--log-interval 10 --batch-size ${BSZ} --batch-size-valid ${valid_BSZ} --save-dir ${SAVE_PATH} \
--tensorboard-logdir ${LOG_DIR} --max-epoch 300 --patience 20 --ddp-backend legacy_ddp \
--num-workers 8 --preprocess DA2 --update-freq 1 \
--bpe gpt2 --decoder-pretrained roberta2 \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --decoder-pretrained unilm ## For small models
--finetune-from-model /path/to/model --fp16 \
${DATA} 
  • --data-type STR:指定数据类型为STR
  • --user-dir ./:指定用户自定义代码的目录为当前目录。即trocr/
  • --task text_recognition:指定训练任务为文本识别。指定任务类型,对应task.py中的实现
  • --input-size 384:输入图像的大小为384。
  • --arch trocr_large:使用trocr_large架构,也可以选择trocr_base。指定模型架构,对应trocr_models.py中的定义
  • --seed 1111:设置随机种子为1111,保证结果的可重复性。
  • --optimizer adam:使用Adam优化器。
  • --lr 2e-05:学习率设置为2e-05
  • --lr-scheduler inverse_sqrt:使用逆平方根学习率调度器。
  • --warmup-init-lr 1e-8:热身阶段的初始学习率为1e-8
  • --warmup-updates 500:热身阶段的更新步数为500。
  • --weight-decay 0.0001:权重衰减系数为0.0001
  • --log-format tqdm:使用tqdm格式输出训练日志。
  • --log-interval 10:每10个批次输出一次训练日志。
  • --batch-size ${BSZ}:训练时的批量大小,使用之前设置的BSZ
  • --batch-size-valid ${valid_BSZ}:验证时的批量大小,使用之前设置的valid_BSZ
  • --save-dir ${SAVE_PATH}:保存模型的目录,使用之前设置的SAVE_PATH
  • --tensorboard-logdir ${LOG_DIR}:保存TensorBoard日志的目录,使用之前设置的LOG_DIR
  • --max-epoch 300:最大训练轮数为300。
  • --patience 20:早停策略的耐心值为20,如果在20个轮次内验证集性能没有提升,则停止训练。
  • --ddp-backend legacy_ddp:使用legacy_ddp作为分布式数据并行后端。
  • --num-workers 8:数据加载的工作进程数为8。
  • --preprocess DA2:使用DA2进行数据预处理。
  • --update-freq 1:梯度累积步数为1,即每个批次都进行参数更新。
  • --bpe gpt2:使用GPT-2的字节对编码(BPE)。
  • --decoder-pretrained roberta2:解码器使用roberta2进行预训练。
  • --finetune-from-model /path/to/model:从指定的预训练模型开始微调。
  • --fp16:使用半精度浮点数(FP16)进行训练,以减少内存使用和加速训练。
  • ${DATA}:指定训练数据的路径。

README

TrOCR

项目地址:https://github.com/microsoft/unilm

简介

TrOCR是一种端到端的文本识别方法,它结合了预训练的图像Transformer和文本Transformer模型,利用Transformer架构同时进行图像理解和字块级别的文本生成。
在这里插入图片描述

论文:TrOCR: 基于预训练模型的Transformer光学字符识别
李明浩,吕腾超,崔磊,卢一娟,迪内·弗洛伦西奥,张查,李周军,魏富如,AAAI 2023

TrOCR模型也以Huggingface格式提供。[文档][模型]

模型 参数数量 测试集 得分
TrOCR-Small 62M IAM 4.22(区分大小写的字符错误率)
TrOCR-Base 334M IAM 3.42(区分大小写的字符错误率)
TrOCR-Large 558M IAM 2.89(区分大小写的字符错误率)
TrOCR-Small 62M SROIE 95.86(F1值)
TrOCR-Base 334M SROIE 96.34(F1值)
TrOCR-Large 558M SROIE 96.60(F1值)
模型 IIIT5K - 3000 SVT - 647 ICDAR2013 - 857 ICDAR2013 - 1015 ICDAR2015 - 1811 ICDAR2015 - 2077 SVTP - 645 CT80 - 288
TrOCR-Base(单词准确率) 93.4 95.2 98.4 97.4 86.9 81.2 92.1 90.6
TrOCR-Large(单词准确率) 94.1 96.1 98.4 97.3 88.1 84.1 93.0 95.1
安装
conda create -n trocr python=3.7
conda activate trocr
git clone https://github.com/microsoft/unilm.git
cd unilm
cd trocr
pip install pybind11
pip install -r requirements.txt
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" 'git+https://github.com/NVIDIA/apex.git'
微调与评估
模型下载
模型 下载链接
TrOCR-Small-IAM trocr-small-handwritten.pt
TrOCR-Base-IAM trocr-base-handwritten.pt
TrOCR-Large-IAM trocr-large-handwritten.pt
TrOCR-Small-SROIE trocr-small-printed.pt
TrOCR-Base-SROIE trocr-base-printed.pt
TrOCR-Large-SROIE trocr-large-printed.pt
TrOCR-Small-Stage1 trocr-small-stage1.pt
TrOCR-Base-Stage1 trocr-base-stage1.pt
TrOCR-Large-Stage1 trocr-large-stage1.pt
TrOCR-Base-STR trocr-base-str.pt
TrOCR-Large-STR trocr-large-str.pt
测试集下载
测试集 下载链接
IAM IAM.tar.gz
SROIE SROIE_Task2_Original.tar.gz
STR基准测试集 STR_BENCHMARKS.zip

IAM主要用于手写文本识别任务
SROIE主要用于打印文本识别任务,特别是在文档处理和信息提取方面。
STR 基准测试集用于文本识别模型的基准测试,涵盖了多种场景和风格的文本图像,

如果本页面上的任何文件下载失败,请在URL后添加以下字符串作为后缀。

后缀字符串: ?sv=2022-11-02&ss=b&srt=o&sp=r&se=2033-06-08T16:48:15Z&st=2023-06-08T08:48:15Z&spr=https&sig=a9VXrihTzbWyVfaIDlIT1Z0FoR1073VB0RLQUMuudD4%3D

在IAM上进行微调
export MODEL_NAME=ft_iam
export SAVE_PATH=/path/to/save/${MODEL_NAME}
export LOG_DIR=log_${MODEL_NAME}
export DATA=/path/to/data
mkdir ${LOG_DIR}
export BSZ=8
export valid_BSZ=16

CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
    $(which fairseq-train) \
    --data-type STR --user-dir ./ --task text_recognition --input-size 384 \
    --arch trocr_large \   # 或者 trocr_base
    --seed 1111 --optimizer adam --lr 2e-05 --lr-scheduler inverse_sqrt \
    --warmup-init-lr 1e-8 --warmup-updates 500 --weight-decay 0.0001 --log-format tqdm \
    --log-interval 10 --batch-size ${BSZ} --batch-size-valid ${valid_BSZ} --save-dir ${SAVE_PATH} \
    --tensorboard-logdir ${LOG_DIR} --max-epoch 300 --patience 20 --ddp-backend legacy_ddp \
    --num-workers 8 --preprocess DA2 --update-freq 1 \
    --bpe gpt2 --decoder-pretrained roberta2 \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --decoder-pretrained unilm ## 对于小模型
    ${DATA} 
在SROIE上进行微调
export MODEL_NAME=ft_SROIE
export SAVE_PATH=/path/to/save/${MODEL_NAME}
export LOG_DIR=log_${MODEL_NAME}
export DATA=/path/to/data
mkdir ${LOG_DIR}
export BSZ=16
export valid_BSZ=16

CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
    $(which fairseq-train) \
    --data-type SROIE --user-dir ./ --task text_recognition --input-size 384 \
    --arch trocr_large \   # 或者 trocr_base
    --seed 1111 --optimizer adam --lr 5e-05 --lr-scheduler inverse_sqrt \
    --warmup-init-lr 1e-8 --warmup-updates 800 --weight-decay 0.0001 --log-format tqdm \
    --log-interval 10 --batch-size ${BSZ} --batch-size-valid ${valid_BSZ} \
    --save-dir ${SAVE_PATH} --tensorboard-logdir ${LOG_DIR} --max-epoch 300 \
    --patience 10 --ddp-backend legacy_ddp --num-workers 10 --preprocess DA2 \
    --bpe gpt2 --decoder-pretrained roberta2 \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --decoder-pretrained unilm ## 对于小模型
    ${DATA}
在STR基准测试集上进行微调
    --preprocess RandAugment  --update-freq 1  --ddp-backend legacy_ddp \
    --num-workers 8  --finetune-from-model /path/to/model  \
    --bpe gpt2  --decoder-pretrained roberta2 \
    ${DATA} 
在SROIE上进行评估
export DATA=/path/to/data
export MODEL=/path/to/model
export RESULT_PATH=/path/to/result
export BSZ=16
$(which fairseq-generate) \
        --data-type SROIE --user-dir ./ --task text_recognition --input-size 384 \
        --beam 10 --nbest 1 --scoring sroie --gen-subset test \
        --batch-size ${BSZ} --path ${MODEL} --results-path ${RESULT_PATH} \
        --bpe gpt2 --dict-path-or-url https://layoutlm.blob.core.windows.net/trocr/dictionaries/gpt2_with_mask.dict.txt \ # --bpe sentencepiece --sentencepiece-model ./unilm3-cased.model --dict-path-or-url https://layoutlm.blob.core.windows.net/trocr/dictionaries/unilm3.dict.txt ## 对于小模型
        --preprocess DA2 \
        --fp16 \
        ${DATA}
在STR基准测试集上进行评估
export DATA=/path/to/data
export MODEL=/path/to/model
export RESULT_PATH=/path/to/result
export BSZ=16
$(which fairseq-generate) \
        --data-type Receipt53K --user-dir ./ --task text_recognition \
        --input-size 384 --beam 10 --nbest 1 --scoring wpa \
        --gen-subset test --batch-size ${BSZ} --bpe gpt2 \
        --dict-path-or-url https://layoutlm.blob.core.windows.net/trocr/dictionaries/gpt2_with_mask.dict.txt \
        --path ${MODEL} --results-path ${RESULT_PATH} \
        --preprocess RandAugment \
        ${DATA}

请使用 “convert_to_sroie_format.py” 将输出文件转换为zip格式,并在网站上提交以获取分数。

推理示例

详情请见 pic_inference.py

引用

如果您想在研究中引用TrOCR,请引用以下论文:

@misc{li2021trocr,
      title={TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models}, 
      author={Minghao Li and Tengchao Lv and Lei Cui and Yijuan Lu and Dinei Florencio and Cha Zhang and Zhoujun Li and Furu Wei},
      year={2021},
      eprint={2109.10282},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}
许可证

本项目遵循此源代码树根目录下的LICENSE文件中的许可证。部分源代码基于fairseq项目。微软开源行为准则

联系信息

如需使用TrOCR时获得帮助或遇到问题,请提交一个GitHub问题。
如需与TrOCR相关的其他沟通,请联系崔磊 (lecu@microsoft.com),魏富如 (fuwei@microsoft.com)。


网站公告

今日签到

点亮在社区的每一天
去签到