英偉達(dá)NVLM多模態(tài)大模型細(xì)節(jié)和數(shù)據(jù)集 原創(chuàng)
前期筆者介紹了OCR-free的多模態(tài)大模型,可以參考:??【多模態(tài)&文檔智能】OCR-free感知多模態(tài)大模型技術(shù)鏈路及訓(xùn)練數(shù)據(jù)細(xì)節(jié)??,其更偏向于訓(xùn)練模型對(duì)于密集文本的感知能力。本文看一看英偉達(dá)出品的多模態(tài)大模型NVLM-1.0系列,雖然暫未開(kāi)源,但該文章給出了NVLM的詳細(xì)細(xì)節(jié),值得一讀。
NVLM-1.0方法
NVLM-1.0包括三種不同的架構(gòu):
- NVLM-D,一種解碼器架構(gòu);
- NVLM-X,一種基于交叉注意力(X-attention)的架構(gòu);
- NVLM-H,一種混合架構(gòu)。
共享視覺(jué)路徑
所有NVLM模型共享一個(gè)視覺(jué)路徑。使用InternViT-6B-448px-V1-5作為默認(rèn)的視覺(jué)編碼器,并在整個(gè)訓(xùn)練階段保持其凍結(jié)狀態(tài)。該視覺(jué)編碼器以固定的448x448像素分辨率處理圖像,生成1024個(gè)輸出標(biāo)記。采用動(dòng)態(tài)高分辨率(DHR)方法來(lái)處理不同分辨率的圖像輸入。具體的如下圖,圖像被分割成最多6個(gè)瓦片(tile),每個(gè)瓦片對(duì)應(yīng)448x448像素。然后,每個(gè)瓦片被送入InternViT-6B進(jìn)行處理,生成1024個(gè)標(biāo)記。這些標(biāo)記通過(guò)下采樣操作減少到256個(gè)標(biāo)記,這么做可以降低處理開(kāi)銷。
上述兩張圖都是動(dòng)態(tài)DHR的處理過(guò)程,圍繞圖像的預(yù)處理,包括歸一化、縮放、裁剪、根據(jù)寬高比動(dòng)態(tài)處理等操作,構(gòu)建了一套完整的流程,代碼邏輯如下:
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標(biāo)簽:
- 無(wú)標(biāo)簽:簡(jiǎn)單連接,沒(méi)有tile標(biāo)簽,這是InternVL-1.5的設(shè)計(jì)。
- 一維扁平化tile tag:<tile_1>、<tile_2>、...、<tile_6>、<tile_global>。
- 二維網(wǎng)格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}中的任何一個(gè)。
- 二維邊界框標(biāo)簽: (x0, y0), (x1, y1) 、...、 (xW, yH), (xW+1, yH+1) ,其中(xi, yj)和(xi+1, yj+1)分別是整個(gè)高分辨率圖像中該特定tile的(左、上)和(右、下)坐標(biāo)。
實(shí)驗(yàn)可以看到,其中DHR + 1-D tag取得了最佳的性能。
NVLM-D: 解碼器架構(gòu)
NVLM-D模型類似于之前的解碼器架構(gòu)多模態(tài)LLMs(如:)。通過(guò)一個(gè)兩層MLP將預(yù)訓(xùn)練的視覺(jué)編碼器連接到LLM。訓(xùn)練NVLM-D涉及兩個(gè)階段:預(yù)訓(xùn)練和SFT。在預(yù)訓(xùn)練階段,MLP需要先進(jìn)行訓(xùn)練,同時(shí)保持視覺(jué)編碼器和LLM主干凍結(jié)。在SFT階段,MLP和LLM都被訓(xùn)練以學(xué)習(xí)新的視覺(jué)-語(yǔ)言任務(wù),而視覺(jué)編碼器保持凍結(jié)狀態(tài)。為了防止LLM在多模態(tài)SFT訓(xùn)練期間退化文本性能,引入了一個(gè)高質(zhì)量的文本SFT數(shù)據(jù)集。
NVLM-X: 基于X-attention的模型
NVLM-X使用門控交叉注意力來(lái)處理圖像token。與Flamingo模型不同,NVLM-X不使用感知重采樣器,而是直接通過(guò)交叉注意力層處理圖像標(biāo)記。在SFT階段,解凍LLM主干,并混合高質(zhì)量文本SFT數(shù)據(jù)集以保持強(qiáng)大的文本性能。
NVLM-H: 混合模型
NVLM-H結(jié)合了解碼器架構(gòu)和基于X-attention的架構(gòu)的優(yōu)點(diǎn)。將圖像token分為兩部分:縮略圖token和常規(guī)瓦片token??s略圖標(biāo)記通過(guò)自注意力層處理,而常規(guī)瓦片標(biāo)記通過(guò)交叉注意力層處理。這種設(shè)計(jì)提高了高分辨率圖像的處理能力,同時(shí)顯著提高了計(jì)算效率。
模型配置和訓(xùn)練方法
所有NVLM模型的訓(xùn)練過(guò)程包括兩個(gè)階段:預(yù)訓(xùn)練和監(jiān)督微調(diào)(SFT)。在預(yù)訓(xùn)練階段,凍結(jié)LLM主干和視覺(jué)編碼器,只訓(xùn)練模態(tài)對(duì)齊模塊。在SFT階段,保持視覺(jué)編碼器凍結(jié),同時(shí)訓(xùn)練LLM和模態(tài)對(duì)齊模塊。
LLM和視覺(jué)模型選擇
- LLM:對(duì)于NVLM-D、NVLM-X和NVLM-H 72B模型,使用Qwen2-72B-Instruct作為L(zhǎng)LM。為了計(jì)算效率,還使用了較小的Nous-Hermes-2-Yi-34B進(jìn)行更快的消融研究和實(shí)驗(yàn)。
- 視覺(jué)編碼器:所有NVLM模型都使用InternViT-6B-448px-V1-5作為視覺(jué)編碼器。
模態(tài)對(duì)齊模塊
- NVLM-D: 使用兩層MLP將視覺(jué)編碼器和背景語(yǔ)言模型連接起來(lái)。隱藏維度為12800→20480→7168(34B模型)和12800→29568→8192(72B模型)。
- NVLM-X: 圖像特征首先通過(guò)一層MLP投影到背景語(yǔ)言模型的隱藏維度,然后插入門控X-attention層。具體配置為12800→7168(34B模型)和12800→8192(72B模型)。
- NVLM-H: 使用兩層MLP和X-attention層作為模態(tài)對(duì)齊模塊??s略圖圖像標(biāo)記直接輸入到背景語(yǔ)言模型解碼器中,而常規(guī)圖像塊則通過(guò)X-attention層進(jìn)行處理。
訓(xùn)練超參數(shù)
- 預(yù)訓(xùn)練階段
- SFT階段
訓(xùn)練數(shù)據(jù)
- 預(yù)訓(xùn)練數(shù)據(jù)集
- SFT數(shù)據(jù)集
- 文本SFT數(shù)據(jù)集
包括ShareGPT、SlimOrca、EvolInstruct、GPTeacher、AlpacaGPT4、UltraInteract、OrcaMathWordProblems、MathInstruct、MetaMath、GlaiveCodeAssistant、Magicoder、WizardCoder、GlaiveCodeAssistant等。并使用OpenAI模型GPT-4o和GPT-4o-mini進(jìn)一步優(yōu)化響應(yīng)質(zhì)量,并進(jìn)行數(shù)據(jù)去污染,確保不包含基準(zhǔn)測(cè)試數(shù)據(jù)集中的提示。 - SFT數(shù)據(jù)構(gòu)建格式
實(shí)驗(yàn)結(jié)果
重點(diǎn)關(guān)注多模態(tài)推理、視覺(jué)上下文中的數(shù)學(xué)推理、自然圖像理解、場(chǎng)景-文本閱讀、圖表理解、文檔理解、現(xiàn)實(shí)世界感知和OCR能力。
參考文獻(xiàn)
- NVLM: Open Frontier-Class Multimodal LLMs,https://arxiv.org/pdf/2409.11402
本文轉(zhuǎn)載自公眾號(hào)大模型自然語(yǔ)言處理 作者:余俊暉
