Datawhale AI夏令营-多模态大模型数据合成Task3 学习笔记

Task3 学习笔记

前情提要:阿里云的人打电话过来了……

本次学习任务:学习官方对赛题的解读和上分思路

赛事进阶解读

简要概况

比赛的目的在于如何让数据变得更加优质,能够让模型最大化地利用数据中的信息。因此,考察的是数据的合成与清洗。

在多模态大模型上,数据的合成与清洗则是让它拥有更强的图文理解能力。

基础模型:Mini-Gemini,简称MGM

关注点:

  1. 预训练阶段:数据的清洗与训练。

  2. 指令微调阶段:数据集必须保持固定。

注意事项

  1. 什么是“必须包含合成的过程”?

即要求不能只是对原数据进行删改,而是要根据原有的数据合成出新的数据。若方案只包含删改则会被判定为无效的方案。

  1. Mini-Gemini是什么?

Mini-Gemini是一个基于LLaVA的多模态大模型,它是一个简单而有效的框架,用于增强多模态视觉语言模型(VLMs)。

遇事不决,直接一手资料:通过GitHub和本次直播进行学习

正如同之前所提及的:MGM主要有两个阶段,即之前提到的预训练阶段和指令微调阶段。

对于每一个阶段,都需要如下的工作:

  1. 由于本次以及此模型仅考虑图像和文字领域,因此需要一个视觉编码器,而通过对深度学习的进一步探究,我们会发现目前主流的方案为提出了注意力机制Transformer架构。我们需要使用一个视觉编码器对特征进行提取。此处使用的为clip或者open-clip

好巧不巧,Transformer架构为了将“注意力”量化,本身就存在一个基于三角变换的编码解码机制。通过对Transformer已有架构的利用,可以大大减少工作量。

  1. 接下来将已经提取出的数据投入LLM,此时需要将视觉特征和LLM映射到同一个特征空间。此时LLM使用多层感知机作为映射层,将视觉数据映射到语言特征空间上。

每一个阶段又有一些不同:

  1. 预训练阶段:负责训练映射层,以达到模态对齐的目的。此时LLM会将提示文本和图片结合起来,此时将文字的token和图片的token投入到“注意力机制”中进行学习。一般而言,此时没有梯度回传

  2. 指令微调阶段,负责让上游适应下游的情景。此时会加入更多的数据对Projection层和大模型同时进行训练。数据集会变得更加开放,同时训练的难度会提高。

所以,出于计算的开销,预训练阶段的占用和耗时均小于指令微调阶段,同时为了确保不会爆显存,指令微调阶段的batchsize官方推荐小于预训练阶段。

但是,我为了保险,两个一起调小了。

数据构成

数据集的组成如下:

总述:这是MGM原数据集的子集,从1.2M的数据中取出400K作为种子。 因此,我们获得了两个数据来源:

  1. SBU-558K:caption由BLIP生成,长度较短,占比绝大多数。

  2. ALLaVA-4V:caption由GPT4V生成,长度较长,占比极小。

Baseline的官方解读

需要完成的任务:Image to Text

思路:使用data-juicer中预设好的image_captioning_mapper进行处理

  1. 使用BLIP2模型对图片进行recaption

转换示例:a picture of prince and princess kate's mugs in a frame -> the royal wedding mug is shown on red background

此处是将一个英文句子的主动语态更改为被动语态,但是,此处还是丢失了一些信息:场景作为图片的本质,公主和王子的存在,以及公主的名字Kate。难道一场盛大的婚礼一定只是王子和公主,尤其是名为Kate的公主才能办吗?王侯将相宁有种乎?

不过这只是一个2B的模型,我们也不能强求什么。甚至它哪怕丢失了如此多的信息后,token依旧有些过长(2057对2048,优势不在它)

  1. 使用stable-diffusion模型根据原caption和图片,生成新的图片。

训练脚本的官方解读

分为标准和快速两种,主要在于数据量的区别,为了能够投入如此多的数据同时不影响计算的速度。人们通过矩阵将数据通常一次性或者尽量少的分块投入。只是,全量和快速之间,由于数量差异过大,所以训练时所占内存、显存也是天差地别。

实际上,多卡的提升……由于消费级显卡4090上锁了,现在不能使用nvlink的情况下,仅显存的提升的确可以确保训练的成功,但是对于速度的提升而言,意义不是很大。建议有条件的,租用专业显卡。

训练流程

  • 参数验证:检验参数的合法性,通常由于download.sh运行不完全导致的文件缺失(特别是jsonl文件),会直接在此处显示并打断。

  • 数据转换:jsonl格式并不是模型正式训练时所能用到的json格式,因此需要进行数据转换。

  • 数据采样:从转换出来的json中提取数据。

Data-juicer算子自定义

Data-juicer为我们提供了:

  1. 标准接口

  2. 数据基础处理能力

当我们需要自定义算子时,我们的是基于标准算子基类进行改造。

以文本长度过滤算子为例:

  1. 通过标准算子类实现compute_stats以及process两个方法

  2. 将算子注册到程序中

Data-juicer Sandbox Insight

数据菜谱迭代

此处以K-Sigma为例。通过正态分布的统计学知识计算标准差和平均值,然后按照设定好的标准过滤掉异常值。

只是手动调参是不行的,因此,自动进行启发式搜索和贝叶斯优化十分重要。

自从手动调参还不如别人贝叶斯优化分数一半后,我深知时代变了。

反馈循环

根据数据-模型协同开发的不同阶段的反馈来提升数据质量。

从这个定义上看很像一个强化学习,实际上还真是,每次训练时对于数据的质量进行打分,并根据分数来确定下一次调整的松紧程度。

上分思路

别嘻哈了,刚刚提供的新东西都可以先去试着用一下,别拿自己的手和挑战计算机的饭碗了。

另外,也许在贪心算法的驱使下,会通过将所有的Top算子进行组合并将其视为一个最佳的算子——但是,通过本次学习中老师提供的证明反馈,这种局部最优解并一定是全局的最优解

同时,多模态根据实验表明给数据进行去重意义并不大

  • 最核心的还是最初的模态间对齐,当内容更加一致时,效果越好。因此我们可以考虑使用更加强大的生成模型,并生成和原文内容更加贴近的数据。

image_text_similarity_filter参数是决定这个效果的关键参数之一,我们可以通过CLIP_similarity判断。

根据经验,这个值得达到至少0.3时才能达到较优效果。因此我们可以通过调整CLIP_similarity下限去筛掉更多的无效数据。

image_text_matching_filter参数也很重要,它反应了图文的匹配程度。

phrase_grounding_recall_filter: 图文内容召回率,通过从图片中提供关键物品,然后检测生成的文本中是否有相关的物品。

当然这个分数超过0.5时就已经很不错了。

  • 然后就是对于数据的分析器Analyzer,重在质量和多样性

质量上,通过stat分布以及k-sigma中,寻找字符的重复率、困惑度等进行筛选。

多样性上,则是统计更多的词法组合,让数据更加的多元化。

因此,我们得到了以下思路:

  1. 官方推荐的工具,先拿来使用,在对算子进行筛选时,不要太贪心地追求最Top的算子

  2. 先在单模态上将数据进行合成、清洗。

  3. 为了能够提高整体数据的质量,可以考虑将目前表现较好的数据进行多次利用。

  4. 为了节省金钱,先使用快速的baseline进行实验,等确认了一些较好的组合后再使用全量的baseline进行验证。

  5. 最后,不要相信最后的数据,最好再清洗一遍。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值