【论文复现】语言模型中的多模态链式推理

在这里插入图片描述


📕作者简介:热爱跑步的恒川,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。
📗本文收录于论文复现系列,大家有兴趣的可以看一看
📘相关专栏C语言初阶、C语言进阶系列、恒川的日常汇报系列等,大家有兴趣的可以看一看
📙Python零基础入门系列,Java入门篇系列、docker技术篇系列、Apollo的学习录系列正在发展中,喜欢Python、Java、docker的朋友们可以关注一下哦!

语言模型中的多模态链式推理

  • 简介
  • 摘要
  • 引言
  • 多模态思维链推理的挑战
  • 多模态CoT框架
  • 多模态CoT模型架构细节
    • 编码模块
    • 融合模块
    • 解码模块
  • 实验结果
  • 运行代码
  • 补充细节
    • 安装包
    • 下载Flan-T5
    • 数据集准备
    • rouge
    • nltk
    • all-MiniLM-L6-v2
    • 运行

本文所涉及所有资源均在这里可获取。

简介

本文主要对2023一篇论文《Multimodal Chain-of-Thought Reasoning in Language Models》主要内容进行介绍。

摘要

大型语言模型(LLM)通过利用思想链(CoT)提示生成中间推理链作为推断答案的基本原理,在复杂推理方面表现出了令人印象深刻的性能。然而,现有的CoT研究主要集中在语言模态上。这篇文章提出了多模态CoT,将语言(文本)和视觉(图像)模式结合到一个分为两个阶段的框架中,该框架将基本原理生成和答案推理分开。通过这种方式,答案推理可以利用基于多模式信息的更好生成的理由。使用多模CoT,模型在10亿个参数下的性能比以前最先进的LLM(GPT-3.5)高出16个百分点(75.17%→91.68%的准确率),甚至超过了ScienceQA基准的人类表现。

引言

阅读一本没有数字或表格的教科书。通过联合建模不同的数据模式,如视觉、语言和音频,我们的知识获取能力大大增强。大型语言模型(LLM)通过在推断答案之前生成中间推理步骤,在复杂推理中表现出了令人印象深刻的性能。这种有趣的技术被称为思维链推理(CoT)。

然而,现有的与CoT推理相关的研究在很大程度上是孤立在语言模态中的,很少考虑多模态场景。为了在多模态中引出CoT推理,文章提倡多模态CoT范式。

给定不同模态的输入,多模态CoT将多步骤问题分解为中间推理步骤(基本原理),然后推断答案。由于视觉和语言是最流行的模式,我们在这项工作中重点关注这两种模式。
在这里插入图片描述
一个示例如图1所示。
通常,有两种方法可以引发多模式CoT推理:
(i)提示LLM
(ii)微调小模型

执行多模式CoT的最直接方法是将不同模态的输入转换为一个模态,并提示LLM执行CoT。例如,可以通过字幕模型提取图像的字幕,然后将字幕与要输入LLM的原始语言连接起来。然而,在字幕制作过程中存在严重的信息丢失;因此,使用字幕(与视觉特征相反)可能会在不同模态的表示空间中缺乏相互协同作用。

为了促进模态之间的交互,另一个潜在的解决方案是通过融合多模态特征来微调较小的语言模型。

由于这种方法允许灵活地调整模型架构以包含多模式特征,在这项工作中研究了微调模型,而不是提示LLM。

我们都知道1000亿参数(100B)下的语言模型往往会产生幻觉推理,误导答案推理。

为了减轻幻觉的挑战,文章提出了多模态CoT,将语言(文本)和视觉(图像)模式结合到一个分为两个阶段的框架中,该框架将原理生成和答案推理分开。通过这种方式,答案推理可以利用基于多模式信息的更好生成的理由。我们的实验是在ScienceQA基准上进行的,这是最新的带有注释推理链的多模式推理基准。实验结果表明,我们的方法比以前的GPT-3.5模型提高了+16%(75.17%→91.68%)。文章的贡献总结如下:
(i) 这项工作是第一次以不同的方式研究CoT推理。

(ii)提出了一个两阶段框架,通过微调语言模型来融合视觉和语言表示,以执行多模式CoT。该模型能够生成信息理性,以便于推断最终答案。

(iii)文章的方法在ScienceQA基准上实现了最先进的新性能,比GPT-3.5的精度高出16%,甚至超过了人类的性能。

多模态思维链推理的挑战

