一、项目的背景与动机
今年初的OPEN AI的GPT-4展示出了前所未有的多模态能力。比如GPT-4能够解释一个有趣的图为什么好笑。图片是一个松鼠拿着一个相机,按照人类的理解松鼠一般是吃坚果的,但我们不会想到松鼠会像一个人一样用照相机,这正是这张图片有趣的地方。
另外一个非常出名的有趣的demo是主持人像GPT-4输入了一张照片,这张照片是一个网站的简单草图,GPT-4能够通过识别这张照片输出一段构建网站的代码,并且这个代码最终是能够成功运行的,并生成出了这个网页。
这样的能力是之前所有的多模态模型,包括比如DeepMind’s Flamingo或是Saleforce’s Blip-2,都完全无法实现的。但是OpenAI没有给出任何GPT-4的技术细节,当时在OpenAI官方的technology report里,没有放出任何关于模型参数、模型大小、计算资源或是数据库构建等信息,没有人知道他们是怎么实现的。
因此我们非常好奇,GPT-4这样非常神奇,非常强大的能力背后的秘密来源是什么?因为我们做deep learning的核心是数据。可能一个比较直观的想法就是也许他们有一个非常复杂非常大的数据库,这个数据库涵盖了各方面的多模态数据,比如GPT-4能够根据网站的草图写网站代码,那么是否他们的数据库就含有通过网站草图构建网站代码这样一一对应的数据对。或者他们有一些秘密的模型结构能够实现这样的能力,亦或者GPT-4的语言能力远胜于之前的所有模型。
在回答这个问题之前,先来介绍一下我们之前做的多模态相关工作ChatCaptioner。当时我们做了一个大型语言模型之间的对话系统。我们用这样的一个对话系统去生成一张图片更详细的描述。当时是市面上第一家做大型语言模型对话的工作。
我们当时发现一个非常有意思的点,当时最强的多模态态模型Blip-2没有办法直接生成一张图片的详细描述,比如上图右侧是几只小猫在篮子里的图片,如果我们直接问Blip-2请详细描述这张图片,它是无法详细描述的,它只能说图片中有一个篮子,里面有小猫。但实际上它是能够看得到这张图片的详细信息的,如果我们尝试以这张图片的细节信息去问它,篮子是什么颜色?它会回答篮子是棕色。这个篮子有几只小猫,它会说有四只小猫。因此这个模型是能够看到或者获取到这些信息的。
基于这个问题我们用ChatGPT,使用Prompt提示工程的方法,让ChatGPT持续的就一些图片的细节进行提问。ChatGPT常见的使用方法是使用它回答问题,但我们反其道而行之,让它自动提问,这个过程我们称为automatic questioning自动询问。如何实现这个过程呢?我们告诉ChatGPT我有张图你看不到它(因为ChatGPT本身不具备多模态的能力),但是你可以问我这个图的问题,我可以回答你,你的任务就是要通过向我提问,让你能够最大化地了解这个图片的详细信息。这样,ChatGPT便能基于一张它无法看到的图片提出一些关于图片细节的问题,同时Blip-2回答ChatGPT提出的问题。
最后两个模型之间进行多轮对话后,再让ChatGPT总结对话,生成一段非常详细的描述,原本Blip-2会说篮子里面有猫,但现在它便能回答图片里有一个圆形的编织篮,有四只黑白相间的小猫在里面,篮子是棕色的,放在绿色的草地上。
之后基于这个工程,我们将它扩展到了video上,如果大家感兴趣可以扫图片上的二维码获取到相关代码,代码库在github上大概有300多星。
在这项工作中,我们发现Blip-2的视觉能力非常强,它能够获取到很多图片的细节,并描述出,但它的语言能力却是弱项,它无法遵循用户的语言指令去执行任务。因此我们产生了一个想法,语言能力是它的多模态能力中的一个瓶颈,如果我们将其视觉能力更进一步提升,那么就能得到一个更为强大的视觉语言模型。回到最初关于GPT-4视觉识别能力来源的猜想,更强大的视觉语言能力是否就能够具备GPT-4这样的能力。
二、实现MiniGPT-4的过程
为了验证这个猜想,我们提出了MinGPT-4。
给出一张简单的图片,一个火烈鸟站在水面上的logo。我们首先使用Blip-2模型的视觉能力模块(由一个Q-Former+ViT组成),且不训练它。我们再加入当时最强的开源语言模型,伯克利的Vicuna,同样也不训练它。我们使用一个可训练的线性层将Blip-2视觉模块的输出映射到Vicuna的输入空间。同时不仅仅输入图片数据,也需要输入文本数据。最终我们希望这个模型能够根据输入的图片内容和具体文本提问或者介绍生成一个详细的回应,这样我们就得到一个非常简单的系统。
但这个系统如何训练它呢?最初我们采用经典的预训练方法,使用Image Caption数据库,包括Laion,CC,和SBU。模型的输入就是一张简单的图片,模型的输出要回归到数据库中的图片描述。其中有一个例子:一个女生要弯腰穿过树林的图片,其中有比较简短的图片描述:Young woman trekking through the forest。在这一阶段,我们大概使用4张A80、A100的显卡跑了10个小时,我们的模型就能够看懂图片。
接下来我们给出一个示例,输入一张图片,内容是一个人和一只狗,模型能够输出A man sits with his dog on the ,一个人和他的狗坐在一起。虽然这个模型能够看懂图片,但其生成语言的能力还是有所欠缺。因为MiniGPT-4的语言能力来自开源的模型,且我们并未进一步训练。这个开源模型本身的语言能力是接近于ChatGPT的,但我们将这个视觉数据输入到模型中时,它的讲话能力便受到很大的影响,大家可以看到对话中模型并未完整地生成对话。
在进一步的测试中,当前模型最大的问题在于语言生成的不完整,此外它还容易生成重复的语言,并反复重复,最终达到生成字符数的上限。另外我们发现现在这个系统非常喜欢讲韩语,用英语提问,它的答案内容会在英语和韩语中间来回切换,还附带一些意义不明的字符。
但如果我们的提示工程较为详细,这个模型还是能够生成一些较为准确的输出,但模型不太稳定,因此我们需要找到一个方法来修复这个问题。
为什么会有这个问题?实际上我们发现我们的训练数据和最终测试使用的数据存在着非常大的差异,原因在于这个模型的训练数据是较为传统的数据库,训练方法也较为传统。训练时输入一张图,并给出一个描述,但实际测试我们是以多模态聊天的方式进行测试,不仅仅输入图片还会输入文字,我们希望这个模型能说会道,回答的范围要尽可能详细,这样的模型用户才能满意。
因此我们尽可能缩小两者之间的差异,这样就进入了第二个阶段。我们需要一个文本内容较长,且符合人类喜好的数据库,在当时,这样的数据库并不存在,因此我们需要自行建立,这个过程又分为三步:
第一步,基于我们已经训练好的这个模型,给定一张图片,输入一段Prompt:给出尽可能多的细节,输出你看到的东西。模型可以不太稳定地生成一段文字,同时我们对生成内容的长度进行检查,并生成第二段内容。将第一段内容和第二段结合生成一段关于图片细节的描述,但同样存在噪音。比如语言的切换、奇怪的符号,这些是无法通过调整Prompt来优化的。因此我们运用ChatGPT做后处理。我们告诉ChatGPT我们有一段有语病的话,ChatGPT要去修复这个段落中的语病,移除任何重复的句子、无意义的符号、非英语的句子,重写不完整的句子,并要求它按照我们的格式输出,让其帮我们修复第一步拿到的数据中的语病。但ChatGPT也并不完美,也会生成一些错误的内容。
第三步,获取到ChatGPT的输出,人工标注了500个结果,虽然还是有问题但这些问题变得有规律可寻,将错误类型分类,并针对类型写了一些强规则的代码,把错误自动抓取,并通过规则改正与修复错误。
针对一些长尾的错误,像数据质量太差,无法被修复,我们通过检测错误数据的特征,直接剔除。
最终我们得到右下角所示的数据库,输入一个老人照片,能够输出详细的描述。经过一系列处理,我们最终得到了大约3500对图文对。
数据库建设完成后,我们使用数据库进行训练,第一个训练阶段时,通过简单的图片生成比较短的文本,尽可能减少训练与测试之间的差异。因此二阶段我们将图片使用模板包装,尽可能去模拟真实的测试环境,将模型回归新建数据库。
第二个阶段总共有数据3500对,训练时间大概是7分钟左右,训练前模型只能生成半句话,训练后同样的问题,便能生成一段较长的描述,之前的问题已经被很好的规避,最终得到了我们上线的Mini GPT-4的模型。
三、MiniGPT-4具备的能力demo
接下来展示一些Mini GPT-4所具备的能力。输入一张国内乐队音乐会现场的照片。输入问题便能通过一句话得到描述,它就会说图上是一对音乐家在玩电吉他,在一大群观众面前,观众在看他们表演,并且也在用相机拍照,后面有个屏幕用中文展示着这个乐队的名字,整个氛围是非常生动有力量的。
另外,Mini GPT-4也可以解释图片幽默的地方,一只很累的狗躺在地上看起来很累,也能看到上面写的字,并理解笑点。
此外,这个模型也具备了类似于GPT-4的阅读网站建设草图,生成网站代码的能力。
输入一张新奇台灯的图片,让它写一个广告,它可以输出一段非常有吸引力的文案。
输入一张奇怪的图片,一个仙人掌在一个冰湖上,问这个图在现实世界中常见吗?它会说这个图在现实中非常少见,几乎不可能看到仙人掌在冰面上,这个图有可能是电脑创作,或者有可能是伪造的照片。
输入一张《教父》电影的剧照,它能看得懂这是《教父》的照片,输出一段剧情介绍。
输入一张照片,照片上是一个植物,这个植物有点问题,我们问植物怎么了?我应该怎么办呢?它首先能看得到植物上有棕色的斑点,并且知道这是由真菌感染造成的,然后它会告诉你可以用杀真菌的药剂去治疗你的植物,以及具体的步骤。
四、存在的不足
接下来进入Limitations的讨论环节,因为Mini GPT-4是基于开源模型而来,因此也存在一些问题。一个典型的例子是当我们给一张餐厅内部装潢的照片并让它详细描述这张照片,大概可能有70%—80%的概率情况下,这个模型会说桌子上有白色的桌布,而实际上照片里并没有桌布。
这个模型它能看得到这个图里有什么东西,但是它看不清这个东西区域在哪里,看不到位置信息。比如问这个摄影师是在图片左边还是在右边,就给出了错误的答案。
在之前的解释图片为什么好笑和构建网站的demo中讲到,Mini GPT-4是能够看得见图片里的文本的,但是有个前提就是这个文本要够大。如果这个文本不够大,模型不但无法识别,还会幻想编造出一些完全不符的东西。
五、问答环节
Q1:第二阶段的数据训练中图文对数据量是3500,其中的Prompt的类型有多少,如果有很多种类型的话,都是人工设计的吗?
A1:我们就是写了一个Prompt,让ChatGPT生成Prompt的同义词和近似的句子,具体的数量最终使用了4个。
Q2:如果有多个图片输入怎么办?
A2:我们在训练的时候其实是没有在多个图片输入。但是我们的模型是能够输入多个图片,每一张图片都会转成32个token并查询具体的内容,但这样多图片的能力并不强,因此我没有对此进行训练。但我们的模型具备这样的能力。
Q3:如果只用第二阶段数据训练效果是怎么样的呢?
A3:这个问题其实关于第一阶段训练和第二阶段训练,他们具体都是做什么。ChatGPT第一段是GPT3去在一个非常庞大一个数据库上补一圈,第二阶段是在GPT3上的基础上做instruction翻译,加上一些训练,我们的模型也是如此。一般模型训练也是如此,第一个阶段的训练目的是为了让模型获得新知识看懂一张图,第一阶段需要大量数据,它需要训练16个小时,四张卡。
然后第二阶段的目的是第一个第一阶段不一样,第二阶段并聚焦在如何让这个模型学习到新知识。第二个阶段的目的其实是改变模型的行为方式,因此我们使用少量数据去调整模型生成结果的行为,重新提升模型原有能力。如果只进行第二阶段的训练,这个模型是无法直接使用的,第二阶段的前提是模型能够识别图片能力的基础之上的。
Q4:第二个阶段的数据需求量比较小,是不是跟lima的结论类似?
A4:这个模型训练也是如此。
Q5:对于具体的文本,比如数字公式有比较好的方法。
A6:首先一个专门的数据库,比如说有现在会有一些专门的OCR数据库,然后有一些专门的数学这样数据库。我觉得如果在专门的数据库上翻译,肯定会有一定的提升。我们现在的模型的分辨率不够大比如说你给一个草稿纸上面都是数学公式的话,如果给一个224的像素格式,肯定是不足以能够看清这个上面的数学公式。两方面,一方面是图像格式要高清。第二个方面,可能专门的一些数据库翻译效果更好。
Q6:图像的编码对于Prompt非常关键,对于图像的编码通过是完整编码还是细节,现在是否有更好的方式?
A7:这个模型就是一个标准的Vit加上Q-Former,输出总是32个token,这个方法挺好,但是我个人会觉得它更像是什么?有个逻辑总结图片信息,再输入到后面的模型中,如果把上Q-Former丢掉会更好,但我个人更喜欢另一种做法。
还没有评论,来说两句吧...