microsoft-UniLM项目介绍

一、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-Small62MIAM4.22(区分大小写的字符错误率)
TrOCR-Base334MIAM3.42(区分大小写的字符错误率)
TrOCR-Large558MIAM2.89(区分大小写的字符错误率)
TrOCR-Small62MSROIE95.86(F1值)
TrOCR-Base334MSROIE96.34(F1值)
TrOCR-Large558MSROIE96.60(F1值)
模型IIIT5K - 3000SVT - 647ICDAR2013 - 857ICDAR2013 - 1015ICDAR2015 - 1811ICDAR2015 - 2077SVTP - 645CT80 - 288
TrOCR-Base(单词准确率)93.495.298.497.486.981.292.190.6
TrOCR-Large(单词准确率)94.196.198.497.388.184.193.095.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-IAMtrocr-small-handwritten.pt
TrOCR-Base-IAMtrocr-base-handwritten.pt
TrOCR-Large-IAMtrocr-large-handwritten.pt
TrOCR-Small-SROIEtrocr-small-printed.pt
TrOCR-Base-SROIEtrocr-base-printed.pt
TrOCR-Large-SROIEtrocr-large-printed.pt
TrOCR-Small-Stage1trocr-small-stage1.pt
TrOCR-Base-Stage1trocr-base-stage1.pt
TrOCR-Large-Stage1trocr-large-stage1.pt
TrOCR-Base-STRtrocr-base-str.pt
TrOCR-Large-STRtrocr-large-str.pt
测试集下载
测试集下载链接
IAMIAM.tar.gz
SROIESROIE_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)。

是的,**LayoutLM 系列模型是可以用于商业用途的**,因为它们使用的是 **MIT License**,这是一种非常宽松的开源许可证,允许你: ✅ 自由地使用、复制、修改和分发代码 ✅ 用于商业目的 ✅ 不需要公开你自己的源代码(与 GPL 不同) ✅ 只需保留原始版权声明即可 --- ### LayoutLM 的许可证详情如下: | 模型版本 | 是否可商用 | 许可证类型 | 来源 | |----------------|------------|-------------|------| | LayoutLMv1 | ✅ 是 | MIT License | [GitHub - Microsoft/UniLM](https://github.com/microsoft/unilm) | | LayoutLMv2 | ✅ 是 | MIT License | [GitHub - Microsoft/UniLM](https://github.com/microsoft/unilm) | | LayoutLMv3 | ✅ 是 | MIT License | [GitHub - Microsoft/UniLM](https://github.com/microsoft/unilm) | --- ### 使用建议: - 你可以放心将 LayoutLM 集成到商业产品中,例如文档解析系统、发票识别、合同信息提取等。 - 请确保在项目中保留原始项目的版权声明(例如在 LICENSE 文件中注明)。 --- ### 示例:如何在项目中引用 MIT License 的代码 ```text MIT License Copyright (c) Microsoft Corporation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: ... ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值