现有研究表明,CoT推理能力可能在一定规模的语言模型中出现,例如超过100B参数的大模型。然而在1B模型中激发这种推理能力仍然是一个悬而未决的挑战,更不用说在多模式场景中了。

这篇文章的重点是在1B左右模型,因为这样可以与常规消费级GPU(例如,32G内存)一起进行微调和部署。接下来将阐述1B模型在CoT推理中失败的原因,并研究如何设计一种有效的方法来克服这一挑战。

下面有个有趣的现象:

在ScienceQA基准上微调了CoT推理的纯文本基准模型。采用UnifiedQA-Base作为主干语言模型。任务为文本生成问题,其中模型将文本信息作为输入,并生成由基本原理和答案组成的输出序列。如图1所示的示例,该模型将问题文本(Q)、上下文文本(C)和多个选项(M)的标记串联作为输入。
为了研究CoT的影响,我们将其与三种变体的性能进行了比较:
(i) 直接预测答案,无CoT(QCM→A)
(ii) 推理,其中答案推理以基本原理为条件(QCM→RA);
(iii) 使用基本原理解释答案推理的解释(QCM→AR)。
在这里插入图片描述
令人惊讶的是,我们观察到准确性下降12.54%(80.40%→67.86%),如果模型在回答之前预测理性(QCM→RA)。结果表明,这些理由可能不一定有助于预测正确的答案。

其中的原因可能是模型在获得所需答案之前超过了最大token限制,或者提前停止生成预测。

然而,文章发现生成的输出(RA)的最大长度总是小于400个token,这低于语言模型的长度限制。因此,对理性危害答案推理的原因进行更深入的探讨是值得的。

为了进一步探究上述情况形成的原因,并深入研究原理如何影响答案预测,本文将CoT问题分为两个阶段,即原理生成和答案推理。基本原理生成使用RougeL分数来评估和答案推理使用准确性评估。表3显示了基于两阶段框架的结果。尽管两阶段基线模型在基本原理生成方面获得了91.76的RougeL分数,但答案推理的准确率仅为70.53%。

在这里插入图片描述
与表2中的QCM→A(80.40%)相比,结果表明,在两阶段框架中生成的基本原理并不能提高答案的准确性。在这里插入图片描述
接着随机抽样50个错误案例,发现模型倾向于产生幻觉推理,误导答案推理。如图2所示的例子,由于缺乏对视觉内容的参考,模型(左部分Baseline)产生了“一个磁体的南极最接近另一磁体的南极”的幻觉。在错误案例中,此类错误的发生率为64%。

