多模态:Nougat详解

news2024/11/15 12:54:03

文章目录

  • 前言
  • 一、模型结构
    • 1. encoder
    • 2. decoder
    • 3. set
  • 二、数据增强
  • 三、数据
    • splitting the pages
  • 四、实验评估
    • repetitions during inference
  • 五、代码
    • 1. 环境安装
    • 2. Dataset(dataset.py)
    • 3. Model(model.py)
  • 总结


前言

科学知识主要存储在书籍和科学期刊中,通常以PDF的形式。然而PDF格式会导致语义信息的损失,特别是对于数学表达式。文章提出Nougat,一种视觉transformer模型,它执行OCR任务,用于将科学文档处理成标记语言

paper:https://arxiv.org/pdf/2308.13418
github:https://github.com/facebookresearch/nougat/tree/main

一、模型结构

模型是一个encoder-decoder模型,允许端到端的训练。请添加图片描述

1. encoder

视觉encoder首先接受一张文档图像,裁剪边距并调整图像大小成固定的尺寸(H,W);如果图像小于矩形,那么增加额外的填充以确保每个图像具有相同的维度。encoder使用了Swin Transformer,将图像分为不重叠的固定大小的窗口,然后应用一系列的自注意力层来聚集跨窗口的信息。该模型输出一个embedding patch(d*N),其中d是隐层维度,N是patch的数目。

2. decoder

使用带有cross-attention的mBART解码器解码(d*N),生成一系列tokens,tokens以自回归方式生成,使用自注意力和交叉注意力分别关注输入序列和编码器输出的不同部分,最后tokens被投影到vocabulary的大小,产生logits。

3. set

以 96 DPI 的分辨率渲染文档图像。由于 Swin Transformer 的限制性可能输入维度,选择输入大小 (H, W ) = (896, 672)。使用预训练的权重初始化模型。Transformer decoder的最大序列长度为 S = 4096。这种相对较大的尺寸是由于学术研究论文的文本可能是密集的,尤其是表格的语法是token密集型的。BART 解码器是一个具有 10 层的仅解码器Transformer。整个架构共有 350M 参数。此外还使用较小的模型 (250M 参数) 进行实验,序列长度略小 S = 3584,只有 4 个解码器层。

训练:使用AdamW优化器训练3个epoch,batch_size是192;由于训练的不稳定性,选择lr init = 5·10−5的学习率,每15次更新减少0.9996倍,直到达到lrend = 7.5·10−6

二、数据增强

在图像识别任务中,使用数据增强来提高泛化性是有效的。文章应用一系列的transformation来模拟扫描文档的缺陷和可变性。这些变换包括:腐蚀,膨胀,高斯噪声,高斯模糊,位图转换,图像压缩,网格失真和弹性变换(这些变换可以借鉴一下,几乎包括了所有图像领域常用的变换)每个都有一个固定的概率来应用给给定图像(这一步在训练前完成)。转换效果如下
请添加图片描述
在训练过程中,会用随机替换token的方式给groud truth增加扰动

三、数据

目前没有pdf页面和其对应的source code的成对数据集。
根据arxiv上的开源文章,建立了自己的数据集。对于layout多样性,我们引入了PMC开源非商业数据集的子集。在预训练过程中,也引入了一部分行业文档库数据。

ARXIV
我们从arxiv上收集了174w+的pape,收集其源代码并编译pdf。为了保证格式的一致性,首先用latex2html处理源文件,并将他们转为html文件。然后解析html文件,并将他们转换为轻量级标记语言,支持标题,粗体和斜体文本、公式,表等各种元素。这样,我们能保证源代码格式是正确的,方便后续处理。整个过程如图
请添加图片描述

PMC
我们还处理了来自PMC的文章,其中除了PDF文件之外,还可以获得具有语义信息的XML文件。我们将这些文件解析为与arxiv文章相同的标记语言格式,我们选择使用PMC少得多的文章,因为XML文件并不总是具有丰富的语义信息。通常,方程和表格存储为图像,这些情况检测起来并非易事,这导致我们决定将PMC文字的使用限制在预训练阶段。

IDL
IDL是行业产生的文档集合。这个仅用在预训练阶段,用于教模型基本的OCR;

splitting the pages

我们根据pdf的页中断来分割markdown标记,然后将每个pdf页面转为图像,来获得图像-标记pair。在编译过程中,Latex会自动确定pdf的页面中断。由于我们没有重新编译每篇论文的Latex源,我们必须启发式地将源文件拆分为对应不同页面的部分。为了实现这一点,我们使用PDF页面上的嵌入文本和源文本进行匹配。

然而,PDF中的图像和表格可能不对应他们在源代码中的位置。为了解决这个问题,我们在预处理阶段去掉了这些元素。然后将识别的标题和XML文件中的标题进行比较,并根据他们的Levenshtein距离进行匹配。一旦源文档被分成单个页面,删除的图形和表格就会在每个页面的末尾重新插入。

四、实验评估

