多模态模型(MLLM)中文本生成器的过程和原理
多模态模型中文本生成器的过程和原理
在多模态模型里,文本生成器通常指负责输出自然语言结果的模块。它接收图像、视频、音频、文本、OCR、检测框等多模态信息,最终生成:
图像描述
视觉问答答案
商品属性说明
OCR 解释
视频摘要
机器人动作说明
结构化 JSON
诊断报告
库存差异说明
本质上,文本生成器通常就是一个 LLM Decoder,例如 LLaMA、Qwen、Vicuna、Mistral、Phi、Gemma 等。
1. 总体流程
多模态文本生成的基本流程如下:
图像 / 视频 / 音频 / OCR / bbox / mask
↓
各自模态编码器
↓
模态特征 token / embedding
↓
跨模态对齐模块
↓
转换成 LLM 能理解的 token 表示
↓
文本生成器 LLM Decoder
↓
逐 token 自回归生成文本
可以抽象成:
视觉输入 I
文本问题 Q
v = VisionEncoder(I)
z = Projector(v)
h = LLM([z, Q])
answer = TextDecoder(h)
其中:
| 模块 | 作用 |
|---|---|
VisionEncoder |
把图像变成视觉特征 |
Projector |
把视觉特征映射到 LLM 词向量空间 |
LLM Decoder |
根据视觉 token 和文本 prompt 生成答案 |
Tokenizer |
文本与 token ID 之间转换 |
Sampler |
控制生成策略,例如 greedy、top-k、top-p、beam search |
2. 文本生成器在多模态模型中的位置
以典型 VLM 为例:
图像
↓
Vision Encoder
↓
Visual Tokens
↓
Projector
↓
Visual Tokens in LLM Space
↓
问题文本 → Tokenizer → Text Tokens
↓
[Visual Tokens + Text Tokens]
↓
LLM Decoder
↓
Generated Text
在 LLaVA、MiniGPT-4、MiniCPM-V、Qwen-VL、SmolVLM 这类模型中,文本生成器通常就是 decoder-only LLM。
3. 为什么多模态模型可以生成文本?
核心原因是:
视觉、音频、视频等模态被转换成了类似“软文本 token”的向量,然后喂给语言模型。
LLM 本来只能处理文本 token:
"图片里有什么?" → [token_1, token_2, token_3, ...]
多模态模型会把图像也转换成 token:
image → [visual_token_1, visual_token_2, visual_token_3, ...]
然后拼接成:
[visual_token_1, visual_token_2, ..., text_token_1, text_token_2, ...]
LLM 会把这些视觉 token 当成上下文信息,然后继续生成文本。
4. 关键原理一:模态编码
不同模态首先要编码成向量。
4.1 图像编码
常见视觉编码器:
CLIP ViT
SigLIP
EVA-CLIP
DINOv2
ConvNeXt
SAM Encoder
EfficientViT
输入图像:
I ∈ R^(H×W×3)
经过视觉编码器:
V = VisionEncoder(I)
输出视觉 token:
V = [v1, v2, v3, ..., vn]
每个 vi 是一个图像 patch 的语义表示。
例如一张图像被切成 14×14 个 patch,就可能得到 196 个视觉 token。
4.2 音频编码
音频模型中,常见编码器包括:
Whisper Encoder
Wav2Vec2
HuBERT
EnCodec
BEATs
音频输入:
A = waveform / mel spectrogram
编码后:
A_tokens = AudioEncoder(A)
这些 token 可以表示语音内容、说话人、音色、情绪、环境声等。
4.3 视频编码
视频一般是图像序列:
Video = [frame_1, frame_2, ..., frame_t]
可以通过:
ViT + temporal adapter
VideoMAE
TimeSformer
3D CNN
Frame sampling + CLIP
生成视频 token:
V_video = VideoEncoder(Video)
视频文本生成器可以基于这些 token 生成:
视频摘要
动作描述
事件检测结果
时序问答答案
5. 关键原理二:跨模态对齐
LLM 原本不理解视觉特征,所以需要一个 跨模态对齐层。
常见做法有四种。
5.1 Linear Projector / MLP Projector
这是 LLaVA 类模型最常用的方式。
视觉特征维度:1024
LLM hidden size:4096
需要一个投影层:
z = MLP(v)
把视觉 token 映射到 LLM 的 hidden space。
结构类似:
Vision Token 1024
↓
Linear / MLP
↓
LLM Token 4096
优点:
简单
速度快
容易训练
适合 sVLM
缺点:
视觉 token 数多时推理成本高
细粒度对齐能力有限
5.2 Q-Former
BLIP-2、MiniGPT-4 早期路线常用 Q-Former。
它使用一组 learnable query 从视觉特征中提取关键信息。
Image Features
↓
Q-Former
↓
少量 Query Tokens
↓
LLM
例如:
视觉 patch token:576 个
Q-Former query token:32 个
这样可以大幅减少送入 LLM 的 token 数量。
优点:
压缩视觉信息
降低 LLM 上下文长度
适合轻量化
缺点:
结构更复杂
训练难度高于 MLP projector
5.3 Perceiver Resampler / Token Compressor
Flamingo、部分 VLM 和 sVLM 会用 resampler 压缩视觉 token。
大量视觉 token
↓
Resampler
↓
固定数量视觉 token
↓
LLM
这对边缘端很重要,因为视觉 token 越多,LLM 推理越慢。
5.4 Cross-Attention
有些模型不会直接把视觉 token 拼到文本 token 前面,而是在 LLM 中加入 cross-attention。
文本 token 作为 Query
视觉 token 作为 Key / Value
即:
Attention(Q_text, K_visual, V_visual)
优点是模态融合更灵活;缺点是改动 LLM 结构,工程部署复杂。
6. 关键原理三:文本生成器的自回归生成
文本生成器一般采用 自回归语言建模。
也就是每次预测下一个 token:
P(y_t | y_1, y_2, ..., y_{t-1}, image, prompt)
完整生成概率为:
P(Y | X) = ∏ P(y_t | y_<t, X)
其中:
X = 图像 token + 文本 prompt
Y = 生成的答案 token
例如输入:
图像:一瓶可乐
问题:这是什么商品?
模型生成过程:
Step 1: 预测 “这”
Step 2: 预测 “是”
Step 3: 预测 “一”
Step 4: 预测 “瓶”
Step 5: 预测 “可”
Step 6: 预测 “乐”
Step 7: 预测 “。”
最终输出:
这是一瓶可乐。
7. 文本生成的详细推理过程
假设输入是一张自动售货柜图片和一个问题:
图片:柜体图像
问题:请判断第二层左侧商品是什么?
推理流程:
1. 图像预处理
resize / normalize / patchify
2. 视觉编码
image → visual tokens
3. 视觉 token 压缩或投影
visual tokens → LLM-compatible tokens
4. 文本 prompt tokenize
问题 → text token ids
5. 拼接多模态上下文
[BOS] [IMG_TOKENS] [USER_PROMPT]
6. LLM 前向推理
计算 hidden states
7. 预测下一个 token 概率
logits = LMHead(hidden)
8. 采样或选择 token
greedy / top-p / top-k / beam search
9. 把生成 token 追加到上下文
10. 重复直到生成 EOS 或达到最大长度
伪代码:
visual_feats = vision_encoder(image)
visual_tokens = projector(visual_feats)
text_tokens = tokenizer(prompt)
context = concat(visual_tokens, text_tokens)
generated = []
for step in range(max_new_tokens):
hidden = llm(context)
logits = lm_head(hidden[-1])
next_token = sample(logits)
generated.append(next_token)
context.append(next_token)
if next_token == EOS:
break
answer = tokenizer.decode(generated)
8. 训练过程
多模态文本生成器通常分阶段训练。
8.1 第一阶段:视觉-语言对齐预训练
目标是让视觉 token 能被 LLM 理解。
输入:
图像 + caption
训练目标:
根据图像生成 caption
例如:
输入图像:一只狗在草地上
目标文本:A dog is running on the grass.
训练时常常冻结:
Vision Encoder
LLM
只训练:
Projector / Q-Former / Adapter
这样成本较低。
8.2 第二阶段:视觉指令微调
让模型学会按照用户指令回答。
数据形式:
{
"image": "xxx.jpg",
"conversations": [
{
"from": "user",
"value": "<image>\n这张图中有什么商品?"
},
{
"from": "assistant",
"value": "图中有一瓶可乐和一包薯片。"
}
]
}
训练目标:
输入:图像 + 用户问题
输出:人工或大模型生成的答案
此阶段让模型具备:
视觉问答
描述生成
细粒度识别
OCR 解释
复杂推理
结构化输出
8.3 第三阶段:领域微调
针对具体业务场景,例如:
自动售货柜
医学影像
工业质检
机器人操作
交通监控
文档理解
可以继续微调:
LoRA
Adapter
Projector
视觉塔最后几层
LLM 部分层
例如自动售货柜场景:
输入:柜体图片 + SKU 库 + 任务指令
输出:商品列表 / 库存差异 / 异常说明
训练样本:
{
"image": "cabinet_001.jpg",
"instruction": "识别第二层所有商品,并输出 JSON。",
"output": {
"shelf": 2,
"items": [
{
"sku": "coca_cola_500ml",
"count": 3
},
{
"sku": "sprite_500ml",
"count": 2
}
]
}
}
9. 损失函数原理
文本生成器最核心的训练目标是 next token prediction。
给定目标文本:
Y = [y1, y2, y3, ..., yn]
模型预测:
P(y_t | y_<t, image, prompt)
损失函数:
L = - Σ log P(y_t | y_<t, image, prompt)
也就是交叉熵损失:
L_ce = CrossEntropy(logits, target_token_ids)
如果模型生成目标是:
这是一瓶可乐
训练时:
输入:这
预测:是
输入:这是
预测:一
输入:这是一
预测:瓶
输入:这是一瓶
预测:可
不断让模型学会预测下一个 token。
10. 文本生成器的几种结构路线
10.1 Decoder-only 路线
代表:
LLaVA
MiniGPT-4
Qwen-VL
MiniCPM-V
InternVL
SmolVLM
MobileVLM
结构:
[Visual Tokens] + [Text Tokens] → LLM Decoder → Text
优点:
简单
复用现有 LLM
工程部署方便
适合 llama.cpp / vLLM / TensorRT-LLM
缺点:
视觉 token 会占用上下文长度
长图、多图、视频成本较高
10.2 Encoder-Decoder 路线
代表:
BLIP
BLIP-2
T5-based VLM
Unified-IO
结构:
Encoder: 多模态输入编码
Decoder: 文本生成
优点:
输入输出结构清晰
适合 caption、VQA、OCR、文档理解
缺点:
不如 decoder-only LLM 生态成熟
接入通用 LLM 工具链略复杂
10.3 Cross-Attention 路线
代表:
Flamingo
Kosmos 部分架构
部分 Video-Language 模型
结构:
LLM 内部通过 cross-attention 读取视觉特征
优点:
多模态融合能力强
适合多图、多帧、视频场景
缺点:
需要改 LLM 结构
部署复杂度高
11. 生成策略
文本生成不是直接选一个固定结果,而是根据概率分布逐 token 生成。
常见策略如下。
11.1 Greedy Search
每次选择概率最大的 token。
next_token = argmax(logits)
优点:
速度快
结果稳定
适合结构化输出
缺点:
容易死板
多样性差
适合:
JSON 输出
商品识别
库存差异
分类判断
11.2 Beam Search
保留多个候选序列。
beam_size = 3 / 5 / 10
优点:
结果更稳
适合翻译、caption
缺点:
速度慢
对开放式对话不一定好
11.3 Top-k Sampling
只从概率最高的 k 个 token 中采样。
k = 40
优点:
有一定随机性
缺点:
结构化任务不够稳定
11.4 Top-p Sampling
从累计概率达到 p 的 token 集合中采样。
p = 0.9
适合开放式描述和创意生成。
11.5 Temperature
控制分布平滑程度。
temperature < 1:更保守
temperature > 1:更多样
对于工业识别类任务,建议:
temperature = 0 或 0.1
top_p = 1
greedy decoding
对于描述生成,可以使用:
temperature = 0.7
top_p = 0.9
12. 多模态文本生成器为什么会幻觉?
多模态模型生成文本时,可能会出现幻觉:
图中没有可乐,但模型说有可乐
看不到文字,但模型编了 OCR 内容
商品数量错误
把相似包装误认为另一个 SKU
原因主要有:
| 原因 | 解释 |
|---|---|
| 视觉 token 信息不足 | 图像分辨率低、token 被压缩过度 |
| 语言先验太强 | LLM 根据常识补全,而不是严格看图 |
| 对齐不足 | 视觉特征没有准确映射到语言空间 |
| 训练数据偏差 | 常见共现关系导致伪推理 |
| 解码策略过开放 | temperature 过高导致编造 |
| 缺少检测约束 | 纯 VLM 不擅长精确计数和定位 |
所以在工程中,不建议完全依赖 VLM 文本生成结果做最终判断。
13. 文本生成器在 sVLM 中的轻量化
sVLM 的文本生成器通常会做以下优化:
13.1 小型 LLM
例如:
0.5B
1B
1.5B
2B
3B
相比 7B、13B,更适合边缘端。
13.2 量化
常见量化:
FP16
INT8
INT4
GPTQ
AWQ
GGUF Q4_K_M
用于降低:
显存
内存
带宽
功耗
推理延迟
13.3 视觉 token 压缩
这是 sVLM 特别关键的点。
576 visual tokens → 64 tokens
1024 visual tokens → 128 tokens
多帧视频 token → memory tokens
视觉 token 越少,LLM 解码越快。
13.4 KV Cache
自回归生成时,每生成一个 token 都要复用历史上下文。
KV Cache 存储:
Key Cache
Value Cache
避免每次都重复计算前面的 token。
没有 KV Cache:
每步重新计算全部上下文
有 KV Cache:
只计算新 token
这是实时文本生成的关键优化。
16. 总结
多模态模型中的文本生成器,本质上是:
把图像、音频、视频等非文本模态编码成 token,
通过 projector / Q-Former / cross-attention 对齐到 LLM 空间,
再由 LLM decoder 按自回归方式逐 token 生成文本。
对 sVLM 和边缘部署来说,关键不是单纯让模型“会说话”,而是让文本生成器成为:
结构化事实解释器
低置信度复核器
多模态证据融合器
业务决策说明器
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)