Task3 学习笔记
前情提要:阿里云的人打电话过来了……
本次学习任务:学习官方对赛题的解读和上分思路
赛事进阶解读
简要概况
比赛的目的在于如何让数据变得更加优质,能够让模型最大化地利用数据中的信息。因此,考察的是数据的合成与清洗。
在多模态大模型上,数据的合成与清洗则是让它拥有更强的图文理解能力。
基础模型:Mini-Gemini,简称MGM
关注点:
-
预训练阶段:数据的清洗与训练。
-
指令微调阶段:数据集必须保持固定。
注意事项
-
什么是“必须包含合成的过程”?
即要求不能只是对原数据进行删改,而是要根据原有的数据合成出新的数据。若方案只包含删改则会被判定为无效的方案。
-
Mini-Gemini是什么?
Mini-Gemini是一个基于LLaVA的多模态大模型,它是一个简单而有效的框架,用于增强多模态视觉语言模型(VLMs)。
遇事不决,直接一手资料:通过GitHub和本次直播进行学习
正如同之前所提及的:MGM主要有两个阶段,即之前提到的预训练阶段和指令微调阶段。
对于每一个阶段,都需要如下的工作:
-
由于本次以及此模型仅考虑图像和文字领域,因此需要一个视觉编码器,而通过对深度学习的进一步探究,我们会发现目前主流的方案为提出了注意力机制的Transformer架构。我们需要使用一个视觉编码器对特征进行提取。此处使用的为clip或者open-clip
好巧不巧,Transformer架构为了将“注意力”量化,本身就存在一个基于三角变换的编码解码机制。通过对Transformer已有架构的利用,可以大大减少工作量。
-
接下来将已经提取出的数据投入LLM,此时需要将视觉特征和LLM映射到同一个特征空间。此时LLM使用多层感知机作为映射层,将视觉数据映射到语言特征空间上。
每一个阶段又有一些不同:
-
预训练阶段:负责训练映射层,以达到模态对齐的目的。此时LLM会将提示文本和图片结合起来,此时将文字的token和图片的token投入到“注意力机制”中进行学习。一般而言,此时没有梯度回传
-
指令微调阶段,负责让上游适应下游的情景。此时会加入更多的数据对Projection层和大模型同时进行训练。数据集会变得更加开放,同时训练的难度会提高。
所以,出于计算的开销,预训练阶段的占用和耗时均小于指令微调阶段,同时为了确保不会爆显存,指令微调阶段的batchsize官方推荐小于预训练阶段。
但是,我为了保险,两个一起调小了。
数据构成
数据集的组成如下:
总述:这是MGM原数据集的子集,从1.2M的数据中取出400K作为种子。 因此,我们获得了两个数据来源:
-
SBU-558K:caption由BLIP生成,长度较短,占比绝大多数。
-
ALLaVA-4V:caption由GPT4V生成,长度较长,占比极小。
Baseline的官方解读
需要完成的任务:Image to Text
思路:使用data-juicer中预设好的image_captioning_mapper进行处理
-
使用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,优势不在它)
-
使用stable-diffusion模型根据原caption和图片,生成新的图片。
训练脚本的官方解读
分为标准和快速两种,主要在于数据量的区别,为了能够投入如此多的数据同时不影响计算的速度。人们通过矩阵将数据通常一次性或者尽量少的分块投入。只是,全量和快速之间,由于数量差异过大,所以训练时所占内存、显存也是天差地别。
实际上,多卡的提升……由于消费级显卡4090上锁了,现在不能使用nvlink的情况下,仅显存的提升的确可以确保训练的成功,但是对于速度的提升而言,意义不是很大。建议有条件的,租用专业显卡。
训练流程
-
参数验证:检验参数的合法性,通常由于download.sh运行不完全导致的文件缺失(特别是jsonl文件),会直接在此处显示并打断。
-
数据转换:jsonl格式并不是模型正式训练时所能用到的json格式,因此需要进行数据转换。
-
数据采样:从转换出来的json中提取数据。
Data-juicer算子自定义
Data-juicer为我们提供了:
-
标准接口
-
数据基础处理能力
当我们需要自定义算子时,我们的是基于标准算子基类进行改造。
以文本长度过滤算子为例:
-
通过标准算子类实现compute_stats以及process两个方法
-
将算子注册到程序中
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中,寻找字符的重复率、困惑度等进行筛选。
多样性上,则是统计更多的词法组合,让数据更加的多元化。
因此,我们得到了以下思路:
-
官方推荐的工具,先拿来使用,在对算子进行筛选时,不要太贪心地追求最Top的算子
-
先在单模态上将数据进行合成、清洗。
-
为了能够提高整体数据的质量,可以考虑将目前表现较好的数据进行多次利用。
-
为了节省金钱,先使用快速的baseline进行实验,等确认了一些较好的组合后再使用全量的baseline进行验证。
-
最后,不要相信最后的数据,最好再清洗一遍。