英伟达NVLM多模态大模型细节和数据集 原创
前期笔者介绍了OCR-free的多模态大模型,可以参考:【多模态&文档智能】OCR-free感知多模态大模型技术链路及训练数据细节,其更偏向于训练模型对于密集文本的感知能力。本文看一看英伟达出品的多模态大模型NVLM-1.0系列,虽然暂未开源,但该文章给出了NVLM的详细细节,值得一读。
NVLM-1.0方法
NVLM-1.0包括三种不同的架构:
- NVLM-D,一种解码器架构;
- NVLM-X,一种基于交叉注意力(X-attention)的架构;
- NVLM-H,一种混合架构。
共享视觉路径
所有NVLM模型共享一个视觉路径。使用InternViT-6B-448px-V1-5作为默认的视觉编码器,并在整个训练阶段保持其冻结状态。该视觉编码器以固定的448x448像素分辨率处理图像,生成1024个输出标记。采用动态高分辨率(DHR)方法来处理不同分辨率的图像输入。具体的如下图,图像被分割成最多6个瓦片(tile),每个瓦片对应448x448像素。然后,每个瓦片被送入InternViT-6B进行处理,生成1024个标记。这些标记通过下采样操作减少到256个标记,这么做可以降低处理开销。
上述两张图都是动态DHR的处理过程,围绕图像的预处理,包括归一化、缩放、裁剪、根据宽高比动态处理等操作,构建了一套完整的流程,代码逻辑如下:
import torch
from PIL import Image
import torchvision.transforms as T
from torchvision.transforms.functional import InterpolationMode
IMAGENET_MEAN = (0.485, 0.456, 0.406)
IMAGENET_STD = (0.229, 0.224, 0.225)
def build_transform(input_size):
MEAN, STD = IMAGENET_MEAN, IMAGENET_STD
transform = T.Compose([
T.Lambda(lambda img: img.convert('RGB') if img.mode != 'RGB'else img),
T.Resize((input_size, input_size), interpolatinotallow=InterpolationMode.BICUBIC),
T.ToTensor(),
T.Normalize(mean=MEAN, std=STD)
])
return transform
def find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):
best_ratio_diff = float('inf')
best_ratio = (1, 1)
area = width * height
for ratio in target_ratios:
target_aspect_ratio = ratio[0] / ratio[1]
ratio_diff = abs(aspect_ratio - target_aspect_ratio)
if ratio_diff < best_ratio_diff:
best_ratio_diff = ratio_diff
best_ratio = ratio
elif ratio_diff == best_ratio_diff:
if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]:
best_ratio = ratio
return best_ratio
def dynamic_preprocess(image, min_num=1, max_num=6, image_size=448, use_thumbnail=True):
orig_width, orig_height = image.size
aspect_ratio = orig_width / orig_height
target_ratios = set(
(i, j) for n in range(min_num, max_num + 1) for i in range(1, n + 1) for j in range(1, n + 1) if
i * j <= max_num and i * j >= min_num)
target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])
target_aspect_ratio = find_closest_aspect_ratio(
aspect_ratio, target_ratios, orig_width, orig_height, image_size)
target_width = image_size * target_aspect_ratio[0]
target_height = image_size * target_aspect_ratio[1]
blocks = target_aspect_ratio[0] * target_aspect_ratio[1]
resized_img = image.resize((target_width, target_height))
processed_images = []
for i in range(blocks):
box = (
(i % (target_width // image_size)) * image_size,
(i // (target_width // image_size)) * image_size,
((i % (target_width // image_size)) + 1) * image_size,
((i // (target_width // image_size)) + 1) * image_size
)
split_img = resized_img.crop(box)
processed_images.append(split_img)
assert len(processed_images) == blocks
if use_thumbnail and len(processed_images) != 1:
thumbnail_img = image.resize((image_size, image_size))
processed_images.append(thumbnail_img)
return processed_images
def load_image(image_file, input_size=448, max_num=6):
image = Image.open(image_file).convert('RGB')
transform = build_transform(input_size=input_size)
images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=True, max_num=max_num)
pixel_values = [transform(image) for image in images]
pixel_values = torch.stack(pixel_values)
return pixel_values
文中引入了三种tile标签:
- 无标签:简单连接,没有tile标签,这是InternVL-1.5的设计。
- 一维扁平化tile tag:<tile_1>、<tile_2>、...、<tile_6>、<tile_global>。
- 二维网格tag:<tile_x0_y0>、<tile_x1_y0>、...、<tile_xW_yH>、<tile_global>,其中<tile_xi_yj>的{i:j}可以是{1:1, 1:2, 1:3, 1:4, 1:5, 1:6, 2:1, 2:2, 2:3, 3:1, 3:2, 4:1, 5:1, 6:1}中的任何一个。
- 二维边界框标签: (x0, y0), (x1, y1) 、...、 (xW, yH), (xW+1, yH+1) ,其中(xi, yj)和(xi+1, yj+1)分别是整个高分辨率图像中该特定tile的(左、上)和(右、下)坐标。
实验可以看到,其中DHR + 1-D tag取得了最佳的性能。
NVLM-D: 解码器架构
NVLM-D模型类似于之前的解码器架构多模态LLMs(如:)。通过一个两层MLP将预训练的视觉编码器连接到LLM。训练NVLM-D涉及两个阶段:预训练和SFT。在预训练阶段,MLP需要先进行训练,同时保持视觉编码器和LLM主干冻结。在SFT阶段,MLP和LLM都被训练以学习新的视觉-语言任务,而视觉编码器保持冻结状态。为了防止LLM在多模态SFT训练期间退化文本性能,引入了一个高质量的文本SFT数据集。
NVLM-X: 基于X-attention的模型
NVLM-X使用门控交叉注意力来处理图像token。与Flamingo模型不同,NVLM-X不使用感知重采样器,而是直接通过交叉注意力层处理图像标记。在SFT阶段,解冻LLM主干,并混合高质量文本SFT数据集以保持强大的文本性能。
NVLM-H: 混合模型
NVLM-H结合了解码器架构和基于X-attention的架构的优点。将图像token分为两部分:缩略图token和常规瓦片token。缩略图标记通过自注意力层处理,而常规瓦片标记通过交叉注意力层处理。这种设计提高了高分辨率图像的处理能力,同时显著提高了计算效率。
模型配置和训练方法
所有NVLM模型的训练过程包括两个阶段:预训练和监督微调(SFT)。在预训练阶段,冻结LLM主干和视觉编码器,只训练模态对齐模块。在SFT阶段,保持视觉编码器冻结,同时训练LLM和模态对齐模块。
LLM和视觉模型选择
- LLM:对于NVLM-D、NVLM-X和NVLM-H 72B模型,使用Qwen2-72B-Instruct作为LLM。为了计算效率,还使用了较小的Nous-Hermes-2-Yi-34B进行更快的消融研究和实验。
- 视觉编码器:所有NVLM模型都使用InternViT-6B-448px-V1-5作为视觉编码器。
模态对齐模块
- NVLM-D: 使用两层MLP将视觉编码器和背景语言模型连接起来。隐藏维度为12800→20480→7168(34B模型)和12800→29568→8192(72B模型)。
- NVLM-X: 图像特征首先通过一层MLP投影到背景语言模型的隐藏维度,然后插入门控X-attention层。具体配置为12800→7168(34B模型)和12800→8192(72B模型)。
- NVLM-H: 使用两层MLP和X-attention层作为模态对齐模块。缩略图图像标记直接输入到背景语言模型解码器中,而常规图像块则通过X-attention层进行处理。
训练超参数
- 预训练阶段
- SFT阶段
训练数据
- 预训练数据集
- SFT数据集
- 文本SFT数据集
包括ShareGPT、SlimOrca、EvolInstruct、GPTeacher、AlpacaGPT4、UltraInteract、OrcaMathWordProblems、MathInstruct、MetaMath、GlaiveCodeAssistant、Magicoder、WizardCoder、GlaiveCodeAssistant等。并使用OpenAI模型GPT-4o和GPT-4o-mini进一步优化响应质量,并进行数据去污染,确保不包含基准测试数据集中的提示。 - SFT数据构建格式
实验结果
重点关注多模态推理、视觉上下文中的数学推理、自然图像理解、场景-文本阅读、图表理解、文档理解、现实世界感知和OCR能力。
参考文献
- NVLM: Open Frontier-Class Multimodal LLMs,https://arxiv.org/pdf/2409.11402
本文转载自公众号大模型自然语言处理 作者:余俊晖