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

在这里插入图片描述


📕作者简介:热爱跑步的恒川,致力于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。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker:网络 Network

Docker:网络 Network Docker 网络架构CNMLibnetwork驱动网络类型 命令docker network lsdocker network inspectdocker network createdocker network connectdocker network disconnectdocker network prunedocker network rm 网络操作bridgehostcontainernone Doc…

局部敏感哈希(LSH)简介

0. Intro \textbf{0. Intro} 0. Intro 1️⃣ LSH \text{LSH} LSH的优势:在 λ \lambda{} λ较大的度量空间,也可以高效回答 c-ANN \text{c-ANN} c-ANN查询问题 2️⃣一些预备知识 多重集并集 (multi-set union): \text{(multi-set union): } (multi-set…

论文 | Evaluating the Robustness of Discrete Prompts

论文《Evaluating the Robustness of Discrete Prompts》深入探讨了离散提示(Discrete Prompts)的鲁棒性,即离散提示在自然语言处理任务中面对不同扰动时的表现。研究特别关注离散提示在自然语言推理(NLI)任务中的表现…

Linux 之 信号概念、进程、进程间通信、线程、线程同步

学习任务: 1、 信号:信号的分类、进程对信号的处理、向进程发送信号、信号掩码 2、 进程:进程与程序的概念、进程的内存布局、进程的虚拟地址空间、fork创建子进程、wait监视子进程 3、 学习进程间通信(管道和FIFO、信号、消息队列…

Vue:模板 MVVM

Vue:模板 & MVVM 模板插值语法指令语法 MVVMdefineProperty数据代理 模板 Vue实例绑定一个容器,想要向容器中填入动态的值,就需要使用模板语法。模板语法分为插值语法和指令语法。 插值语法 插值语法很简单,使用{{}}包含一…

C++中的继承——第二篇

一、继承与友元 友元关系不能够继承(就像父亲的朋友不一定是自己的朋友) 具体实现起来就是父类的友元可以访问父类的成员,但是不可以访问子类的成员 二、继承与静态成员 子类的静态成员变量本质上与父类的是同一份,存储在静态…

uni-app发起请求以及请求封装,上传及下载功能(六)

文章目录 一、发起网络请求1.使用及封装2. https 请求配置自签名证书3.拦截器 二、上传下载1.上传 uni.uploadFile(OBJECT)2. 下载 uni.downloadFile(OBJECT) 一、发起网络请求 uni-app中内置的uni.request()已经很强大了,简单且好用。为了让其更好用,同…

SLAM定位总结

文章目录 一、激光定位1.A-LOAM (2018)2.F-LOAM (2021)3.CT-ICP (2022)3.DLO:Fast Localization with Dense Point Clouds (2022)4.kiss-ICP :In Defense of Point-to-Point ICP Sim…

大端存储和小端存储

大端存储和小端存储 在计算机系统中,数据在内存中的存储方式并不是唯一的。对于多字节的数据类型(如 int、float 等),计算机可以以不同的方式在内存中存储它们。这些存储方式通常分为两种:大端存储(Big-En…

【数据结构二叉树】C非递归算法实现二叉树的先序、中序、后序遍历

引言: 遍历二叉树:指按某条搜索路径巡访二叉树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。 除了层次遍历外,二叉树有三个重要的遍历方法:先序遍历、中序遍历、后序遍历。 1、递归算法实现先序、中序、后…

【LeetCode】移除链表中等于设定值的元素、反转链表

主页:HABUO🍁主页:HABUO 🌜有时候世界虽然是假的,但并不缺少真心对待我们的人🌛 1. 移除链表中设定值的元素 题目:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所…

程序员日志之DNF手游1023版本活动补充

目录 传送门正文日志1、概要2、正文 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品) SpringBoot3框架(精品) MyBatis框架(精品) MyBatis-Plus SpringDataJPA SpringClo…

macOS开发环境配置与应用开发教程

macOS开发环境配置与应用开发教程 引言 macOS是一个强大的操作系统,广泛应用于软件开发,尤其是iOS和macOS应用开发。本文将详细介绍如何配置macOS开发环境,并通过实例演示如何进行应用开发。希望通过这篇文章,帮助读者快速上手m…

提高交换网络可靠性之认识STP根桥与端口角色

转载请注明出处 该实验旨在学习如何选举根桥与识别端口角色。 1.三台交换机按要求连线,改名,分别为S1,S2,S3,以S1为例: 2.在S1上配置优先级为28672 同理,在交换机S2和S3上配置其优先级为32768&…

基于大数据的热门旅游景点数据分析系统的设计与实现

作者主页:编程千纸鹤 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测

【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测 目录 文章目录 【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果(包含重要数据与结论)主要参考工作后续优…

A012-基于Spring Boot的私房菜定制上门服务系统的设计与实现

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统私房菜定制上门服务系统信息管理难度大,容错率…

ios 快捷指令扩展(Intents Extension)简单使用 swift语言

本文介绍使用Xcode15 建立快捷指令的Extension,并描述如何修改快捷指令的IntentHandler,带参数跳转主应用;以及展示多个选项的快捷指令弹框(配置intentdefinition文件),点击选项带参数跳到主应用的方法 创建快捷指令 快捷指令是…

【MacOS实操】如何基于SSH连接远程linux服务器

MacOS上远程连接linux服务器,可以使用ssh命令pem秘钥文件连接。 一、准备pem秘钥文件 如果已经有pem文件,则跳过这一步。如果手上有ppk文件,那么需要先转换为pem文件。 macOS 的默认 SSH 客户端不支持 PPK 格式,你需要将 PPK 文…

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域,流量和搜索引擎优化(SEO)是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统,旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为,优化关键词排名,并…