多模态大型语言模型(MLLM)

一、简介

  • 模态的定义:模态(modal)是事情经历和发生的方式,我们生活在一个由多种模态(Multimodal)信息构成的世界,包括视觉信息、听觉信息、文本信息、嗅觉信息等等。
  • MLLMs 的定义:由LLM扩展而来的具有接收与推理多模态信息能力的模型。
  • 多种模型概念:
    • 单模态大模型
    • 跨模态模型
    • 多模态模型
    • 多模态语言大模型

1.1 单模态大模型

单模态大模型是指模型输入和输出是同一种模态,例如大语言模型(LLM)是文本模态。还有一种视觉大模型(LVM),输入输出视觉信号,例如下图:

1.2 跨模态模型

跨模态是指模型输入和输出为不同模态,如文生图,文生视频,文转语音,语音转文字等等,如上图。

  • Real3D-Portrait: 用于实现单参考图(one-shot)、高视频真实度(video reality)的虚拟人视频合成。(https://github.com/yerfor/Real3DPortrait)

  • AniPortrait:音频驱动的真实肖像动画合成

  • TTS:TTS(Text-To-Speech)这是一种文字转语音的语音合成。

    • GPT-SoVITS:(https://github.com/RVC-Boss/GPT-SoVITS)
      1. 零样本文本到语音(TTS): 输入 5 秒的声音样本,即刻体验文本到语音转换。
      2. 少样本 TTS: 仅需 1 分钟的训练数据即可微调模型,提升声音相似度和真实感。
      3. 跨语言支持: 支持与训练数据集不同语言的推理,目前支持英语、日语和中文。
      4. WebUI 工具: 集成工具包括声音伴奏分离、自动训练集分割、中文自动语音识别(ASR)和文本标注,协助初学者创建训练数据集和 GPT/SoVITS 模型。
    • ChatTTS:(https://github.com/2noise/ChatTTS)
      1. 对话式 TTS: ChatTTS针对对话式任务进行了优化,实现了自然流畅的语音合成,同时支持多说话人。
      2. 细粒度控制: 该模型能够预测和控制细粒度的韵律特征,包括笑声、停顿和插入词等。
      3. 更好的韵律: ChatTTS在韵律方面超越了大部分开源TTS模型。同时提供预训练模型,支持进一步的研究。
    • SpeedTTS:(https://bytedancespeech.github.io/seedtts_tech_report/)
      1. Seed-TTS,这是一系列大规模自回归文本转语音 (TTS) 模型,能够生成与人类语音几乎没有区别的语音。
      2. Seed-TTS 作为语音生成的基础模型,在语音上下文学习方面表现出色,在说话者相似度和自然度方面的表现在客观和主观评估方面都与真实的人类语音相匹配
      3. Seed-TTS 对各种语音属性(例如情感)具有出色的可控性,并且能够为自然界的说话者生成极具表现力和多样性的语音
    speed-tts-overview

    Seed-TTS 推理概述。 (1) 语音token器从参考语音中学习token。 (2)自回归语言模型根据条件文本和语音生成语音token。 (3) 扩散变换器模型以从粗到细的方式生成给定生成的语音token的连续语音表示。 (4) 声学声码器从扩散输出中产生更高质量的语音。

  • Suno:从文本或歌词 -> 音乐生成(https://suno.com/)

1.3 多模态模型

多模态机器学习是从多种模态的数据中学习并且提升自身的算法,它不是某一个具体的算法,它是一类算法的总称。

从语义感知的角度切入,多模态数据涉及不同的感知通道如视觉、听觉、触觉、嗅觉所接收到的信息;在数据层面理解,多模态数据则可被看作多种数据类型的组合,如图片、数值、文本、符号、音频、时间序列,或者集合、树、图等不同数据结构所组成的复合数据形式,乃至来自不同数据库、不同知识库的各种信息资源的组合。对多源异构数据的挖掘分析可被理解为多模态学习。

1.4 多模态大预言模型

由LLM扩展而来的具有接收与推理多模态信息能力的模型。

二、多模态模型的发展历程(图-文)

2.1 Vision Transformer (ViT)模型 [1]

Vision Transformer(ViT)的模型框架。简单而言,模型由三个模块组成:

  • Linear Projection of Flattened Patches(Embedding层)

  • Transformer Encoder

  • MLP Head(最终用于分类的层结构)

将一张图片按给定大小分成一堆Patches。以ViT-B/16为例,将输入图片(224x224)按照16x16大小的Patch进行划分,划分后会得到(224/16)2 = 196个Patches。接着通过线性映射将每个Patch映射到一维向量中,以ViT-B/16为例,每个Patche数据shape为[16, 16, 3]通过映射得到一个长度为768的向量(后面都直接称为token)。[16, 16, 3] -> [768]

在代码实现中,直接通过一个卷积层来实现。 以ViT-B/16为例,直接使用一个卷积核大小为16x16,步距为16,卷积核个数为768的卷积来实现。通过卷积[224, 224, 3] -> [14, 14, 768],然后把H以及W两个维度展平即可[14, 14, 768] -> [196, 768],此时正好变成了一个二维矩阵,正是Transformer想要的。

在输入Transformer Encoder之前注意需要加上[class]token以及Position Embedding。 在原论文中,作者说参考BERT,在刚刚得到的一堆tokens中插入一个专门用于分类的[class]token,这个[class]token是一个可训练的参数,数据格式和其他token一样都是一个向量,以ViT-B/16为例,就是一个长度为768的向量,与之前从图片中生成的tokens拼接在一起,Cat([1, 768], [196, 768]) -> [197, 768]。然后关于Position Embedding就是之前Transformer中讲到的Positional Encoding,这里的Position Embedding采用的是一个可训练的参数(1D Pos. Emb.),是直接叠加在tokens上的(add),所以shape要一样。以ViT-B/16为例,刚刚拼接[class]token后shape是[197, 768],那么这里的Position Embedding的shape也是[197, 768]

  • Mask Image Modeling 无监督图像特征学习 [2]

2.2 基于Transformer架构的图像-文本联合建模

以VisualBert [3] 为例,VisualBert核心是重用 Transformer 中的自注意力机制来隐式对齐输入文本的元素和输入图像中的区域。

VisualBert

两种训练视觉语言模型的预训练任务:

  1. 一部分文本被mask掉,根据剩余的文本和图像信息来预测被mask掉的信息。

  2. 模型来预测提供的文本是否和图片匹配。作者发现这种在图片标注数据上的预训练对于visualBert 学习文本和图像的表征非常重要。

文本向量 输入句子中的所有子词都映射到一组嵌入E,每个嵌入e ∈ E(文本部分)向量由以下三部分求和得到:

  • token embedding et,特定的token
  • segment embedding es,指示token来自文本的哪一部分(the hypothesis from an entailment pair)
  • position embedding ep,指示token在句子中的位置

图像向量 视觉嵌入F每个f ∈ F对应于图像中从对象检测器导出的边界区域。图像部分向量有以下三部分求和得到:

  • f0:由卷积神经网络计算得出的 f 边界区域的视觉特征表示
  • fs:图像segment embedding,不是文本segment embedding
  • fp:position embedding,在对齐时使用单词和边界区域之间的值作为输入的一部分提供,并设置为与对齐单词相对应的位置嵌入的总和

训练遵循以下3个过程: 1. Task-Agnostic Pre-Training:这里,根据前面提到的目标,在 COCO 数据集上对 VisualBERT 进行训练。在此阶段,模型学习区分实际图像标题和一些随机标题。 2. Task-Specific Pre-Training:这涉及使用预训练的权重在具有屏蔽文本的特定于任务的数据集上训练模型。 3. Fine-tuning:包括根据要求对transformer进行特定目标、输入和输出的培训。

2.3 大规模 图-文 Token对齐模型

2.3.1 CLIP [4]

CLIP模型特点:

  • 统一的向量空间:CLIP的一个关键创新是将图像和文本都映射到同一个向量空间中。这使得模型能够直接在向量空间中计算图像和文本之间的相似性,而无需额外的中间表示。

  • 对比学习:CLIP使用对比学习的方式进行预训练。模型被要求将来自同一个样本的图像和文本嵌入映射到相近的位置,而将来自不同样本的嵌入映射到较远的位置。这使得模型能够学习到图像和文本之间的共同特征。

  • 无监督学习:CLIP的预训练是无监督的,这意味着它不需要大量标注数据来指导训练。它从互联网上的文本和图像数据中学习,使得它在各种领域的任务上都能够表现出色。

CLIP模型训练分为三个阶段:

  • Contrastive pre-training:预训练阶段,使用图片 - 文本对进行对比学习训练;
  • Create dataset classifier from label text:提取预测类别文本特征;
  • Use for zero-shot predictiion:进行 Zero-Shoot 推理预测;

阶段1:Contrastive pre-training 在预训练阶段,对比学习十分灵活,只需要定义好正样本对和负样本对就行了,其中能够配对的图片-文本对即为正样本。具体来说,先分别对图像和文本提特征,这时图像对应生成I1, I2In的特征向量,文本对应生成T1, T2⋯Tn 的特征向量,然后中间对角线为正样本,其余均为负样本。这样的话就形成了n个正样本,n2 − n个负样本。一旦有了正负样本,模型就可以通过对比学习的方式训练起来了,完全不需要手工的标注。自监督的训练需要大量的数据,OPEN AI的这个训练数据量大约在 4亿个的数量级。

阶段2:Create dataset classifier from label text 基于400M数据上学得的先验,仅用数据集的标签文本,就可以得到很强的图像分类性能。现在训练好了,然后进入前向预测阶段,通过 prompt label text 来创建待分类的文本特征向量。 阶段3:Use for zero-shot predictiion 最后就是推理见证效果的时候,对于测试图片,选择相似度最大的那个类别输出。在推理阶段,无论来了张什么样的图片,只要扔给 Image Encoder 进行特征提取,会生成一个一维的图片特征向量,然后拿这个图片特征和 N 个文本特征做余弦相似度对比,最相似的即为想要的那个结果,比如这里应该会得到 “A photo of a guacamole.”

Chinese-CLIP:https://github.com/OFA-Sys/Chinese-CLIP

2.3.2 SigLIP [5]

SigLIP是一种与 CLIP 类似的图像嵌入模模型,它跟CLIP的主要区别在于其训练损失。SigLIP采用成对Sigmoid损失,允许模型独立地对每个图像-文本对进行操作,而无需对批次中的所有对进行全局查看。这种损失函数是在文字Tokens和图像Tokens的两个序列的基础上计算出来的,它指导模型训练朝着相同样本对(图,文)的点积值越大,而不同图文对的点积值越小的目标迈迈进。这种设计解决了CLIP训练中InfoNCE Loss里的softmax导致的存储问题,提高了训练效率。

CLIP: batch内的图文对做多分类softmax;比如上图左下角第一行表示第一个文本与batch内哪个图片匹配(多分类);除了行还计算列,比如左下角第一列表示第一个图片与batch内哪个文本匹配

SigLIP: batch内的图文对做二分类sigmod;比如上图左下角第一行表示第一个文本分别与batch内每个图片做二分类

2.3.3 开域(Open Set)下的图像分类-目标检测-图像分割

Open Set问题指的是在分类任务中,系统需要能够识别已知类别(Known Classes),同时还能够识别未知类别(Unknown Classes)。在实际应用中,往往会出现一些未见过的类别或样本,而传统的分类模型往往只能识别已知的类别,无法判断未知类别,这就是Open Set问题。

GLIP:Grounded Language-Image Pre-training MaskCLIP: Masked Self-Distillation Advances Contrastive Language-Image Pretraining DETR:End-to-End Object Detection with Transformers Mask2Former:Masked-attention Mask Transformer for Universal Image Segmentation

2.3.4 文生图任务的复兴

Open Set促进文生图发展。

2.4 多模态大语言模型

2.4.1 GPT4v [6]

支持图-文交替输出,不支持视频,但支持含多张图像的序列输入

输入:可以接收文本、图像信息输入 输出:自然语言文本

  • 特性一:遵循文字提示
  • 特性二:理解视觉指向和参考
  • 特性三:支持视觉+文本联合提示
  • 特性四:少样本上下文学习
  • 特性五:强大的视觉认知能力
  • 特性六:时序视觉信号理解

GPT4-o

输入:可以接收文本、语音、图像、视频信息输入 输出:自然语言、语音、图像、视频(未开放)

2.4.2 Gemini [7]

输入:可以接收文本、语音、图像、视频信息输入 输出:自然语言文本、图像

  • 特性一:支持多模态内容输出
  • 特性二:复杂图像理解与代码生成

2.5 多模态大语言模型的应用

2.5.1 工业

2.5.2 医疗

2.5.3 视觉内容认知与编辑

2.5.4 具身智能

Do As I Can, Not As I Say: Grounding Language in Robotic Affordances PaLM-E: An Embodied Multimodal Language Model GitHub:Do As I Can, Not As I Say

2.5.5 新一代人机交互

Self-Operating Computer: https://github.com/OthersideAI/self-operating-computer

三、LLaVA–多模态大语言模型的训练过程

LLaVA 这里使用的 adaper 就是最简单的 linear 线性映射,采用 CLIP 的 ViT-L/14 作为 visual encoder,采用 Vicuna(LLaMa 的一个 SFT 指令微调版本) 作为基座 LLM。

两阶段训练过程: 阶段一:特征对齐的预训练。只更新特征映射矩阵 阶段二:端到端微调。特征投影矩阵和LLM都进行更新

3.1 数据准备

3.1.1 数据来源

图-文对齐数据来源: * LAION Dataset * Conceptual Captions Dataset * SBU Captions Dataset

基于BLIP短文本描述打标

图-文指令数据来源:

图-文指令数据

共计665K条数据

GPT4生成数据 图片的简单描述+使用精度较高的目标检测模型,把图片中所有物体的坐标信息;然后将这些纯文本信息传递给GPT4(不涉及图像信息)生成一些更加精细的秒伤或对话信息等。

图-文对齐数据样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
{
"id": "004539375",
"image": "00453/004539375.jpg",
"conversations": [
{
"from": "human",
"value": "Render a clear and concise summary of the photo.\n<image>"
},
{
"from": "gpt",
"value": "select luxury furniture 3 - inch gel memory foam mattress topper"
}
]
}
]

图-文指令数据样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[
{
"id": "000000033471",
"image": "coco/train2017/000000033471.jpg",
"conversations": [
{
"from": "human",
"value": "<image>\nWhat are the colors of the bus in the image?"
},
{
"from": "gpt",
"value": "The bus in the image is white and red."
},
{
"from": "human",
"value": "What feature can be seen on the back of the bus?"
},
{
"from": "gpt",
"value": "The back of the bus features an advertisement."
},
{
"from": "human",
"value": "Is the bus driving down the street or pulled off to the side?"
},
{
"from": "gpt",
"value": "The bus is driving down the street, which is crowded with people and other vehicles."
}
]
}
]

图像解析所需模型:

将上面两个模型,下载后保存至models/下。

安装所需要的图像解析依赖包

  • RAM(Recognize Anything):用于给定一张图片,识别出图片中包含的所有物体类别
  • GroundingDINO: 用于对于给定的物体标签,框出其所在图像中的位置坐标
1
2
3
4
5
!pip install --user git+https://github.com/xinyu1205/recognize-anything.git
!git clone https://github.com/IDEA-Research/GroundingDINO.git
!pip install -e ./GroundingDINO
!pip uninstall opencv-python-headless -y
!pip install opencv-python-headless
  1. 图像解析
  • 给定任意一张图片,可以将图像中的所有包含的物体信息抽取出来,并获得其对应在图像上的坐标信息。

任务一: 抽取出图像中包含的所有物体

使用 RAM 完成上述任务。与 CLIP 不同,RAM默认提供了可识别的物体类别列表(共计4,585类标签的识别)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import argparse
import numpy as np
import random
import os
import torch

from PIL import Image
from ram.models import ram_plus, ram
from ram import inference_ram as inference
from ram import get_transform

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
image_size = 384 # 一般来说,图像分辨率越大,可识别的图像内容精细程度越高。但是随之可能带来的风险是提升识别错误的概率。
transform = get_transform(image_size=image_size)
# model = ram(pretrained="models/ram_swin_large_14m.pth",
# image_size=image_size,
# vit='swin_l')
model = ram_plus(pretrained="models/ram_plus_swin_large_14m.pth",
image_size=image_size,
vit='swin_l')
model.eval()
model = model.to(device)
from IPython.display import display
from PIL import Image
image_path = "data_examples/test.jpg"
image_pil = Image.open(image_path)
image = transform(image_pil).unsqueeze(0).to(device)
recog_res = inference(image, model)


display(image_pil)
print("Image Tags: ", recog_res[0])
print("图像标签: ", recog_res[1])

1
2
Image Tags:  bicycle | man | passenger train | railroad | ride | rural | track | train | train track
图像标签: 自行车 | 男人 | 旅客列车 | 铁道 | 骑/搭乘 | 农村的 | 跑道 | 火车 | 火车轨道

任务二:根据抽取出来的物体列表,获取其在图像中的位置信息

使用 GroundingDINO 完成上述任务。

1
2
!pip uninstall groundingdino -y
!pip install -e ./GroundingDINO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from groundingdino.util.inference import load_model, load_image, predict, annotate, Model
import cv2

CONFIG_PATH = "GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py"
CHECKPOINT_PATH = "models/groundingdino_swint_ogc.pth"
model = load_model(CONFIG_PATH, CHECKPOINT_PATH)

image_path = "data_examples/test.jpg"
image_source, image = load_image(image_path)
# "bicycle. man. passenger train. railroad. ride. rural. track. train. train track"
TEXT_PROMPT = recog_res[0].replace(" | ", ". ")
BOX_TRESHOLD = 0.25
TEXT_TRESHOLD = 0.25
boxes, logits, phrases = predict(
model=model,
image=image,
caption=TEXT_PROMPT,
box_threshold=BOX_TRESHOLD,
text_threshold=TEXT_TRESHOLD,
device=device,
)
annotated_frame = annotate(image_source=image_source,
boxes=boxes, logits=logits, phrases=phrases)
annotated_frame = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)
annotated_frame = Image.fromarray(annotated_frame)
print(TEXT_PROMPT)
print(boxes, logits, phrases)
1
2
3
4
5
6
bicycle. man. passenger train. railroad. ride. rural. track. train. train track
tensor([[0.5825, 0.7033, 0.2177, 0.3277],
[0.4994, 0.4557, 0.9942, 0.3211],
[0.6033, 0.7750, 0.1764, 0.2441],
[0.4996, 0.8716, 0.9920, 0.2515],
[0.5004, 0.4999, 0.9906, 0.9869]]) tensor([0.8379, 0.5691, 0.8021, 0.3149, 0.3078]) ['man', 'passenger train train', 'bicycle', 'track', 'rural']
1
2
3
4
from PIL import Image
from IPython.display import display

display(annotated_frame)

1
2
3
4
5
6
def convertDINO2GPT(boxes, phrases):
return ", ".join(f"{phrases[i]}: {boxes[i].numpy()}" for i in range(len(phrases)))


bbox_query = convertDINO2GPT(boxes, phrases)
print(bbox_query)
  1. 生成 LLaVA 所需训练数据

准备 GPT4 API 调用函数:

  • query_gpt4_vision: 调用 gpt-4v接口,生成详细图像描述
  • query_gpt4_text: 调用 gpt4文本模型接口,生成对话语料以及复杂逻辑推理问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from openai import OpenAI
import io
import base64
import os

# Function to encode the image to base64


def encode_image_to_base64(image):
buffered = io.BytesIO()
image.save(buffered, format="JPEG")
return base64.b64encode(buffered.getvalue()).decode('utf-8')

# Function to query GPT-4 Vision


def query_gpt4_vision(messages, api_key=os.getenv('OPENAI_API_KEY')):
client = OpenAI(api_key=api_key)

response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
max_tokens=4096,
)
return response.choices[0].message.content

# Function to query GPT-4 Vision


def query_gpt4_text(messages, api_key=os.getenv('OPENAI_API_KEY')):
client = OpenAI(api_key=api_key)

response = client.chat.completions.create(
model="gpt-4",
messages=messages,
max_tokens=2048,
)
return response.choices[0].message.content

数据类型一:生成图像描述

1
2
3
4
5
6
7
8
9
10
11
from IPython.display import display
from PIL import Image
system_message_description = f"""你是一个功能强大的中文图像描述器。请创建详细的描述,阐述给定图片的内容。包括物体的类型和颜色、计算物体的数量、物体的动作、物体的精确位置、图片中的文字、核对物体之间的相对位置等。不要描述虚构的内容,只描述从图片中可以确定的内容。在描述内容时,不要以清单形式逐项列出。尽可能最小化审美描述。"""

image_path = "data_examples/test.jpg"
image = Image.open(image_path)
base64_image = encode_image_to_base64(image)
messages = [{"role": "system", "content": system_message_description}, {"role": "user", "content": [
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}]}]
gpt4v_description = query_gpt4_vision(messages)
print(gpt4v_description)
1
这张照片展示了一位骑自行车的男子,他在一个铁路道口附近。男子穿着深色上衣和浅色裤子,正骑着一辆黑色自行车,位于图片的前景中偏右。背景中可以看到一列行驶中的红色和白色相间的列车,铁轨上方有许多电线和支架。铁路的左侧有一个绿色的柱子和一些铁架结构。前景中右侧有一个圆形标志牌,标志牌的具体内容不可辨认。旁边还可见到一些灌木丛和较低的植被,整体环境显得相对安静。

数据类型二:生成对话类数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
system_message_conversation = f"""你是一个AI视觉助手,你正在观看一张图片。你看到的可能是描述一副图片的若干句子,它们描述了你正在看的同一张图片。回答所有问题时,你要像正在观看图片一样回答。设计一段你和询问这张照片的人之间的对话。回答应该以视觉AI助手正在观看图片并回答问题的语气来进行。提出各种问题并给出相应的答案。包括询问图片中的视觉内容,包括物体类型、计算物体数量、物体动作、物体位置、物体之间的相对位置等。只包括有明确答案的问题:
(1) 可以在图片中看到问题所询问的内容,并能给出自信地回答;
(2) 可以明确在图像中看不到的内容。不要提出任何无法自信回答的问题。

还要包括与图片内容相关的复杂问题,例如询问图片中物体的背景知识,讨论图片中正在发生的事件等。同样,不要询问不确定的细节。在回答复杂问题时提供详细答案。例如,给出详细的例子或推理步骤,使内容更有说服力和组织性。如果必要,可以包括多个段落。"""

fewshot_samples = [{
"context": "这是一家电影院,放映时间显示在门上方。一个红色的消防栓深埋在雪中。消防栓位于一条最近刚刚清扫过的人行道旁的雪地里。这个城市经历了一个雪量非常大的严冬。在冬天的雪中有一家狗狗的酒店。",
"response": f"""问题:
图片中的消防栓是什么颜色?
===
答案:
图片中的消防栓是红色的。
===
问题:
消防栓是否被雪完全覆盖还是部分可见?
===
答案:
消防栓部分可见,其大部分被深雪覆盖。
===
问题:
消防栓附近的人行道状况如何?
===
答案:
消防栓附近的人行道最近刚刚清扫过,与周围地区相比,相对没有那么多雪。
===
问题:
这张图片对这个城市的冬季有何暗示?
===
答案:
这张图片暗示这个城市的冬季非常严酷和具有挑战性。图片中可见的大量积雪表明这个城市经历了大量降雪,这可能会给居民生活带来各种困难和中断。
例如,消防栓被深雪覆盖可能会妨碍紧急情况下的可及性,这就引发了安全问题。最近清扫过的人行道表明城市维护人员一直在积极工作,以保持人行道的清洁和安全,但大量降雪可能使持续的除雪工作变得困难。
此外,这种极端的冬季条件可能影响交通,导致交通问题、公共交通延误以及由于道路湿滑而增加的事故风险。这也可能给商业和学校带来问题,因为人们上班或上课的通勤可能会面临挑战。此外,大量积雪还可能对基础设施造成额外压力,如屋顶和电线,增加了结构损坏或停电的可能性。
总之,深埋在雪中的红色消防栓和最近刚刚清扫过的人行道的图片表明这个城市经历了一个特别严酷的冬季,大量降雪可能已经给居民和基础设施带来了各种挑战和中断。"""
},
{"context": "一名男子正在开阔的雪地山丘上滑雪。一名滑雪者正滑入雪地。滑雪者位于一座巨大山脉的山麓。一名滑雪者站在小径标志旁边,望着山脉。一名独自滑雪者滑过一片灌木丛生的区域。",
"response": f"""问题:
这个滑雪者在做什么?
===
答案:
这个滑雪者正在雪覆盖的山丘上滑雪,他穿越雪地,享受着美丽的山景。他们还站在一块指示他们在山上位置的小路标识牌旁边。
===
问题:
图片中有其他人或滑雪者可见吗?
===
答案:
不,图片中只有一个人在滑雪,他们被许多灌木丛所包围。
===
问题:
这个人在做什么类型的滑雪?越野滑雪还是高山滑雪?
===
答案:
根据我在照片中看到的,无法明确确定这个滑雪者是在做越野滑雪还是高山滑雪。但是,考虑到存在小路标识牌,以及他们在山丘上滑雪的事实,更有可能是这个滑雪者在进行越野滑雪。高山滑雪通常发生在更陡峭的斜坡上,并涉及使用滑雪缆车,而越野滑雪通常发生在相对平坦的地形上,并有token的小路。
===
问题:
你能更详细地解释一下越野滑雪和高山滑雪吗?
===
答案:
越野滑雪和高山滑雪是两种不同类型的滑雪,每种都有自己的技术、装备和地形偏好。
1. 越野滑雪:
也称为北欧滑雪,越野滑雪是利用滑雪板和滑雪杖在相对平坦的地形或缓坡上滑行。它是一项受欢迎的娱乐和竞技运动,注重耐力、平衡和有氧健身。越野滑雪者依靠自身运动在雪覆盖的地形上移动,而不是依靠滑雪缆车或其他辅助方式。
越野滑雪有两种主要技术:
- 古典式:这种技术涉及在平行的轨道上滑行,使用前后滑动的动作,保持滑雪板互相平行。滑雪者使用滑雪杖推动自己向前滑行。
- 滑行式滑雪:这种技术类似于溜冰,滑雪者在一个滑雪板上以角度用力踢出并在另一侧滑行。它需要平滑的小路表面,通常比古典式技术更快。
越野滑雪装备包括轻便滑雪板、靴子、绑脚器和滑雪杖。鞋子比高山滑雪的鞋子更灵活,使踝关节更容易移动和控制。
2. 高山滑雪:
也称为滑降滑雪,高山滑雪是利用滑雪板和滑雪杖以高速下滑斜坡来平衡和控制。这项运动更注重速度、技术和在富有挑战性的地形上滑降,包括陡坡、障碍和甚至跳跃。
高山滑雪可以进一步分为几个项目,例如回转滑雪、大回转、超级大回转、速降滑雪等。每个项目都有一套自己的规则、赛道和滑雪设备。
高山滑雪装备包括比越野滑雪使用的滑雪板、靴子、绑脚器和滑雪杖更重、更硬。鞋子更硬以在高速下降和急转弯时提供更好的支撑和控制。
总的来说,越野滑雪是一项基于耐力的运动,涉及在平坦或缓坡地形上旅行,而高山滑雪则集中在速度和技术上,滑雪者在陡坡和富有挑战性的地形上滑降。两种运动都需要专业的装备和技术,但它们给参与者带来不同的体验和挑战。"""}]

messages = [{"role": "system", "content": system_message_conversation}]
for sample in fewshot_samples:
messages.append({"role": "user", "content": sample['context']})
messages.append({"role": "assistant", "content": sample['response']})
messages.append({"role": "user", "content": '\n'.join(gpt4v_description)})

from IPython.display import display
from PIL import Image
gpt4t_conversation = query_gpt4_text(messages)

print(gpt4t_conversation)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
问题:
图片中的男子穿着什么颜色的衣服?
===
答案:
照片中的男子穿着深色的上衣和浅色的裤子。
===
问题:
男子正在骑什么颜色的自行车?
===
答案:
男子正在骑一辆黑色的自行车。
===
问题:
列车的颜色是什么?
===
答案:
列车的颜色是红色和白色相间的。
===
问题:
男子在哪个位置?
===
答案:
男子在图片的前景中偏右。
===
问题:
在铁路的那一侧有一个绿色的柱子?
===
答案:
在铁路的左侧有一个绿色的柱子。
===
问题:
图片右侧的标志牌上写了什么?
===
答案:
我无法确定图片右侧的标志牌上写了什么,因为标志牌的具体内容不可辨认。
===
问题:
系统可以推测这个男子可能是在做什么?
===
答案:
从我作为AI视觉助手对这张图片的识别来看,这个男子可能正在进行日常的骑自行车活动。考虑到他位于图像的前景中且在铁路道口附近,他可能正在经过这个地方,也许是前往他的目的地或者只是为了骑车而骑车。然而,必须注意的是,我不能确定他是否正在等待列车通过,因为尽管列车在行驶,但我不能确定列车的准确位置或者道口的状态。我也无法确定他是否注意到了列车或者是正在赞美这个安静的环境。然而,可以根据这个场景推理,男子很可能在骑行中并因此类似的活动提供了有趣的背景视觉。

数据类型三:生成复杂推理类问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import json
system_message_reasoning = f"""你是一个可以分析单张图片的AI视觉助手。你收到了若干句子,每个句子都描述了你正在观察的同一幅图片。此外,还给出了图片内特定物体的位置,以及详细的坐标。这些坐标以边界框的形式表示,用四个浮点数(x1, y1, x2, y2)范围从0到1表示。这些值对应于左上角的x、左上角的y、右下角的x和右下角的y。

任务是利用提供的标题和边界框信息,创建一个关于图片的合理问题,并详细提供答案。

创建超出描述场景的复杂问题。要回答这样的问题,首先需要理解视觉内容,然后根据背景知识或推理,解释为什么会发生这种情况,或者针对用户的请求提供指导和帮助。通过在问题中不包含视觉内容细节来使问题具有挑战性,这样用户需要首先对此进行推理。

在描述场景时,不要直接提及边界框坐标,而是利用这些数据用自然语言解释场景。包括物体的数量、物体的位置、物体之间的相对位置等细节。

在使用标题和坐标的信息时,直接解释场景,不要提及信息来源是标题或边界框。始终回答得好像你是直接在看这幅图片。

要求‘问题’和‘答案’交替输出,中间用单独一行‘===’隔开
"""

fewshot_samples = [{
"context": f"""一个戴着多根领带的男人做鬼脸。
一个穿着白衬衫戴着很多领带的男人。
一个戴着领带的男人摆姿势照相。
一个脖子上戴着多根领带的男人。
一个年轻男子戴着几条领带微笑着。

tie: [0.574, 0.298, 0.752, 0.704]
tie: [0.464, 0.339, 0.639, 0.789]
tie: [0.349, 0.363, 0.563, 0.732]
tie: [0.259, 0.255, 0.668, 0.805]
person: [0.019, 0.065, 0.962, 0.988]
person: [0.0, 0.24, 0.214, 1.0]
tie: [0.316, 0.778, 0.443, 0.867]
tie: [0.386, 0.707, 0.496, 0.801]
tie: [0.251, 0.354, 0.402, 0.747]
tie: [0.44, 0.318, 0.63, 0.397]
tie: [0.566, 0.33, 0.655, 0.543]
tie: [0.25, 0.409, 0.359, 0.556]",""",
"response": f"""问题:
这张照片有什么不寻常之处?
===
答案:
在照片中,这个男人脖子上戴了多条领带。这被认为是不寻常的,因为通常情况下,一个人只会戴一条领带。这个男人傻笑的表情也增加了这张照片的非同寻常和幽默性质。"""
},
{
"context": f"""一群人站在一辆黑色车辆外面,带着各种行李。
行李散落在地下停车场的一辆车周围。
人们试图把所有的行李都塞进一辆SUV中。
这辆运动型多用途车停在公共车库里,正在为一次旅行做准备。
一些人带着行李靠近一辆用于运输的货车。

person: [0.681, 0.242, 0.774, 0.694]
person: [0.63, 0.222, 0.686, 0.516]
person: [0.444, 0.233, 0.487, 0.34]
backpack: [0.384, 0.696, 0.485, 0.914]
backpack: [0.755, 0.413, 0.846, 0.692]
suitcase: [0.758, 0.413, 0.845, 0.69]
suitcase: [0.1, 0.497, 0.173, 0.579]
bicycle: [0.282, 0.363, 0.327, 0.442]
car: [0.786, 0.25, 0.848, 0.322]
car: [0.783, 0.27, 0.827, 0.335]
car: [0.86, 0.254, 0.891, 0.3]
car: [0.261, 0.101, 0.787, 0.626]""",
"response": f"""问题:
这些人面临着什么挑战?
===
答案:
在这张图片中,一群人站在一个停车区域外面,周围散落着各种行李,包括手提箱和背包。他们面临的挑战是要把所有的行李都塞进这辆黑色SUV中。有多个手提箱和背包需要装载,这表明这个团队有相当多的物品需要安排。他们可能需要制定策略,高效地安排行李,以确保一切都能够正确地放入车内。此外,他们还需要考虑乘客的舒适度和驾驶过程中的可见性,因此行李的放置不能妨碍驾驶员的视线,也不能让乘客在旅途中感到不舒服。"""
}]

messages = [{"role": "system", "content": system_message_reasoning}]
for sample in fewshot_samples:
messages.append({"role": "user", "content": sample['context']})
messages.append({"role": "assistant", "content": sample['response']})
messages.append({"role": "user", "content": '\n'.join(
[gpt4v_description, bbox_query])})

print(json.dumps(messages, indent=2, ensure_ascii=False))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[
{
"role": "system",
"content": "你是一个可以分析单张图片的AI视觉助手。你收到了若干句子,每个句子都描述了你正在观察的同一幅图片。此外,还给出了图片内特定物体的位置,以及详细的坐标。这些坐标以边界框的形式表示,用四个浮点数(x1, y1, x2, y2)范围从0到1表示。这些值对应于左上角的x、左上角的y、右下角的x和右下角的y。\n\n任务是利用提供的标题和边界框信息,创建一个关于图片的合理问题,并详细提供答案。\n\n创建超出描述场景的复杂问题。要回答这样的问题,首先需要理解视觉内容,然后根据背景知识或推理,解释为什么会发生这种情况,或者针对用户的请求提供指导和帮助。通过在问题中不包含视觉内容细节来使问题具有挑战性,这样用户需要首先对此进行推理。\n\n在描述场景时,不要直接提及边界框坐标,而是利用这些数据用自然语言解释场景。包括物体的数量、物体的位置、物体之间的相对位置等细节。\n\n在使用标题和坐标的信息时,直接解释场景,不要提及信息来源是标题或边界框。始终回答得好像你是直接在看这幅图片。\n\n要求‘问题’和‘答案’交替输出,中间用单独一行‘===’隔开\n"
},
{
"role": "user",
"content": "一个戴着多根领带的男人做鬼脸。\n一个穿着白衬衫戴着很多领带的男人。\n一个戴着领带的男人摆姿势照相。\n一个脖子上戴着多根领带的男人。\n一个年轻男子戴着几条领带微笑着。\n\ntie: [0.574, 0.298, 0.752, 0.704]\ntie: [0.464, 0.339, 0.639, 0.789]\ntie: [0.349, 0.363, 0.563, 0.732]\ntie: [0.259, 0.255, 0.668, 0.805]\nperson: [0.019, 0.065, 0.962, 0.988]\nperson: [0.0, 0.24, 0.214, 1.0]\ntie: [0.316, 0.778, 0.443, 0.867]\ntie: [0.386, 0.707, 0.496, 0.801]\ntie: [0.251, 0.354, 0.402, 0.747]\ntie: [0.44, 0.318, 0.63, 0.397]\ntie: [0.566, 0.33, 0.655, 0.543]\ntie: [0.25, 0.409, 0.359, 0.556]\","
},
{
"role": "assistant",
"content": "问题:\n这张照片有什么不寻常之处?\n===\n答案:\n在照片中,这个男人脖子上戴了多条领带。这被认为是不寻常的,因为通常情况下,一个人只会戴一条领带。这个男人傻笑的表情也增加了这张照片的非同寻常和幽默性质。"
},
{
"role": "user",
"content": "一群人站在一辆黑色车辆外面,带着各种行李。\n行李散落在地下停车场的一辆车周围。\n人们试图把所有的行李都塞进一辆SUV中。\n这辆运动型多用途车停在公共车库里,正在为一次旅行做准备。\n一些人带着行李靠近一辆用于运输的货车。\n\nperson: [0.681, 0.242, 0.774, 0.694]\nperson: [0.63, 0.222, 0.686, 0.516]\nperson: [0.444, 0.233, 0.487, 0.34]\nbackpack: [0.384, 0.696, 0.485, 0.914]\nbackpack: [0.755, 0.413, 0.846, 0.692]\nsuitcase: [0.758, 0.413, 0.845, 0.69]\nsuitcase: [0.1, 0.497, 0.173, 0.579]\nbicycle: [0.282, 0.363, 0.327, 0.442]\ncar: [0.786, 0.25, 0.848, 0.322]\ncar: [0.783, 0.27, 0.827, 0.335]\ncar: [0.86, 0.254, 0.891, 0.3]\ncar: [0.261, 0.101, 0.787, 0.626]"
},
{
"role": "assistant",
"content": "问题:\n这些人面临着什么挑战?\n===\n答案:\n在这张图片中,一群人站在一个停车区域外面,周围散落着各种行李,包括手提箱和背包。他们面临的挑战是要把所有的行李都塞进这辆黑色SUV中。有多个手提箱和背包需要装载,这表明这个团队有相当多的物品需要安排。他们可能需要制定策略,高效地安排行李,以确保一切都能够正确地放入车内。此外,他们还需要考虑乘客的舒适度和驾驶过程中的可见性,因此行李的放置不能妨碍驾驶员的视线,也不能让乘客在旅途中感到不舒服。"
},
{
"role": "user",
"content": "这张照片展示了一位骑自行车的男子,他在一个铁路道口附近。男子穿着深色上衣和浅色裤子,正骑着一辆黑色自行车,位于图片的前景中偏右。背景中可以看到一列行驶中的红色和白色相间的列车,铁轨上方有许多电线和支架。铁路的左侧有一个绿色的柱子和一些铁架结构。前景中右侧有一个圆形标志牌,标志牌的具体内容不可辨认。旁边还可见到一些灌木丛和较低的植被,整体环境显得相对安静。\nman: [0.58250546 0.70334786 0.2176611 0.32774457], passenger train train: [0.4994392 0.45572934 0.9941685 0.32106024], bicycle: [0.60330147 0.7749733 0.17639382 0.24406381], track: [0.49963006 0.8715638 0.9920128 0.25146163], rural: [0.50035655 0.49993825 0.9905996 0.9868902 ]"
}
]
1
2
3
4
from IPython.display import display
from PIL import Image
gpt4t_reasoning = query_gpt4_text(messages)
print(gpt4t_reasoning)
1
2
3
4
5
问题:
骑自行车的男子离行驶中的列车有多近?
===
答案:
尽管这个男子正在靠近一个铁路道口骑自行车,但他与行驶中的列车之间仍有足够的距离。这可能是由于他知道队列车的存在,并且在保持一定的安全距离以防止任何意外。因此,尽管他在铁路道口骑自行车,他并未站在靠近列车的轨道上,他是在安全的地方。然而,尽管他保持了安全的距离,但他应始终保持警惕,并遵守相关的安全规定,以防止任何不测。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import re
def parser_gpt4_return(input_string, first_block=True):
# Split the input string into blocks based on the question and answer pattern
blocks = re.split(r"===\n", input_string.strip())

# Create a list to hold conversation elements
conversations = []

# Process each block to extract questions and answers
for block in blocks:
lines = block.split("\n")
if lines[-1] == "":
lines = lines[:-1]
if lines:
if lines[0][:3] == "问题:":
if first_block:
conversations.append({"from": "human", "value": "<image>\n" + "\n".join(lines[1:])})
first_block = False
else:
conversations.append({"from": "human", "value": "\n".join(lines[1:])})
elif lines[0][:3] == "答案:":
conversations.append({"from": "gpt", "value": "\n".join(lines[1:])})
else:
raise ValueError(f"lines[0] should be Answer: or Question. Unexpected: -{lines[0]}-")

return conversations

parsed_json = parser_gpt4_return(gpt4t_conversation)
parsed_json += parser_gpt4_return(gpt4t_reasoning, first_block=False)
print(json.dumps(parsed_json, indent=2, ensure_ascii=False))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
[
{
"from": "human",
"value": "<image>\n图片中的男子穿着什么颜色的衣服?"
},
{
"from": "gpt",
"value": "照片中的男子穿着深色的上衣和浅色的裤子。"
},
{
"from": "human",
"value": "男子正在骑什么颜色的自行车?"
},
{
"from": "gpt",
"value": "男子正在骑一辆黑色的自行车。"
},
{
"from": "human",
"value": "列车的颜色是什么?"
},
{
"from": "gpt",
"value": "列车的颜色是红色和白色相间的。"
},
{
"from": "human",
"value": "男子在哪个位置?"
},
{
"from": "gpt",
"value": "男子在图片的前景中偏右。"
},
{
"from": "human",
"value": "在铁路的那一侧有一个绿色的柱子?"
},
{
"from": "gpt",
"value": "在铁路的左侧有一个绿色的柱子。"
},
{
"from": "human",
"value": "图片右侧的标志牌上写了什么?"
},
{
"from": "gpt",
"value": "我无法确定图片右侧的标志牌上写了什么,因为标志牌的具体内容不可辨认。"
},
{
"from": "human",
"value": "系统可以推测这个男子可能是在做什么?"
},
{
"from": "gpt",
"value": "从我作为AI视觉助手对这张图片的识别来看,这个男子可能正在进行日常的骑自行车活动。考虑到他位于图像的前景中且在铁路道口附近,他可能正在经过这个地方,也许是前往他的目的地或者只是为了骑车而骑车。然而,必须注意的是,我不能确定他是否正在等待列车通过,因为尽管列车在行驶,但我不能确定列车的准确位置或者道口的状态。我也无法确定他是否注意到了列车或者是正在赞美这个安静的环境。然而,可以根据这个场景推理,男子很可能在骑行中并因此类似的活动提供了有趣的背景视觉。"
},
{
"from": "human",
"value": "骑自行车的男子离行驶中的列车有多近?"
},
{
"from": "gpt",
"value": "尽管这个男子正在靠近一个铁路道口骑自行车,但他与行驶中的列车之间仍有足够的距离。这可能是由于他知道队列车的存在,并且在保持一定的安全距离以防止任何意外。因此,尽管他在铁路道口骑自行车,他并未站在靠近列车的轨道上,他是在安全的地方。然而,尽管他保持了安全的距离,但他应始终保持警惕,并遵守相关的安全规定,以防止任何不测。"
}
]

3.1.2 自定义数据准备

图-文对齐数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
{
“id”: “任意一个非重复id,例如 0888888",
“image”: “图像文件路径,例如:my_data/hongyadong.jpg",
"conversations": [
{
"from": "human",
“value”: ”请简要描述这幅图像.\n<image>"
},
{
"from": "gpt",
“value”: “这是一张关于重庆洪崖洞的外景照片。"
}
]
}
]