请添加图片描述

在一篇科研文章中,存在三种不同类型的文本:1) 纯文本,占文档的大部分;2) 数学表达式;3) 表格。在评估过程中,检查这三个部分中的每一个都很重要。这是因为在LaTeX中,表达同一个数学表达式有多种方式。尽管在LaTeXML预处理步骤中消除了一些可变性,但仍然存在大量歧义,这种歧义降低了数学和纯文本的得分。数学表达式的预期得分低于纯文本

repetitions during inference

我们观察到模型会退化为一遍又一遍地重复相同的句子。模型无法自行从这种状态中恢复过来。在最简单的情况下,最后一个句子或段落被不断地重复(在大模型中也经常出现)。我们在测试集中的1.5%页面观察到了这种行为,但领域外文档的频率会增加。陷入重复循环是使用贪婪解码采样时基于Transformer模型的一个已知问题。模型也可能在两个句子之间交替,但有时会改变一些单词,因此严格的重复检测是不够的。作者提出在训练过程中引入随机扰动以增强模型对错误预测标记的处理能力,以及在推理时检测和处理重复的方法,但是仍然无法根本解决这类问题,这也让模型的实用性受到限制

个人认为有两种方法可以降低重复和幻觉

1. 输出添加位置信息的预测,比如TextMonkey和mPlug-DocOwl1.5都把text grounding任务做为下游任务进行微调,在消融实验里也提到了增加文本位置预测可以显著降低模型输出的幻觉;

2. 降低图像里文本的数量,在图片中文本数量较少时,一般不容易出现重复和幻觉,所以可以按上篇文章提到的办法,将图片划分为多个block,再对单个block训练对应的端到端识别模型,这样也可以解决模型输出的重复问题

五、代码

1. 环境安装

按照github教程安装即可,但注意transformer库的版本, 如果transformer版本可能会报错:
TypeError: BARTDecoder.prepare_inputs_for_inference() got an unexpected keyword argument ‘cache_position’

由于Nougat自己写了“prepare_inputs_for_generation”,而与最新版本的transformers实现不同。因此应该在Nougat中安装旧版本的transformers,例如transformers==4.38.2是没有问题的。

2. Dataset(dataset.py)

主要函数:NougatDataset —— return input_tensor, input_ids, attention_mask

input_tensor: 图像经过预处理后的输入编码
input_ids: 文本信息经过tokenizer处理后的id
attention_mask: input_ids对应的mask

依赖函数:SciPDFDataset——return {“image”: img, “ground_truth”: data.pop(“markdown”), “meta”: data}

数据格式
请添加图片描述

简单来说,SciPDFDataset输出一个样本的基本信息,NougatDatase则输出模型可直接训练的信息

3. Model(model.py)

Swintransformer基于timm构建,Bart基于transformer构建。有个小技巧,如果训练显存太大,可以尝试在编码器解码器中添加一个参数

编码器中添加 —— use_checkpoint=True
请添加图片描述
解码器中添加 —— gradient_checkpointing=True
请添加图片描述


总结

Nougat尝试用一个端到端的方式来实现过去无数小模型+策略配合的结果。确实效果很惊艳,但其缺点也十分明显:

推理速度慢。虽然过去的pipeline设计多个模型,但每个模型都非常轻量化,组合起来的参数量甚至不到Nougat的1/10。
定制化难。
数据集构建成本高。(但是nougat的数据工程确实也很惊艳,非常值得学习!!!)
训练成本高。主要体现在机器成本,需要更多的GPU,更长的训练时间。
优化成本高。Nougat作为一种端到端的解决方法无法针对特定的badcase进行优化。比如在传统方案中,如果表格OCR这个模块效果较差单独优化即可,不会影响到其它模块。但用端到端的方案,当构建倾向表格的数据时,可能会导致其它场景出现新的badcase。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1911153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文速读】| 用于安全漏洞防范的人工智能技术

本次分享论文:Artificial Intelligence Techniques for Security Vulnerability Prevention 基本信息 原文作者:Steve Kommrusch 作者单位:Colorado State University, Department of Computer Science, Fort Collins, CO, 80525 USA 关键…

给数组/对象添加一个(key-value)对象

需要将一个value值前面加上key值,放进数组/对象中 this.$set(res.data[0],type,1) this.$set( target, key, value ) target:要更改的数据源(可以是对象或者数组) key:要更改的具体数据 value :重新赋的值。 结果:…

初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言 C是一种通用的编程语言,被广泛用于开发各种应用程序,包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展,添加了许多新特性和功能,并支持面向对象编程。C可以在不同的平台上编译和运行,具有高效性、可…

C++:C++入门基础|命名空间|输入输出

欢迎来到HarperLee的学习笔记! 博主主页传送门: HarperLee的博客主页! 想要一起进步的uu来后台哦! 一、什么是C? 在此之前,我们所学习的C语言是一种结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题&a…

【Java算法】二分查找 下

🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 一.山脉数组的峰顶索引 题目链接:852.山脉数组的峰顶 ​ 算法原理 这段代码实现了一个查找山峰数组中峰值索引的算法。山峰数组是一个先递增后递减的数组&…

14-55 剑和诗人29 - RoSA:一种新的 PEFT 方法

介绍 参数高效微调 (PEFT) 方法已成为 NLP 领域研究的热门领域。随着语言模型不断扩展到前所未有的规模,在下游任务中微调所有参数的成本变得非常高昂。PEFT 方法通过将微调限制在一小部分参数上来提供解决方案,从而以极低的计算成本在自然语言理解任务上…

QT入门看这一篇就够(详解含qt源码)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

【技术选型】MySQL、Oracle、Postgresql如何选择

【技术选型】MySQL、Oracle、Postgresql如何选择 开篇词:干货篇:MySQL:Oracle:PostgreSQL: 总结篇:我是杰叔叔,一名沪漂的码农,下期再会! 开篇词: 常见几种关…

Nuxt框架中内置组件详解及使用指南(四)

title: Nuxt框架中内置组件详解及使用指南(四) date: 2024/7/9 updated: 2024/7/9 author: cmdragon excerpt: 摘要:本文详细介绍了Nuxt 3框架中的两个内置组件:和的使用方法与示例。用于捕获并处理客户端错误,提供…

图解HTTP(5、与 HTTP 协作的 Web 服务器 6、HTTP 首部)

5、与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率。 用单台虚拟主机实现多个域名 在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此…

回溯算法-以学生就业管理系统为例

1.回溯算法介绍 1.来源 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤: 1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。 2 、确定易于搜…

[ios-h5]在ios系统浏览器中输入框得到焦点时页面自动放大

问题&#xff1a; 在ios系统浏览器中输入框得到焦点时页面自动放大。 解决&#xff1a; 添加meta标签。 <meta name"apple-mobile-web-app-capable" content"yes" /> <meta name"viewport" content"widthdevice-width, initial-…

循环练习题

思路&#xff1a; 代码&#xff1a; public static void main(String[] args) {double sum0;for (int i1;i<100;i){if (i%2!0){sum1.0/i;}else {sum-1.0/i;}}System.out.println(sum);} 结果为&#xff1a;

每日一练 - RSTP响应端口故障后的处理流程

01 真题题目 在如图所示的网络中&#xff0c; 所有的交换机运行 RSTP 协议&#xff0c; 假如 SWB 的 E 1 接口故障后&#xff0c; RSTP 的处理过程是&#xff1a;(多选) A.SWB 删除 MAC 地址表中以 E 1 为目的端口的端口表项。 B.重新计算生成树&#xff0c;选举 E2 为新的根…

ER模型理论和三范式

ER模型理论和三范式 各种关系多对一一对一一对多多对多 三范式理论函数依赖完全函数依赖部分函数依赖传递&#xff08;间接&#xff09;函数依赖 第一范式&#xff1a;属性&#xff08;表字段&#xff09;不可切割第二范式&#xff1a;不能存在 部分函数依赖(都存在完全函数依赖…

为什么3d模型在透视里面闪烁?---模大狮模型网

在展览3D模型设计中&#xff0c;透视效果是展示空间深度和立体感的重要手段。然而&#xff0c;有时候我们会面对3D模型在特定透视角度下出现闪烁或者失真的问题。本文将深入探讨这一现象的原因及解决方法&#xff0c;帮助设计师们更好地理解和处理这类挑战。 一、为什么3D模型在…

Maven在Windows中的配置方法

本文介绍在Windows电脑中&#xff0c;下载、配置Maven工具的详细方法。 Maven是一个广泛使用的项目管理工具&#xff0c;主要针对Java项目&#xff0c;但也可以用于其他类型的项目&#xff1b;其由Apache软件基金会维护&#xff0c;旨在简化和标准化项目构建过程&#xff0c;依…

Tomcat的安全配置

1、生产环境优化 2、部分漏洞修复 转载自风险评估&#xff1a;Tomcat的安全配置&#xff0c;Tomcat安全基线检查加固-CSDN博客

SpringBoot实战:轻松实现接口数据脱敏

文章目录 引言一、接口数据脱敏概述1.1 接口数据脱敏的定义1.2 接口数据脱敏的重要性1.3 接口数据脱敏的实现方式 二、开发环境三、实现接口返回数据脱敏3.1 添加依赖3.2 创建自定义注解3.3 定义脱敏枚举类3.4 创建自定义序列化类 四、测试4.1 编写测试代码4.2 测试 五、总结 引…

如何在 SwiftUI 中开发定制 MapKit 功能

文章目录 介绍地图样式imagery-map 地图交互地图控件总结 介绍 在上一篇文章中&#xff0c;我们探讨了 SwiftUI 中新的 MapKit API 的基础知识。现在&#xff0c;让我们深入 MapKit API 的定制点&#xff0c;以便根据我们的需求定制地图呈现。 地图样式 新的 MapKit API 引入…