LLaVA 论文笔记

动机: 初步了解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的图片-文字对.

如何过滤?

  1. 使用Spacy等工具提取了整个CC3M数据集中的图片描述里的名词短语,
  2. 统计了每个unique名词短语出现的频率,
  3. 跳过出现小于3次的名词短语, 将其视为罕见的概念和属性的组合.
  4. 从剩余频率最低的名词短语开始, 将包含这些名词短语的标题添加到候选池中.
  5. 如果名词短语的频率大于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生成数据集.

如何训练?

主要在以下两个场景下:

  1. 多模态chatbot

在158K 文字-图像对上进行微调,

个人理解: 学习如何根据图像和相应指令进行多轮对话交互.

  1. Science QA

ScienceQA 是一个包含大量科学问题的大规模多模态数据集, 其中每个问题都有详细的解释和说明作为上下文。模型需要根据所提供的自然语言或图像背景进行推理,并在多个选择项中找出正确的答案。在微调时,将问题及其上下文构造成单一回合的对话输入,推理过程与答案构成输出。

个人理解: 学习进行更复杂的推理过程.

评估

利用GPT-4去测量生成回复的质量.评估流程如下:

  1. 准备好图片, 文本描述, 问题.
  2. 让LLAVA基于图片, 问题去生成回答.
  3. 让text-only GPT-4, 基于问题, 文本描述去生成回答.
  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:

  1. zhuanlan.zhihu.com/p/660132053
  2. zhuanlan.zhihu.com/p/639680254

项目结构&相关代码

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接口部分写好.

  1. gpt claude调API去完成接口的事先弄完...
  2. 找小说创作方面的paper...调研一下...
相关推荐
迷迭所归处7 分钟前
C++ —— 关于vector
开发语言·c++·算法
leon62537 分钟前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林37 分钟前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
Navigator_Z1 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
Aic山鱼1 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
天玑y2 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
sjsjs112 小时前
【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖
数据结构·算法·leetcode
redcocal2 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
码了三年又三年2 小时前
【算法】滑动窗口—找所有字母异位词
算法
山脚ice2 小时前
【Hot100】LeetCode—72. 编辑距离
算法·leetcode