动机: 初步了解LLAVA模型结构, 数据集构建
LLAVA是什么?
一个具有自然语言分析和图片分析能力的大模型.
可以分析文本, 提问.
也可以分析图片, 对图片进行分析, 识别.
LLAVA体验:llava.hliu.cc/
缺陷: short-form answers 不能很好生成.
eg:
Q: 图片 + 这件衣服的颜色是什么? 用一个词或一个短语来回答.
A: 黄色.
模型结构认识
输入为两部分, 一部分是图片encode得到的向量, 一部分是文本encode得到的向量.
cat到一起, 输入到大模型中.
相关代码:
解释:
prompt里面包含了多个段落+图, 按照标签进行分割.
对每个段落进行分词处理, 插入特殊标记, 以便后续能将图像信息插入其中.
为什么已经有标记了, 还需要重新再插入IMAGE_TOKEN_INDEX?
需要保证每个分词后的结果都以IMAGE_TOKEN_INDEX开头, 以便模型在处理时能清晰地区分文本部分和图像部分.
ini
# 将图像和文本一起转成tokens
def tokenizer_image_token(prompt, tokenizer, image_token_index=IMAGE_TOKEN_INDEX, return_tensors=None):
prompt_chunks = [tokenizer(chunk).input_ids for chunk in prompt.split('<image>')]
def insert_separator(X, sep):
return [ele for sublist in zip(X, [sep]*len(X)) for ele in sublist][:-1]
input_ids = []
offset = 0
if len(prompt_chunks) > 0 and len(prompt_chunks[0]) > 0 and prompt_chunks[0][0] == tokenizer.bos_token_id:
offset = 1
input_ids.append(prompt_chunks[0][0])
for x in insert_separator(prompt_chunks, [image_token_index] * (offset + 1)):
input_ids.extend(x[offset:])
if return_tensors is not None:
if return_tensors == 'pt':
return torch.tensor(input_ids, dtype=torch.long)
raise ValueError(f'Unsupported tensor type: {return_tensors}')
return input_ids
图片如何被encode?
了解CLIP... 它将输入图片进行特征提取, 可以理解为transformer的encoder.
数据集构建
基于现存的image-pair data, 论文中利用GPT辅助构建了一个instruction-following数据集.
方法
数据集格式:
X_q是问题列表.(由GPT生成)
X_v是图片.
X_c是caption,即对图片中的多个物体的定位检测
问题: 推理缺少深度和多样性
改进
-> 使用text-only的GPT辅助进行三种类型场景的问题-答案挖掘.
如何把图片特征融入到prompt中?
描述captions(从不同的角度描述视觉场景)+坐标框定位(对场景中的物体进行定位,每个边界框对物体的概念及其空间位置进行编码) 作为文本输入. 使得图片特征 - encode -> LLM可识别序列.
让GPT生成3种类型的followings.
人为构造少量样本给GPT4进行in-context learning(即few shot learning)
最终: 得到158K instruction-following 样本.
最终样本的每一部分的来源总结如下:
captions: 原数据集标签
boxes: 原数据集标签
三种response: GPT-4 in-context learning生成.
数据集构成: 158K的语言-图片指令遵循样本,58K对话、23K细节描述和77K复杂推理。
一张图片 有 一个多轮对话+细节描述+复杂推理
模型训练
语言模型选择Vicuna -> 一个基于LLAMA的微调版本.
因为它是当时对于指令-遵循类型的语言任务表现得最好的开源模型.
图片编码器选择了CLIP.
MLP用于将图片特征空间和语义空间进行映射. 这一部分是从效率考虑选择的.
这部分可以更改为其他方案如gated cross-attention, Q-former等 来提升上限.
预训练
只训练图像映射层, 即上图的MLP.
目的 : 特征对齐, 学习构建一个从图像空间到语言模型词向量空间上的映射.
训练数据集: CC3M 过滤到595K的图片-文字对.
如何过滤?
- 使用Spacy等工具提取了整个CC3M数据集中的图片描述里的名词短语,
- 统计了每个unique名词短语出现的频率,
- 跳过出现小于3次的名词短语, 将其视为罕见的概念和属性的组合.
- 从剩余频率最低的名词短语开始, 将包含这些名词短语的标题添加到候选池中.
- 如果名词短语的频率大于100, 则从包含该名词短语的样本中随机抽100条.
如何训练?
自回归模型的predict next token.
输入: 第i轮的问题X_q^i, 图片X_v以及第i轮之前的Q, A.
输出: 针对X_q^i, 生成的第i轮的回答X_a^i的第j个字符.
对于每张图片X_v, 作者生成了一个多轮对话集合. T是轮数.
然后随机抽取一个问题X_q作为指令, 目标是token by token的预测对应的X_a.
对于第i轮问答, 模型可见前i-1轮的Q, A内容, 与图片. 整个训练过程中, 只有绿色部分参与计算损失.
微调
冻结视觉编码器参数, 训练线性映射层(MLP)和大语言模型(Vicuna 13B)的参数.
目的: 让模型学习适应instruction-following方式的回答, 并学习进行更复杂的推理过程.
使用数据集: ScienceQA, 基于GPT4生成数据集.
如何训练?
主要在以下两个场景下:
- 多模态chatbot
在158K 文字-图像对上进行微调,
个人理解: 学习如何根据图像和相应指令进行多轮对话交互.
- Science QA
ScienceQA 是一个包含大量科学问题的大规模多模态数据集, 其中每个问题都有详细的解释和说明作为上下文。模型需要根据所提供的自然语言或图像背景进行推理,并在多个选择项中找出正确的答案。在微调时,将问题及其上下文构造成单一回合的对话输入,推理过程与答案构成输出。
个人理解: 学习进行更复杂的推理过程.
评估
利用GPT-4去测量生成回复的质量.评估流程如下:
- 准备好图片, 文本描述, 问题.
- 让LLAVA基于图片, 问题去生成回答.
- 让text-only GPT-4, 基于问题, 文本描述去生成回答.
- 构造输入: {问题, 文本描述, 回答} 交给裁判(gpt-4), 从是否有帮助, 是否相关, 是否准确, 细节描绘程度等角度去进行评价, 并综合从1~10分进行打分. 高分表示综合表现好. 为了让我们能更好理解, GPT-4还需要在评估的同时做出详尽的解释.
Bench COCO:
从COCO数据集随机抽30张图, 每一张图同时生成三种问题. 共90个问题.
对比和GPT-4的差距, pipeline和上面一样.
研究使用不同训练数据 对模型性能的影响.
消融实验, 即用不同种类的数据来训练, 最后得到的效果如何.(构造数据集的时候, 有三种类型的数据, 即图片-细节描述, 图片-多轮对话, 图片-复杂推理)
想研究哪一部分数据起到的作用更大.
这些得分都是相对于GPT-4而言的. 基本都不如GPT-4依据ground-truth生成的内容.
Bench In-the-wild
为评估模型在不同域的泛化性和对更具挑战性任务的能力. 收集24张图, 共60个问题.
图片包括各种室内室外场景, 表情包, 图画, 素描等等. 这些图片都伴有人工标记的描述和一些问题.
然后比较LLaVA, BLIP, OpenFlamingo的表现. 因为视觉指令微调, 表现优胜.
最后一行? LLAVA解码序列指的是?
发现的问题:
问冰箱里面有没有草莓味酸奶, 即使没有这个味道的酸奶, 而是草莓 和 酸奶, 它也会回答是. 这说明了有时候, LLAVA将图片视为了一堆小"补丁", 未能理解图片中的复杂语义.
ref:
项目结构&相关代码
data实例
coco2014_val_qa_eval举例:
{"question_id": 0, "image": "000000441147.jpg", "text": "What is the color of the two suitcases in the image?", "category": "conv"}
{"question_id": 0, "text": "The colors of the two suitcases in the image are black and brown with yellow details.", "category": "conv"}
原始数据都是以多轮对话的conversations展示. 只是对于detail, 和complex只有一轮对话.
辅助生成轻小说题材如何调研?
先把脚本关于调api接口部分写好.
- gpt claude调API去完成接口的事先弄完...
- 找小说创作方面的paper...调研一下...