文章推测,这种幻觉现象是由于缺乏执行有效的多模CoT所需的视觉上下文。为了注入视觉信息,一种简单的方法是将配对的图像转换为字幕,然后将字幕附加在两个阶段的输入中。然而,如表3所示,使用字幕只会产生边际性能增益(增加0.59%). 然后,通过将视觉特征纳入语言模型来探索一种先进的技术。具体而言,将配对图像输入到DETR模型中,以提取视觉特征。然后在提供给解码器之前融合视觉特征,使用编码的语言表示。有了视觉特征,基本原理生成的RougeL分数提高到了96.97%(QCM→R) ,这相应地有助于提高84.91%的回答准确率(QCMR→A.有了这些有效的理由,幻觉现象得到了缓解——其中62.5%的幻觉错误已经得到纠正(图3(b))。这表明,视觉特征确实有利于生成有效的理由并有助于准确的答案推断。作为两阶段方法(QCMR→A) 表3中的方法比表2中的所有一阶段方法都获得了更好的性能,在多模态CoT框架中选择了两阶段方法。

在这里插入图片描述

多模态CoT框架

基于之前的分析,多模式CoT将语言(文本)和视觉(图像)模式合并到一个两阶段的框架中,以减少幻觉输出,提升模型的效果。

多模式CoT由两个训练阶段组成:
(i) 基本原理生成
(ii) 答案推理

两个阶段共享相同的模型体系结构,但输入X和输出Y不同。
整个过程如图4所示。
在这里插入图片描述
在基本原理生成阶段,模型的输入为X,其中X如下:在这里插入图片描述

其中括号中的前者表示第一阶段中的语言输入,后者表示视觉输入,即图像。

X可以看做实例化为多选推理问题的问题、上下文和选项的拼接,如图4所示。目标是学习一个基本原理生成模型R=F(X),其中R是基本原理。

在答案推理阶段,将基本原理R融入到到原始语言输入Description,因此继续构建第二阶段的语言输入:
在这里插入图片描述

其中◦ 表示拼接。然后,我们将更新后的输入Description馈送到答案推理模型,以推断最终答案Description。

现在回过头来看图4,应该就比较清晰明了了。

多模态CoT模型架构细节

上面我们已经知道了文章的多模态CoT流程是怎么样的了,接下来将分析其中关键的模型架构细节也就是上文提到的F( ),以便我们能够对多模态CoT有更深入的理解。

F( )可以分为三个模块:编码模块、融合模块、解码模块

编码模块

在这里插入图片描述
其中
LanguageEncoder(·)指的就是transformer的encoder部分,输出的就是Transformer编码器中最后一层的隐藏状态。

VisionExtractor(·) 用于将输入图像矢量化为视觉特征,使用的应该是现成的视觉提取模型(DETR),其实应该也是类似transformer的encoder,因为计算机视觉中,也有vision transformer。

融合模块

在编码模块获得到文本和图片的表示后,先进行注意力计算,将文本和图像信息联系起来:在这里插入图片描述
其中Q、K、V分别为Description

然后使用门控融合机制进行特征融合:

在这里插入图片描述
其中Description都是可训练的参数。

解码模块

这里就比较简单,使用的就是transformer的decoderDescription作为输入,输出为我们需要的Y

至此,我们对多模态CoT应该有一个比较深入的了解了,关键内容其实就是使用encoder将文本信息和图像信息表示出来,使用门控融合机制进行特征融合,然后预测出我们需要的结果这个过程就是F( )。

所以多模态CoT完整的流程就是先将初始的文本和图像输入F( )得到图片和原始文本融合之后的CoT,然后再使用CoT的结果增强原始文本信息后得到的结果,再和图片信息输入F( )得到我们最终需要的预测结果。此时再去看图4,应该就一目了然了。

实验结果

在这里插入图片描述
表4显示了主要结果。Mutimodal CoTLarge比GPT-3.5高16.51%(75.17%→91.68%),并超过人类表现。具体而言,在8个问题类别中,Mutimodal CoT Large的得分为21.37%(67.43%→88.80%)的性能增益。与现有的UnifiedQA和GPT-3.5方法相比,这些方法利用上下文中的图像字幕来提供视觉语义,结果表明使用图像特征更有效。此外,根据表5中的消融研究结果,我们的两阶段框架有助于获得优异的结果。总体而言,结果验证了多模态的有效性以及通过两阶段框架使用1B模型实现CoT推理的潜力。

运行代码

在这里不得不吐槽一句,huggingface被禁了,下载模型还得用镜像,这就导致代码里设计模型加载的部分都得自己弄了,再加上有些库版本不兼容,一些代码还需要进行修改…历时3天终于跑通了。在这里插入图片描述
因为我batch_size开的比原文大了2倍,训练的时候显存用的就比较多了,自己硬件是否符号复现条件,可供参考。

测试运行代码(epoch小、batch_size大方便加速调试):

# rationale generation 生成理由
python main.py \--data_root data/ScienceQA/data \--caption_file data/instruct_captions.json \--model declare-lab/flan-alpaca-base \--user_msg rationale --img_type resnet \--bs 16 --eval_bs 32 --epoch 1 --lr 5e-5 --output_len 512 \--use_caption --use_generate --prompt_format QCM-E \--output_dir experiments

训练一个epoch大约30min左右,评估+预测得几h+在这里插入图片描述
得到图像增强理由后,对答案进行增强得到结果:

# answer inference 回答
python main.py \--data_root data/ScienceQA/data \--caption_file data/instruct_captions.json \--model declare-lab/flan-alpaca-base \--user_msg answer --img_type resnet \--bs 16 --eval_bs 32 --epoch 1 --lr 5e-5 --output_len 64 \--use_caption --use_generate --prompt_format QCMG-A \--output_dir experiments \--eval_le experiments/rationale_declare-lab-flan-alpaca-base_resnet_QCM-E_lr5e-05_bs16_op512_ep1/predictions_ans_eval.json \--test_le experiments/rationale_declare-lab-flan-alpaca-base_resnet_QCM-E_lr5e-05_bs16_op512_ep1/predictions_ans_test.json

这段就比较快了在这里插入图片描述

补充细节

安装包

pip install -r requirements.txt

下载Flan-T5

从百度网盘下载Flan-T5模型参数,解压到
declare-lab\flan-alpaca-base\

数据集准备

文本数据集:
https://github.com/lupantech/ScienceQA/tree/main/data
的内容下载到data/ScienceQA/data/

图像数据集:
https://hf-mirror.com/cooelf/vision_features/tree/main
的内容下载到vision_features/
这是已经提取好的图像特征有resnet、vit等,想用哪个下哪个

rouge

metric = evaluate.load(r"/mmcot/mm-cot-main/mm-cot-main/myrouge/evaluate-main/evaluate-main/metrics/rouge")

main.py中rouge的路径要修改成自己的路径

nltk

下载nltk需要的数据

import nltk
nltk.download('punkt')

如果下载不下来,就把需要的tokenizers复制到对应的文件夹
cp -r tokenizers /root/nltk_data

all-MiniLM-L6-v2

在utils_evaluate.py中

model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2').cuda()

如果网络不行需要自行下载模型
下载地址:
https://hf-mirror.com/sentence-transformers/all-MiniLM-L6-v2/tree/main
里面所有的东西放在一个文件夹即可
代码里面模型的路径要改成自己的

运行

注意这里为了测试运行,epoch只设置了1,并且batch size设置的比较大
跑通了之后可以参考原文作者参数进行实验。

# rationale generation 生成理由
python main.py \--data_root data/ScienceQA/data \--caption_file data/instruct_captions.json \--model declare-lab/flan-alpaca-base \--user_msg rationale --img_type resnet \--bs 16 --eval_bs 32 --epoch 1 --lr 5e-5 --output_len 512 \--use_caption --use_generate --prompt_format QCM-E \--output_dir experiments# answer inference 回答
python main.py \--data_root data/ScienceQA/data \--caption_file data/instruct_captions.json \--model declare-lab/flan-alpaca-base \--user_msg answer --img_type resnet \--bs 16 --eval_bs 32 --epoch 1 --lr 5e-5 --output_len 64 \--use_caption --use_generate --prompt_format QCMG-A \--output_dir experiments \--eval_le experiments/rationale_declare-lab-flan-alpaca-base_resnet_QCM-E_lr5e-05_bs16_op512_ep1/predictions_ans_eval.json \--test_le experiments/rationale_declare-lab-flan-alpaca-base_resnet_QCM-E_lr5e-05_bs16_op512_ep1/predictions_ans_test.json

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方链接获取:https://www.aspiringcode.com/content。


  如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞👍作为鼓励,并评论收藏一下,谢谢大家!!!
  制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。

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

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

相关文章

Mysql常用语法一篇文章速成

文章目录 前言前置环境数据库的增删改查查询数据查询所有条件查询多条件查询模糊查询分页查询排序查询分组查询⭐️⭐️关联查询关联分页查询 添加数据insert插入多条记录不指定列名(适用于所有列都有值的情况) 更新数据更新多条记录更新多个列更新不满足条件的记录 删除统计数…

【每日C/C++问题】

一、 结构体和联合体有什么区别?能否在声明过程当中缺省名字?(需要写清楚使用方法) 结构体的各个成员占用不同的内存空间,总大小是所有成员大小之和(结构体字节对齐): typedef str…

Docker小记

Docker就是将程序和环境一同打包成一个独立的容器,容器和容器之间独立,可以理解为一个app,一个手机就是一个pod,一个pod上可以运行多个容器,容器之间共享磁盘和网络,每个容器仍然运行在自己的进程空间中,有…

Spring Boot代理问题

在 Spring Boot 2.x 中,AOP(面向切面编程)默认使用 CGLIB(Code Generation Library)来实现类的代理。CGLIB 代理是通过在运行时生成目标类的子类来增强目标类的方法。这种方式允许对没有实现接口的类进行代理。以下是一…

“不可原谅的漏洞”论文导读

文章《Unforgivable Vulnerabilities》由Steve Christey 2007年撰写,主要探讨了在软件安全领域中那些本可以避免的漏洞,即“不可原谅的漏洞”。这些漏洞通常由于开发者忽视了基本的安全开发实践而存在,且容易被发现和利用。文章提出了建立一套…

正则表达式(Regular Expressions)

正则表达式(Regular Expressions, 简称 Regex)是一种用于字符串匹配和处理的强大工具,通过特定的模式(Pattern)描述字符串。它在验证、替换、分割、提取等操作中非常有效。以下是一些基本概念和常见使用场景&#xff1…

文件夹无法访问?全面解析与高效恢复策略

一、文件夹无法访问的困境 在日常的计算机使用中,我们时常会遇到文件夹无法访问的尴尬情况。这种故障表现为双击文件夹时,系统毫无反应,或者弹出“无法访问,拒绝访问”的错误提示。更令人头疼的是,有时文件夹内的文件…

设计模式 策略模式 场景Vue (技术提升)

策略模式 (建议复制编辑器查看更佳) 在给定的 Vue.js 组件代码中,根据optionKey的不同值,展示了不同的表单内容并定义了不同的表单验证规则。在这里,optionMap对象内部定义了不同的策略(addAccount、editAccount、editPassword&am…

万字长文详解Hive聚合函数 grouping sets、cube、rollup原理、语法、案例和优化

目录 原理与语法 使用场景 多维度报表生成 复杂的数据分析 实际案例 原理与语法 与GROUPINGSETS的区别 实际案例 原理与语法 与CUBE的对比 实际案例 执行效率比较 优化建议 Hive提供了三个强大的高级聚合函数: GROUPING SETS 、 CUBE 和 ROLLUP ,用于处理复杂的…

长短期记忆网络(LSTM)如何在连续的时间步骤中处理信息

长短期记忆网络(LSTM)如何在连续的时间步骤中处理信息 长短期记忆网络(LSTM)是一种高级的循环神经网络(RNN),设计用来解决传统RNN在处理长时间序列数据时遇到的梯度消失或爆炸问题。LSTM通过其…

Spring @RequestMapping 注解

文章目录 Spring RequestMapping 注解一、引言二、RequestMapping注解基础1、基本用法2、处理多个URI 三、高级用法1、处理HTTP方法2、参数和消息头处理 四、总结 Spring RequestMapping 注解 一、引言 在Spring框架中,RequestMapping 注解是构建Web应用程序时不可…

飞牛OS在Docker中安装ODOO ERP系统

从后台的Docker镜像库安装一直报错误,无法安装成功,使用以下命令进入OS系统,以下是执行脚本: Start a PostgreSQL server $ docker run -d -e POSTGRES_USERodoo -e POSTGRES_PASSWORDodoo -e POSTGRES_DBpostgres --name db postgres:15 S…

cookie、session、http简单理解

Cookie:以key-value键值对的形式存储一些文本信息数据 并将数据保存在客户端(浏览器) sessionid(身份) 数据库中有一个seesion表,存放着所有的Session数据, 而sessionid就对应数据库数据这个id,服务器找到对应id的Ses…

VLAN间通信以及ospf配置

目录 1.基础知识介绍 1.1 什么是VLAN? 1.2 VLAN有什么用? 1.3 不同VLAN如何实现通信? 1.4 什么是路由汇总? 1.4.1 路由汇总的好处: 2. 实验 2.1 网络拓扑设计 2.2 实验配置要求 2.2.1 三层交换配置&#xff…

Redis的数据结构

一、Redis概述 Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与MySQL数据库不同的是&a…

十四届蓝桥杯STEMA考试Python真题试卷第二套第一题

来源:十四届蓝桥杯STEMA考试Python真题试卷第二套编程第一题 题目描述: 给定一个字符串,输出字符串中最后一个字符。 输入描述: 输入一个字符串 输出描述: 输出字符串中最后一个字符 样例输入: hgf 样…

Spring Boot 注解大全:全面解析 Spring Boot 常用注解及其应用场景

Spring Boot 注解大全:全面解析 Spring Boot 常用注解及其应用场景 简介 Spring Boot 是一个基于 Spring 框架的简化开发框架,它旨在简化 Spring 应用的初始搭建和开发过程。Spring Boot 提供了一系列的注解,使得开发者可以更加方便地进行应用开发和配置。本文将详细介绍 S…

C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(4)

8.1、实现分区 在模块接口分区文件中不需要声明分区,也可以在模块实现分区文件中进行声明,在一个以.cpp为扩展名的正常源代码文件中,在这种情况下,它是一个实现分区,有时候叫内部分区。这样的分区无法导出,…

随着 AI 技术的不断发展,AI大模型正随着 AI 技术的不断发展,AI大模型正

随着 AI 技术的不断发展,AI大模型正在重塑软件开发流程,从代码自动生成到智能测试,未来,AI 大模型将会对软件开发者、企业,以及整个产业链都产生深远的影响。欢迎与我们一起,从 AI 大模型的定义、应用场景、…

数组对象常用方法合集

1、运算扩展符 ES6通过扩展元素符<font style"color:rgb(71, 101, 130);">...</font>&#xff0c;好比 <font style"color:rgb(71, 101, 130);">rest</font> 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 conso…