走进 VLM(六):VLM 如何进行视觉推理?从图像理解到 Chain-of-Thought
专栏:走进 VLM——从视觉语言模型到多模态 Agent 的技术实战
本文是专栏第 6 篇,共 20 篇。
关键词:VLM、Vision Reasoning、VQA、Multimodal Attention、Chain-of-Thought、LLaVA、Qwen-VL、多模态推理
一、为什么 VLM 不只是一个“图片分类器”?
在前面的文章中,我们已经了解:
现代 VLM 的基本结构:
Image
↓
Vision Encoder
↓
Visual Token
↓
Projector
↓
LLM
↓
Answer
但是这里产生一个问题:
传统计算机视觉模型也能理解图片。
例如:
输入:
一张猫的图片
CNN:
Output:
cat
那么:
VLM 和 CNN 分类模型有什么区别?
核心区别:
分类模型只知道“图片是什么”,而 VLM 能够结合语言知识进行推理。
例如:
图片:
一个人在厨房拿着刀切苹果。
传统 CV:
person
knife
apple
kitchen
VLM:
可以回答:
问题:
这个人在做什么?
答案:
这个人正在厨房准备切苹果。
进一步:
问题:
如果这个人继续操作,下一步可能发生什么?
答案:
他可能会把苹果切成小块,用于烹饪或者食用。
这里已经不是简单视觉识别。
而是:
视觉理解
+
世界知识
+
逻辑推理
这就是:
Vision Reasoning。
二、Image Understanding 和 Image Reasoning 的区别
理解 VLM,必须区分两个概念。
1. Image Understanding(图像理解)
解决:
图片中有什么?
例如:
输入:
图片:
狗在草地奔跑
模型输出:
Dog
Grass
Outdoor
这是视觉感知。
对应:
Vision Encoder。
2. Image Reasoning(视觉推理)
解决:
图片背后的含义是什么?
例如:
图片:
一个人穿着雨衣,拿着伞。
问题:
为什么这个人拿伞?
模型:
因为可能正在下雨。
这里需要:
- 视觉信息
- 常识知识
- 语言推理
对应:
LLM。
所以:
一个完整 VLM:
实际上分两个阶段:
阶段1:
看见
Vision Encoder
阶段2:
思考
LLM Reasoning
三、VLM 推理的完整链路
假设用户输入:
图片:
一个小孩正在吹生日蜡烛
问题:
为什么桌子上有蜡烛?
VLM 内部过程:
Step 1:视觉编码
图片进入:
Vision Encoder。
例如:
CLIP ViT:
输出:
Visual Feature
[
v1,
v2,
...
v196
]
这些 Token 表示:
人物
桌子
蛋糕
蜡烛
环境
Step 2:视觉 Token 映射
Projector:
转换:
Visual Feature
↓
Visual Token
例如:
196 × 1024
↓
196 × 4096
变成:
LLM 可以理解的表示。
Step 3:文本输入
问题:
为什么桌子上有蜡烛?
Tokenizer:
转换:
Token1
Token2
Token3
Step 4:多模态融合
最终输入:
[
Visual Token1,
Visual Token2,
...
Text Token1,
Text Token2
]
进入 Transformer。
Step 5:LLM 推理
LLM 根据:
视觉:
蛋糕
蜡烛
小孩
结合已有知识:
生日庆祝
吹蜡烛
许愿
生成:
因为这可能是在庆祝生日。
四、LLM 为什么能够理解视觉 Token?
这是 VLM 最神奇的地方。
很多人认为:
LLM 只是处理文字。
实际上:
LLM 处理的是:
Embedding 空间中的语义关系。
文本:
生日
对应:
一个向量。
图片:
生日蛋糕
经过 Vision Encoder:
也变成:
一个向量。
如果训练过程中:
模型不断看到:
Image:
生日蛋糕
Text:
Birthday cake
那么:
视觉表示和语言表示会逐渐靠近。
最终:
模型学会:
图片中的蛋糕
≈
生日语义
这就是:
多模态对齐。
五、Multimodal Attention:VLM 如何关注图片区域?
Transformer 的核心:
Attention。
普通 LLM:
Query
↓
Key / Value
↓
Attention
例如:
生成:
“苹果”
模型关注:
前面的:
“红色”
“水果”
VLM:
Attention 同时处理:
视觉 Token:
<V1>
<V2>
<V3>
文本 Token:
苹果
是什么
模型需要学习:
问题:
是什么?
应该关注:
图片中的:
苹果区域
六、手写一个简单 Cross Attention
下面模拟:
文本 Query 关注视觉 Feature。
公式:
Attention(Q,K,V)=softmax(dQKT)V
代码:
import torch
import torch.nn as nn
class CrossAttention(nn.Module):
def __init__(
self,
dim
):
super().__init__()
self.q_proj = nn.Linear(
dim,
dim
)
self.k_proj = nn.Linear(
dim,
dim
)
self.v_proj = nn.Linear(
dim,
dim
)
def forward(
self,
text,
image
):
Q = self.q_proj(
text
)
K = self.k_proj(
image
)
V = self.v_proj(
image
)
attention = torch.matmul(
Q,
K.transpose(
-2,
-1
)
)
attention = attention / (
Q.shape[-1] ** 0.5
)
weight = torch.softmax(
attention,
dim=-1
)
output = torch.matmul(
weight,
V
)
return output
这里模拟:
Text Token
↓
查询
↓
寻找相关 Visual Token
例如:
问题:
桌子上有什么?
Query:
会自动关注:
桌子区域
蛋糕区域
七、VLM 中的 Chain-of-Thought(视觉思维链)
传统 LLM:
已经证明:
让模型展示推理过程,可以提高复杂任务能力。
例如:
问题:
小明有3个苹果,又买了2个,有几个?
模型:
3+2=5
答案5个
这就是:
Chain-of-Thought。
VLM 同样存在:
Visual Chain-of-Thought。
例如:
图片:
停车场。
问题:
这里是否安全停车?
普通回答:
可以停车。
推理:
1. 图片中存在停车线
2. 车辆停放在区域内
3. 没有明显禁止停车标志
所以可能允许停车。
这就是:
视觉推理链。
八、为什么大模型能回答开放式图片问题?
核心原因:
VLM 不只是学习图片。
它融合了:
1. 视觉知识
来自:
Vision Encoder。
例如:
知道:
狗
汽车
人
2. 语言知识
来自:
LLM。
例如:
知道:
生日
天气
交通规则
3. 推理能力
来自:
Transformer。
例如:
图片:
雨伞。
推理:
雨伞
↓
可能下雨
↓
天气不好
所以:
VLM:
不是:
Image → Label
而是:
Image
↓
Semantic Representation
↓
Reasoning
↓
Language
九、VQA:视觉问答任务
VQA:
Visual Question Answering。
任务:
输入:
Image
+
Question
输出:
Answer
例如:
图片:
狗在公园。
问题:
狗在哪里?
答案:
公园
VQA 是 VLM 最经典任务。
流程:
Image
↓
Vision Encoder
Question
↓
Tokenizer
↓
Fusion
↓
LLM
↓
Answer
十、使用 LLaVA 实现图片问答 Demo
安装:
pip install transformers accelerate pillow
加载模型:
import torch
from PIL import Image
from transformers import (
AutoProcessor,
LlavaForConditionalGeneration
)
model_id = (
"llava-hf/"
"llava-1.5-7b-hf"
)
processor = AutoProcessor.from_pretrained(
model_id
)
model = LlavaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="auto"
)
加载图片:
image = Image.open(
"test.jpg"
)
构造问题:
prompt = """
USER:
<image>
请描述这张图片。
ASS:
"""
处理输入:
inputs = processor(
text=prompt,
images=image,
return_tensors="pt"
).to(
"cuda"
)
生成:
output = model.generate(
**inputs,
max_new_tokens=100
)
answer = processor.decode(
output[0],
skip_special_tokens=True
)
print(answer)
输出类似:
图片中有一个人在厨房,
桌子上有食物,
可能正在准备饭菜。
这就是完整 VQA 流程。
十一、Prompt Engineering 在 VLM 中的重要性
同一个模型:
不同 Prompt:
效果可能完全不同。
例如:
简单:
描述图片
输出:
图片里有一个人。
优化:
请详细分析图片:
1. 场景
2. 物体
3. 人物行为
4. 可能发生的事件
输出:
更加丰富。
常见 VLM Prompt 技巧:
1. 指定任务
例如:
请作为图像分析专家回答。
2. 要求步骤分析
请先观察图片,
然后进行推理。
3. 指定输出格式
输出 JSON:
{
object:"",
action:""
}
十二、VLM 推理能力的限制
虽然 VLM 很强:
但是仍然存在问题。
1. 幻觉(Hallucination)
模型可能:
看到不存在的东西。
例如:
图片:
空桌子。
模型:
桌子上有一本书。
原因:
LLM 根据概率生成。
2. 精细视觉不足
例如:
图片:
复杂文档。
模型可能:
无法准确读取。
需要:
OCR。
3. 空间理解不足
例如:
问题:
左边第二个人拿什么?
模型可能回答错误。
十三、VLM 下一步:多模态 Agent
VLM 的最终目标:
不是回答问题。
而是:
理解世界。
未来:
Camera
↓
VLM
↓
Reasoning
↓
Agent
↓
Action
例如:
机器人:
看到:
桌子上的杯子。
理解:
杯子
↓
需要拿起来
↓
执行动作
十四、总结
这一篇我们理解了:
1. VLM 为什么能够推理?
因为:
Vision Encoder
+
LLM
+
Attention
共同作用。
2. VLM 推理流程:
Image
↓
Visual Token
↓
Multimodal Attention
↓
LLM Reasoning
↓
Answer
3. VLM 和传统 CV 的区别:
传统:
图片
↓
类别
VLM:
图片
↓
理解
↓
推理
↓
语言回答
4. VLM 是 Agent 的感知基础
未来 AI:
不会只读文字。
它需要:
看见世界。
而 VLM:
就是 AI 的视觉系统。
下一篇:
《走进 VLM(七):LLaVA 深度拆解——第一个开源视觉语言助手是如何训练出来的?》
下一篇进入经典模型:
- LLaVA 架构源码分析
- Vision Encoder 如何连接 LLaMA
- 视觉指令微调(Visual Instruction Tuning)
- 多模态训练数据构造
- 手写一个简化版 LLaVA