图-文指令数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[
{
"id": "任意一个非重复id,例如 0999999",
"image": "图像文件路径,例如:my_data/hongyadong.jpg ",
"conversations": [
{
"from": "human",
"value": "<image>\n这张照片拍摄于哪里?"
},
{
"from": "gpt",
"value": "这是一张拍摄于重庆市洪崖洞景区的照片."
},
{
"from": "human",
"value": "图中有什么可以识别的文字内容?"
},
{
"from": "gpt",
“value”: “图片右下角墙体上写着\”洪崖洞\“三个字."
}
]
}
]

3.2 模型训练

3.2.1 图文特征对齐预训练

特征对齐的预训练。只更新特征映射矩阵

基本数据格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"id": "任意一个非重复id,例如 0888888",
"image": ",
"conversations": [
{
"from": "human",
"value": "请简要描述这幅图像.\n<image>"
},
{
"from": "gpt",
"value": "这张图片中显示了一名男子骑自行车和一列正在行驶的火车。前台的男子穿着深色上衣和裤子,看起来有亚洲面孔,他正骑着一辆深色自行车,从左向右穿过画面,并且与镜头形成了接近正面的视角。他的表情专注,似乎正在前往某个目的地。

在他的后方,可以看到一列红色和白色相间的高速火车,火车车身上有几个窗户,火车上方有电网。火车左边的树木使得场景给人一种自然的氛围。在图片的左上角部分,还有一个路牌,上面有日文和英文的混合文本,但具体内容不清晰。整个场景是在室外拍摄的,光线来自自然光,可能是在傍晚或清晨,因为阳光有点斜射到场景中。

整体上,这张照片创造了一种行驶中的火车与骑自行车的人共同构成的动态场面,可能在日本的城市郊外或者乡村地区拍摄。"
}
]
}

