InternVL 架构与训练策略
InternVL 是上海 AI Lab 推出的视觉语言模型系列,以创新的动态分辨率处理、渐进式对齐训练和强大的 OCR/文档理解能力著称,在多项多模态基准测试中取得了领先成绩。
架构设计
InternVL 的架构包含以下核心组件:
- InternViT:6B 参数的视觉编码器,支持动态分辨率输入
- MLP 投影层:将视觉特征映射到语言模型空间
- 语言模型:基于 InternLM2 的解码器
动态分辨率机制
InternVL 的动态分辨率处理是其核心创新:
python
class DynamicResolution:
"""InternVL 动态分辨率处理"""
def __init__(self, max_tiles=12, tile_size=448):
self.max_tiles = max_tiles
self.tile_size = tile_size
def find_best_resolution(self, orig_size):
"""找到最优的切分方案"""
orig_width, orig_height = orig_size
best_ratio = orig_width / orig_height
best_tiles = 1
best_diff = float('inf')
for tiles in range(1, self.max_tiles + 1):
for rows in range(1, tiles + 1):
cols = tiles // rows
if rows * cols != tiles:
continue
ratio = cols / rows
diff = abs(ratio - best_ratio)
if diff < best_diff:
best_diff = diff
best_tiles = tiles
best_rows, best_cols = rows, cols
return best_rows, best_cols
def preprocess(self, image):
rows, cols = self.find_best_resolution(image.size)
target_w = cols * self.tile_size
target_h = rows * self.tile_size
image = image.resize((target_w, target_h))
# 切分为 tiles
tiles = []
for i in range(rows):
for j in range(cols):
tile = image.crop((
j * self.tile_size, i * self.tile_size,
(j+1) * self.tile_size, (i+1) * self.tile_size
))
tiles.append(tile)
return tiles渐进式对齐训练
InternVL 采用三阶段渐进式训练策略:
阶段一:视觉-语言对齐
- 使用大规模图文对数据(约 10 亿对)
- 冻结语言模型,训练视觉编码器和投影层
- 建立基础的跨模态映射
阶段二:视觉指令微调
- 使用多模态指令数据
- 解冻所有参数联合训练
- 增强多模态对话和推理能力
阶段三:特定任务精调
- 针对OCR、文档理解等任务精调
- 使用高质量领域数据
InternVL-2 的改进
InternVL-2 引入了更强的 InternViT-6B 视觉编码器,支持最多 40 个 tile 的动态分辨率,在 OCR 和文档理解任务上取得了显著提升。
核心能力
InternVL 在以下任务上表现突出:
- OCR 与文档理解:支持高分辨率文档图像的文字识别和结构理解
- 图表分析:理解数据图表并回答相关问题
- 数学推理:结合视觉信息的数学问题求解
- 多图理解:同时处理多张图像的对比分析
性能对比
| 模型 | 参数量 | OCRBench | DocVQA | MathVista |
|---|---|---|---|---|
| InternVL-2-8B | 8B | 82.3 | 91.6 | 58.3 |
| InternVL-2-26B | 26B | 85.1 | 93.2 | 63.8 |
| InternVL-2-76B | 76B | 87.2 | 94.5 | 67.5 |
| GPT-4o | - | 85.6 | 92.8 | 63.8 |