下载LLaVA 预训练数据集

开始训练

Hyperparameter Global Batch Size Learning rate Epochs Max length Weight decay
LLaVA-v1.5-13B 256 1e-3 1 2048 0
  • 8x A100 (80GB) 耗时 5.5h
  • 基于 DeepSpeed ZeRO2
  • 输入图像分辨率 336 px
  • 训练参数:特征映射层结构(2 层全连接层)
  • 训练脚本 pretrain.sh

3.2.2 图-文指令微调训练

端到端微调。特征投影矩阵和LLM都进行更新

基本数据格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"id": "任意一个非重复id,例如 0999999",
"image": "图像文件路径,例如:my_data/hongyadong.jpg ",
"conversations": [
{
"from": "human",
"value": "<image>\n图中的男子正在做什么?拍摄于哪里?"
},
{
"from": "gpt",
"value":"图中的男子正在骑自行车,他的视线专注,看起来他正在前往某个目的地。市洪崖洞景区的照片."
},
{
"from": "human",
"value": "图中有什么可以识别的文字内容?"
},
{
"from": "gpt",
"value": "图片右下角墙体上写着\”洪崖洞\“三个字."
}]
}

下载 LLaVA 训练所需文本数据集: llava_v1_5_mix665k.json

下载 LLaVA 训练所需图像数据集:

开始训练

Hyperparameter Global Batch Size Learning rate Epochs Max length Weight decay
LLaVA-v1.5-13B 128 2e-5 1 2048 0
  • 8x A100 (80GB) 耗 20h
  • 基于 DeepSpeed ZeR3
  • 输入图像分辨率 336 px
  • 训练参数:特征映射层结构(2 层全连接层以及 LLM

训练脚本: finetune.sh LoRA 训练脚本: finetune_lora.sh

3.2.3 图文多模态大语言模型的评测

各类benchmark上的综合测试

3.3 模型部署

  1. 启动API server
    1
    python -m llava.serve.controller --host 0.0.0.0 --port 10000
  2. 启动WebUI
    1
    python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path liuhaotian/llava-v1.5-13b
  3. 启动SGLang worker
    1
    2
    3
    4
    5
    6
    7
    # Single GPU
    CUDA_VISIBLE_DEVICES=0 python3 -m sglang.launch_server --model-path liuhaotian/llava-v1.5-7b --tokenizer-path llava-hf/llava-1.5-7b-hf --port 30000

    # Multiple GPUs with tensor parallel
    CUDA_VISIBLE_DEVICES=0,1 python3 -m sglang.launch_server --model-path liuhaotian/llava-v1.5-13b --tokenizer-path llava-hf/llava-1.5-13b-hf --port 30000 --tp 2

    python -m llava.serve.sglang_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --sgl-endpoint http://127.0.0.1:30000
  4. 启动Worker
    1
    python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port <different from 40000, say 40001> --worker http://localhost:<change accordingly, i.e. 40001> --model-path <ckpt2> --load-4bit

3.4 LLaVa衍生

3.5 LLaVA改进

改进方向:

  • Vision Encoder改进
  • Projection改进

3.5.1 Vision Encoder改进

3.5.1.1 LLaVA1.6 (LLaVA-Next

主要改进:

  • 将输入图像分辨率增加到更多的像素,这使它能够抓住更多的视觉细节。它支持三种宽高比,最高分辨率可达672x672、336x1344、1344x336。
  • 通过改进的视觉指令调整数据混合,实现更好的视觉推理和OCR能力。
  • 在更多场景下进行更好的视觉对话,涵盖不同的应用。
  • 具备更好的世界知识和逻辑推理能力。 通过SGLang实现高效部署和推理。

通过将图像划分为视觉编码器最初训练的分辨率较小的图像块并对其进行独立编码来克服图像分辨率限制为 3362的问题。获得各个块的特征图后,将它们组合成一个目标分辨率的单个大特征图,并将其输入到 LLM 中。为了向 LLM 提供全局上下文并减少拆分编码合并操作的伪影,还将下采样图像的特征连接到合并的特征图。这样能够将输入缩放到任意分辨率并保持LLaVA-1.5的数据效率。

3.5.1.2 Fuyu-8B

Fuyu 是一个decoder-only transformer,没有专门的图像编码器。图像块直接线性投影到transformer的第一层,绕过嵌入查找。这种简化的架构支持任意图像分辨率,并极大地简化了训练和推理。

Fuyu模型架构图
3.5.1.3 MiniCPM-Llama3-V 2.5

主要改进:

  • 采用了类似LLaVa1.6的分区+整图组合的图像编码方式
  • 使用了支持更高分辨率图像特征提取的SigLip替代了CLIP
    • siglip-so400m-14-980-flash-attn2-navit
  • 采用了类似q-former的技术来支持任意分辨率图像映射到固定长度的视觉编码。
  • 通过模型量化、CPU、NPU、编译优化等高效加速技术,实现高效的终端设备
Evaluation

3.5.2 Projection机制改进

InternLM-XComposer2

Partial LoRA,这是一个多功能插件模块,旨在将新模态的知识与 LLM 对齐。如上图所示,Partial LoRA 汲取了原始 LoRA 的灵感,并采用了低秩适应,专门应用于输入token的新模态部分。在特定配置中,Partial LoRA 应用于所有视觉token。

对于LLM块中的每个线性层L0,将其权重矩阵W0 ∈ ℝ(Cout × Cin)和偏差B0 ∈ ℝCout表示,其中CinCout是输入和输出维度。其对应的Parital LoRA包含两个低秩矩阵WA ∈ ℝCr × CinWB ∈ ℝCout × Cr。 对于给定的输入 ,通过以下公式得到输出特征 其中 xvxt 分别是输入序列的视觉token和语言token。

四、多模态LLM

4.1 InternVL 1.5—开源的SoTA 多模态LLM

InternVL 1.5架构
  • 基于InternViT-6B-448进行视觉特征编码。

  • 动态高分辨率:InternVL 1.5能够根据输入图像的长宽比和分辨率,动态地将图像划分为不同大小的图块,最高支持4K分辨率的输入。

  • 采用了pixel-shuffle压缩视频编码至1/4。

  • 支持多图推理(视频打标)

4.1.1 Pixel Shuffle

  1. PixelShuffleUp (upsampling) PixelShuffle (Sub-Pixel Convolutional Neural Network)是一种经典的上采样方法,可以对缩小后的特征图进行有效的放大操作。与反卷积相比,PixelShuffle克服了反卷积的易产生棋盘格的问题

超分辨率图像的生成过程:首先对一个大小为[H, W, C]的低分辨率图像(input)进行l − 1次卷积,获得一个特征图[H, W, C × r2],这里的r为设置的期望上采样倍数,然后对特征图做shuffle变换获得一张大小为[H × r, W × r, C]超分辨率图像(output)

  • PixelShuffle的功能:对特征图进行shape变换:[N, C × r2, H, W] —> [N, C, r × H, r × W]
  • PixelShuffle的理解:将一个低分辨率像素划分为r × r份,默认是由特征图对应像素位置的r2个特征像素组成一个低分辨率像素。在组成的过程中通过不断优化每组组合的权重来达到最好的上采样效果。

如下图是一个超分辨率图像的生成完整过程卷积层kernel(output channels, input channels, kernel width, kernel height):(4, 1, 2, 2),这里的r = 2r表示放大比率。

pixel-shuffle
  1. PixelShuffleDown (downsampling)

PixelShuffleDown与PixelShuffleUp是互逆操作,PixelShuffleDownz早期被用于图像增强、图像超分,后来也有被用于图像分类模块。

在图像复原里面,直接在输入图像分辨率层面计算的话,会导致计算量过大,而采用stride=2的卷积、MaxPooling、AvgPooling等方式进行下采样会造成信息损失与性能下降,而PixelShuffle不仅不会造成信息损失,同时具有更低的计算量、参数量。

  • PixelShuffle的功能:对特征图进行shape变换[N, C, H, W] —> [N, C × r2, H//r, W//r]

InternVL 1.5 中的pixelShuffle r默认为0.5,但变换有些不同(相当于r = 2的PixelShuffleDown)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def pixel_shuffle(self, x, scale_factor=0.5):
n, w, h, c = x.size()
# N, W, H, C --> N, W, H * scale, C // scale
x = x.view(n, w, int(h * scale_factor), int(c / scale_factor))
# N, W, H * scale, C // scale --> N, H * scale, W, C // scale
x = x.permute(0, 2, 1, 3).contiguous()
# N, H * scale, W, C // scale --> N, H * scale, W * scale, C // (scale ** 2)
x = x.view(n, int(h * scale_factor), int(w * scale_factor),
int(c / (scale_factor * scale_factor)))
if self.ps_version == 'v1':
warnings.warn("In ps_version 'v1', the height and width have not been swapped back, "
'which results in a transposed image.')
else:
x = x.permute(0, 2, 1, 3).contiguous()
return x

4.2 MoE-LLaVA

vision encoder处理输入图片得到视觉token序列。利用一个投影层将视觉tokens映射成LLM可接受的维度。相同的,与图片配对的文本经过一个word embedding layer被投影得到序列文本tokens。

MoE-LLaVA采用三阶段的训练策略:

  • 阶段1:在此阶段,目标是使图像token适应LLM,使LLM能够理解图像中的实例。为了实现这一目标,采用 MLP 将图像token投影到 LLM 的输入域中,将图像块视为伪文本token。在此阶段,LLM 被训练来描述图像。在此阶段,MoE 层不会应用于 LLM。

  • 第二阶段:多模态指令数据调优是增强大型模型能力和可控性的关键技术。在这个阶段,LLM被调整为具有多模态理解的LVLM。使用更复杂的指令,包括图像逻辑推理和文本识别等任务,这需要模型具有更强的多模态理解。通常,对于密集模型,LVLM 训练在此阶段被认为已完成。然而,在将 LLM 转换为 LVLM 并稀疏化 LVLM 的同时遇到了挑战。因此,MoE-LLaVA利用第二阶段的权重作为第三阶段的初始化,以减轻稀疏模型的学习难度。

  • 第三阶段:多次复制 FFN 来初始化专家。当图像token和文本token被输入 MoE 层时,路由器会计算每个token与专家之间的匹配权重。然后,每个token都由top-k个专家处理,并根据路由器的权重通过加权求和来聚合输出。当top-k个专家被激活时,其余专家保持沉默。这种建模方法形成了具有无限可能的稀疏路径的 MoE-LLaVA,提供了广泛的功能。

MoE-LLAVA特性:

  • 支持Qwen、Phi2、StableLM、Mistral、MiniCPM等多个LLM架构的LLaVa改造训练
  • 支持SigLip、CLIP视觉编码器
  • 基本代码结构与LLaVa类似

4.3 TinyLLaVA Factory

  • 摒弃了 LLaVA 代码中繁杂的图片处理和 Prompt 处理过程,提供了标准的、可扩展的图片和文本预处理过程,清晰明了
  • 图片预处理可自定义 Processor,也可使用一些官方视觉编码器的 Processor,如 CLIP ViT 和 SigCLIP ViT 自带的 Image Processor。
  • 对于文本预处理,定义了基类 Template,提供了基本的、共用的函数,如添加System Message (Prompt)、Tokenize、和生成标签 Ground Truth 的函数,用户可通过继承基类就可轻松扩展至不同 LLM 的 Chat Template

4.4 X-LLM

X-LLM framework

X-LLM使用X2L接口将多模态(图像、语音、视频)转换为外语(对于LLM),并将其输入到大型语言模型(ChatGLM)中以完成多模态LLM,实现令人印象深刻的多模式聊天功能。X-LLM 是一个通用的多模态 LLM 框架,它允许将各种信息模态合并到 LLMs 中,例如 (1) 非语音音频,从而使LLM进行音频对话。 (2)终端设备状态信息,LLM控制终端设备等。

4.4.1 Q-Former

按照两阶段策略预训练一个轻量级Querying Transformer(Q-Former)来弥补模态差距

Q-Former 是一种轻量级transformer,它采用一组可学习的查询向量从冻结图像编码器中提取视觉特征。它充当冻结图像编码器和冻结 LLM 之间的信息瓶颈,为 LLM 提供最有用的视觉特征以输出所需的文本。在第一个预训练阶段,执行视觉语言表示学习,强制 Q-Former 学习与文本最相关的视觉表示。在第二个预训练阶段,通过将 Q-Former 的输出连接到冻结的 LLM 来执行视觉到语言的生成学习,并训练 Q-Former 使其输出视觉表示可以由 LLM 解释。

4.4.1.1 Q-Former架构

Q-Former 由两个共享相同自注意力层的transformer子模块组成:(1) 与冻结图像编码器交互以进行视觉特征提取的图像transformer,(2) 可以运行的文本transformer作为文本编码器和文本解码器。创建一组可学习的查询嵌入作为图像transformer的输入。查询通过自注意力层相互交互,并通过交叉注意力层(插入每个其他transformer块)与冻结图像特征交互。查询还可以通过相同的自注意力层与文本进行交互。根据预训练任务,我们应用不同的自注意力掩码来控制查询文本交互。使用BERTbase的预训练权重初始化 Q-Former,而交叉注意力层是随机初始化的。 Q-Former 总共包含 188M 个参数。Query被视为模型参数。

4.4.1.2 从 frozen image encoder 中自主学习 Vision-Language Representation

在 representation 学习阶段将 Q-Former 连接到冻结图像编码器,并使用图像文本对进行预训练。目标是训练 Q-Former,以便查询能够学习提取最能提供文本信息的视觉表示。联合优化了三个共享相同输入格式和模型参数的预训练目标。每个目标在查询和文本之间采用不同的注意力屏蔽策略来控制它们的交互。如上图右。

  • Image-Text Contrastive Learning (ITC):学习对齐图像表示和文本表示,以使它们的互信息最大化。它通过将正对的图像文本相似性与负对的图像文本相似性进行对比来实现这一点。将图像transformer的输出查询表示Z与文本transformer的文本表示t对齐,其中t[CLS] 的输出嵌入token。由于Z包含多个输出嵌入(每个查询一个),首先计算每个查询输出与t之间的成对相似度,然后选择最高的一个作为图像文本相似度。为了避免信息泄漏,采用单峰自注意力掩码,其中查询和文本不允许互相看到。由于使用了冻结图像编码器,与端到端方法相比,可以在每个 GPU 上容纳更多样本。因此,在 BLIP 中使用批内负数而不是动量队列。
  • Image-grounded Text Generation (ITG):训练 Q-Former 在给定输入图像作为条件的情况下生成文本。由于 Q-Former 的架构不允许冻结图像编码器和文本token之间直接交互,因此必须首先通过查询提取生成文本所需的信息,然后通过自注意力层传递给文本token。因此,查询被迫提取捕获有关文本的所有信息的视觉特征。采用多模态因果自注意力掩码来控制查询文本交互。查询可以相互关注,但不能关注文本token。每个文本token可以处理所有查询及其先前的文本token。还将 [CLS] token替换为新的 token,作为指示解码任务的第一个文本token。
  • Image-Text Matching (ITM):旨在学习图像和文本表示之间的细粒度对齐。这是一个二元分类任务,要求模型预测图像文本对是正(匹配)还是负(不匹配)。使用双向自注意力掩码,所有查询和文本都可以相互关注。因此,输出查询嵌入Z捕获多模式信息。将每个输出查询嵌入到二类线性分类器中以获得 logit,并将所有查询的 logit 平均作为输出匹配分数。使用了负难例挖掘,来提取出难的 negative pairs。
4.4.1.3 使用 Frozen LLM 来自主学习 Vision-to-Language 生成

在生成任务的预训练阶段,作者将 Q-Former(已经基于 frozen image encoder 预训练过的)和 frozen LLM 进行结合,来获得 LLM 的语言生成能力

如上图所示:

  • 首先,使用全连接层将输出查询嵌入 Z进行线性映射投影到与 LLM 的文本嵌入相同的维度。
  • 然后将投影的查询嵌入添加到输入文本嵌入之前。它们充当 soft visual prompts根据 Q-Former 提取的视觉表示来调节 LLM。
  • 由于 Q-Former 已经过预训练,可以提取包含语言信息的视觉表示,因此它可以有效地充当信息瓶颈,将最有用的信息提供给 LLM,同时删除不相关的视觉信息。这减轻了LLM学习视觉语言对齐的负担,从而减轻了灾难性的遗忘问题。

4.4.2 C-Former

C-Former 是 CIF 模块和 12 层token结构的组合。

一种低复杂度并具有单调一致性的序列转换机制——连续整合发放(Continuous Integrate-and-Fire,CIF)。CIF会对先后到来的声学信息依次进行整合,当整合的信息量达到识别阈值,将整合后的信息发放以用作后续识别。其与注意力模型的对齐形态对比如下图。

CIF机制与注意力机制的对齐形态对比

CIF应用于编解码框架。在每一个编码时刻,CIF分别接收编码后的声学编码表示及其对应的权重(表征了蕴含的信息量)。之后,CIF不断地积累权重并对声学编码表示进行整合(加权求和的形式)。

当积累的权重达到阈值后,意味一个声学边界被定位到。此时,CIF模拟了整合发放模型的处理思想,将当前编码时刻的信息分为两部分(如上图右图所示):

  • 一部分用来完成当前标签的声学信息整合(权重可构建一个完整分布)。

  • 另一部分用作下一个标签的声学信息整合。

之后CIF将整合后的当前声学信息(声学Embedding)发放到解码器以立即预测对应的标签。以上过程一直执行到编码后序列的末尾。

4.4.3 X-LLM 训练

X-LLM使用X2L接口连接多个预训练的单模态编码器(例如ViT-g视觉编码器)和大语言模型ChatGLM。三阶段的训练程序:

  • 第一阶段:转换多模式信息。通过X2L interfaces将多模态信息转换为外语(对于LLM),仅更新X2L interfaces参数
  • 第二阶段:将 X2L 表示与 LLM 对齐。 LLM中注入外语(对于LLM),仅更新X2L interfaces参数
  • 第三阶段:整合多种模式。集成多模态,仅更新X2L interfaces中的adapter

DataSet

Traning

Q-former初始化自BLIP-2;C-former初始化自ASR模型。

4.5 NExT-GPT:Any-to-Any Multimodal LLM

通过将 LLM 与多模态适配器和扩散解码器连接,NExT-GPT 实现了通用多模态理解以及任意模态输入和输出。

NExT-GPT 由三个主要层组成:编码阶段、LLM理解和推理阶段以及解码阶段。

Multimodal Encoding Stage: 利用 ImageBind,它是跨六种模式的统一高性能编码器。借助 ImageBind,无需管理大量异构模式编码器。然后,通过线性投影层,不同的输入表示被映射为LLM可以理解的类似语言的表示。

  • LLM Understanding and Reasoning Stage:NExT-GPT的核心代理是LLMLLM 将不同模态的表示作为输入,并对输入进行语义理解和推理。它输出 1) 直接文本响应,以及 2) 每种模态的信号token,用作指示解码层是否生成多模态内容以及如果生成则生成什么内容的指令。
只有 1% 的参数需要更新
  • Multimodal Generation Stage:从LLM(如果有)接收具有特定指令的多模态信号,基于 Transformer 的输出投影层将信号token表示映射为后续多模态解码器可以理解的表示形式。Stable Diffusion1.5用于图像合成,Zeroscope3用于视频合成,AudioLDM(audioldm-l-full)用于音频合成。

ImageBind:

ImageBind

通过将六种模态的嵌入对齐到一个公共空间中,ImageBind 可以对未同时观察到的不同类型的内容进行跨模态检索,添加来自不同模态的嵌入以自然地​​组成其语义,并通过以下方式生成音频到图像:使用音频嵌入和预训练的 DALLE-2 解码器来处理 CLIP 文本嵌入。

4.5.1 三阶段训练过程

  1. 以LLM为中心的Encoder特征对齐

考虑将不同的输入多模态特征与文本特征空间对齐,即核心LLM可以理解的表示。因此,这被直观地命名为以 LLM 为中心的多模态对齐学习。为了完成对齐,从现有语料库和基准中准备“X-caption”对(“X”代表图像、音频或视频)数据。强制 LLM 根据黄金标题(gold caption)生成每个输入模态的标题。下图说明了学习过程。只更新input projection layer。

  1. Decoder段输出结果与指令对齐

在解码端,集成了来自外部资源的预训练条件扩散模型。主要目的是将扩散模型与 LLM 的输出指令保持一致。然而,在每个扩散模型和 LLM 之间执行全面的对齐过程将带来巨大的计算负担。在这里探索一种更有效的方法,即解码端指令跟随对齐,如下图所示。具体来说,由于各种模态的扩散模型仅以文本token输入为条件。这种调节与系统中 LLM 的模态信号令牌显着不同,这导致扩散模型对 LLM 指令的准确解释存在差距。因此,考虑最小化 LLM 的模态信号token表示(在每个基于 Transformer 的项目层之后)与扩散模型的条件文本表示之间的距离。由于仅使用文本条件编码器(扩散主干冻结),因此学习仅基于纯粹的字幕文本,即没有任何视觉或音频资源。这也确保了高度轻量级的训练。只更新output projection layer。

  1. 指令微调

进一步的指令微调(IT)对于增强LLM的能力和可控性是必要的。为了促进任意 MM-LLM 的开发,提出了一种新颖的模态切换指令调整(MosIT)。如下图所示,当 IT 对话样本输入系统时,LLM 会重建并生成输入的文本内容(并使用多模态信号token表示多模态内容)。优化是根据黄金注释和 LLM 的输出进行的。除了LLM调优之外,还对NExT-GPT的解码端进行了微调。将输出投影编码的模态信号token表示与扩散条件编码器编码的黄金多模态标题表示对齐。从而,全面的调优过程更加接近与用户忠实有效交互的目标。更新LLM Lora,input以及output projection layers

4.6 AnyGPT: Unified Multimodal LLM with Discrete Sequence Modeling

所有模态都被标记为离散token,LLM 在此基础上以自回归方式执行多模态理解和生成。只需要数据预处理和后处理,模型的架构和训练目标保持不变。

AnyGPT,这是一种任意对任意的多模态语言模型,它利用离散表示来统一处理各种模态,包括语音、文本、图像和音乐。 AnyGPT 可以稳定地训练,而不需要对当前的大语言模型(LLM)架构或训练范式进行任何改变。相反,它完全依赖于数据级预处理,促进新模式无缝集成到 LLMs 中,类似于合并新语言。构建了一个以文本为中心的多模态数据集,用于多模态对齐预训练。

它生成具有因果依赖性和高级语义的离散视觉代码

SEED 分词器由多个组件组成,包括 ViT 编码器、因果 Q-Former、VQ 代码本、多层感知(MLP)和 UNet解码器。SEED 将224 × 224RGB 图像作为输入,ViT 编码器将图像编码为16 × 16补丁,然后因果 Q-Former 将补丁特征转换为 32 个因果嵌入。包含 8192 个条目的码本将嵌入离散化为量化代码序列。采用 MLP 将视觉代码解码为生成嵌入,该嵌入与预训练的 unCLIP 稳定扩散(unCLIP-SD)的潜在空间对齐。最后,使用UNet解码器将生成嵌入恢复到原始图像。

SpeechTokenizer,它是专门为语音大语言模型设计的,通过分层地解开语音信息的不同方面来统一语义和声学token。采用带有残差矢量量化 (RVQ) 的编码器-解码器架构。SpeechTokenizer 使用八个分层量化器(每个量化器有 1,024 个条目)将单通道音频序列压缩为离散矩阵,并实现 50 Hz 的帧速率。第一个量化器层捕获语义内容,而第 2 至 8 层则编码副语言细节。因此,10 秒的音频被转换为 500 × 8矩阵,分为语义和声学标记。

尽管语音和音乐共享相似的数据格式,但它们在内容上的巨大差异导致我们将它们视为不同的模式,每种模式都配备了自己的标记器。Encodec一种卷积自动编码器,其潜在空间使用残差向量量化(RVQ)进行量化,作为音乐标记器。

4.7 VideoPoet:A large language model for zero-shot video generation

VideoPoet将所有模态编码到离散令牌空间中,以便可以直接使用大型语言模型架构进行视频生成。在<>中表示特殊标记。模态不可知标记为深红色;与文本相关的组件为蓝色;与视觉相关的组件为黄色;音频相关组件呈绿色。浅黄色布局的左侧部分表示双向前缀输入。深红色的右侧部分代表具有因果注意力的自回归生成的输出。

MAGVIT-v2,旨在使用共同的词汇表为视频和图像生成简洁而富有表现力的 token。它在视觉质量方面的性能高压缩能力,有效减少LLM所需的序列长度,从而有利于更加高效有效的学习。具体来说,视频剪辑被编码并量化为整数序列,并由解码器映射回像素空间。

卷积编码器生成输入音频样本的潜在表示,该表示使用可变数量 nq 个残差矢量量化器 (RVQ) 进行量化。在训练期间,使用重构和对抗性损失的组合来优化模型参数。可选的条件输入可用于指示是否必须从音频中去除背景噪音。部署模型时,发送方客户端上的编码器和量化器将压缩比特流发送到接收方客户端,然后接收方客户端可以解码音频信号。

  • Super-Resolution

用于视频超分辨率的定制transformer架构. SR transformer由三个transformer层的块组成,每个transformer层在与三个轴之一对齐的局部窗口中执行自注意力:空间垂直、空间水平和时间。交叉注意力层关注低分辨率(LR)标记序列,并且也分为局部窗口,与自注意力层的窗口同构。所有块还包括对 T5 XL 文本嵌入的交叉关注。

五、使用MLLM完成更多任务

5.1 Multimodal Agents - Chaining Multimodal Experts with LLMs

四种类型的 LMA(large multimodal agents) 的说明:

  1. 类型 I:闭源 LLMs 作为没有长期记忆的planner。他们主要利用提示技术来指导闭源LLMs决策和计划完成任务,无需长记忆。
  2. 类型 II:微调 LLMs 作为没有长期记忆的planner。他们利用与动作相关的数据来微调现有的开源大型模型,使其能够实现与闭源LLMs相当的决策、规划和工具调用能力。

与(a)和(b)不同,(c)和(d) 引入了长期记忆功能,进一步增强了它们在更接近现实世界的环境中的泛化和适应能力。然而,由于他们的planner使用不同的方法来检索记忆,因此他们可以进一步分为:

  1. 类型III:具有间接长期记忆的planner;
  2. 类型IV:具有本地长期记忆的planner。
两种多智能体框架的图示

在这两种框架中,面对来自环境的任务或指令,完成依赖于多个智能体的合作。每个智能体负责特定的职责,可能涉及处理环境信息或处理决策和规划,从而分散由单个智能体承担完成任务的压力。框架(b)的独特之处在于其长期记忆能力。

  • Inspection & Reflection:LMA 在复杂的多式联运环境中始终如一地制定有意义且能完成任务的计划是一项挑战。该组件旨在增强鲁棒性和适应性。一些研究方法将成功的经验存储在长期记忆中,包括多模式状态,以指导规划。在规划过程中,他们首先检索相关经验,帮助规划者深思熟虑,减少不确定性。此外,还有利用人类在不同状态下执行相同任务时制定的计划。当遇到类似的状态时,规划者可以参考这些“标准答案”进行思考,从而得出更合理的规划。DoraemonGPT采用了更复杂的规划方法,如蒙特卡罗,扩大了规划搜索的范围,以找到最优的规划策略。

  • Planning Methods::现有规划策略可分为动态规划和静态规划两种。前者是指将目标分解为一系列目标基于初始输入的子计划,类似于思想链(CoT),也不会重新制定计划;后者意味着每个计划都是根据当前环境信息或反馈制定的。如果在计划中检测到错误,它将恢复到原始状态以重新规划。

5.2 LLaVA-Plus

LLaVA Plus的四步过程:

  • 用户提供任务文本指令以及相关图片输入
  • LLM分析指令和图像,选择是否调用额外的工具完成指令,如果是,则生成调用工具所需要的prompt
  • 运行工具,返回工具输出结果给LLM
  • LLM汇总工具所输出结果,根据用户事先提供的文本指令和图片输入,生成相应的回复。

LLaVA-Plus拥有多样化的功能。除了能够处理基本的图像编辑任务,如物体检测、分割、打标签等,它还支持进行复杂的OCR处理和图像美化。此外LLaVA-Plus能够与外部知识进行交互,支持用户与模型的实时交互,如对点击区域进行实例分割等。

LLaVA-Plus 工作流程的示例,该工作流程可插入并学习使用对象检测和分割技能,并通过丰富的区域语言描述得到增强。灰色文本不在训练序列中。

5.3 MM-ReAct

  • 要启用图像作为输入,只需使用文件路径作为 ChatGPT 的输入。文件路径充当占位符,允许 ChatGPT 将其视为黑匣子。
  • 每当需要特定属性(例如名人姓名或框坐标)时,ChatGPT 都应寻求特定视觉专家的帮助来识别所需信息。
  • 专家输出被序列化为文本并与输入结合以进一步激活 ChatGPT。
  • 如果不需要外部专家,直接将响应返回给用户。

六、小结

参考

  1. SadTalker
  2. Real3DPortrait
  3. audio2photoreal
  4. AniPortrait
  5. GPT-SoVITS
  6. Seed-TTS
  7. ChatTTS
  8. Suno
  9. [论文解读]Visual bert
  10. VisualBERT: A Simple and Performant Baseline for Vision and Language
  11. 自然语言推断任务, 即给出一对(a pair of)句子, 判断两个句子是entailment(相近), contradiction(矛盾)还是neutral(中立)的. 由于也是分类问题, 也被称为sentence pair classification tasks.
  12. VisualBERT: A Simple and Performant Baseline for Vision and Language
  13. google-research/vision_transformer
  14. Vision Transformer详解
  15. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
  16. Masked Autoencoders Are Scalable Vision Learners
  17. 多模态学习(MultiModal Learning)
  18. openai多模态大模型:clip详解及实战
  19. Learning Transferable Visual Models From Natural Language Supervision
  20. CV领域的Open Set和Open World区别在哪
  21. CLIP 与 SigLIP 文本图像对其算法学习理解
  22. Sigmoid Loss for Language Image Pre-Training
  23. medium:Sigmoid Loss for Language Image Pre-Training
  24. Softmax和Sigmoid应用之——CLIP和SiGLIP
  25. Cohere For AI - Community Talks: Lucas Beyer
  26. Gemini: A Family of Highly Capable Multimodal Models
  27. The Dawn of LMMs: Preliminary Explorations with GPT-4V(ision)
  28. Do As I Can, Not As I Say: Grounding Language in Robotic Affordances
  29. InternLM/InternLM-XComposer
  30. InternLM-XComposer2: Mastering Free-form Text-Image Composition and Comprehension in Vision-Language Large Model
  31. Fuyu-8B: A Multimodal Architecture for AI Agents
  32. adept/fuyu-8b
  33. MiniCPM-V 2.0: 具备领先OCR和理解能力的高效端侧多模态大模型
  34. OpenBMB/MiniCPM-V
  35. microsoft/LLaVA-Med
  36. PKU-YuanGroup/Video-LLaVA
  37. tingxueronghua/ChartLlama-code
  38. lxe/llavavision
  39. haotian-liu/LLaVA
  40. LLaVA: Visual Instruction Tuning
  41. LLaVA: Visual Instruction Tuning翻译
  42. LLaVA-NeXT: Improved reasoning, OCR, and world knowledge
  43. Improved Baselines with Visual Instruction Tuning
  44. huggingface InternVL-Chat-V1-5代码
  45. How Far Are We to GPT-4V? Closing the Gap to Commercial Multimodal Models with Open-Source Suites
  46. Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network
  47. 上采样和下采样
  48. Is the deconvolution layer the same as a convolutional layer?
  49. Is (Convolution + PixelShuffle) the same as SubPixel convolution?
  50. Pixel Shuffle
  51. MoE-LLaVA: Mixture of Experts for Large Vision-Language Models
  52. PKU-YuanGroup/MoE-LLaVA
  53. MoE-LLaVA——将多模态大模型稀疏化
  54. TinyLLaVA Factory: A Modularized Codebase for Small-scale Large Multimodal Models
  55. TinyLLaVA/TinyLLaVA_Factory
  56. phellonchen/X-LLM
  57. CIF: Continuous Integrate-and-Fire for End-to-End Speech Recognition
  58. X-LLM: Bootstrapping Advanced Large Language Models by Treating Multi-Modalities as Foreign Languages
  59. CIF:基于神经元整合发放的语音识别新机制
  60. BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models
  61. 【多模态】6、BLIP-2 | 使用 Q-Former 连接冻结的图像和语言模型 实现高效图文预训练
  62. BLIP-2代码官方实现
  63. NExT-GPT:Any-to-Any Multimodal Large Language Model
  64. NExT-GPT/NExT-GPT
  65. ImageBind: Holistic AI learning across six modalities
  66. ImageBind: One Embedding Space To Bind Them All
  67. AudioLDM: Text-to-Audio Generation with Latent Diffusion Models
  68. NExT-GPT: Any-to-Any Multimodal LLM
  69. OpenMOSS/AnyGPT
  70. AnyGPT:Unified Multimodal LLM with Discrete Sequence Modeling
  71. AnyGPT: Unified Multimodal LLM with Discrete Sequence Modeling(Paper)
  72. High Fidelity Neural Audio Compression
  73. facebookresearch/encodec
  74. SpeechTokenizer: Unified Speech Tokenizer for Speech Large Language Models
  75. Planting a SEED of Vision in Large Language Model
  76. VideoPoet: A Large Language Model for Zero-Shot Video Generation(paper)
  77. SoundStream: An End-to-End Neural Audio Codec(Paper)
  78. wesbz/SoundStream
  79. Language Model Beats Diffusion – Tokenizer is Key to Visual Generation
  80. VideoPoet: A large language model for zero-shot video generation
  81. VideoPoet
  82. Large Multimodal Agents: A Survey
  83. Awesome Large Multimodal Agents
  84. AppAgent-TencentQQGYLab
  85. LLaVA-VL/LLaVA-Plus-Codebase
  86. LLaVA-Plus: Learning to Use Tools for Creating Multimodal Agents
  87. LLaVA-Plus:多模态大模型的新突破
  88. huggingface llava_plus
  89. microsoft/MM-REACT
  90. MM-REACT: Prompting ChatGPT for Multimodal Reasoning and Action
  91. 多模态和多模态大模型 (LMM)[译]

多模态大型语言模型(MLLM)
https://mztchaoqun.com.cn/posts/D52_MLLM/
作者
mztchaoqun
发布于
2024年12月17日
许可协议