多模态与生成模型 Multimodal & Generative Models
2026 年,「原生多模态」正在取代「语言模型调度 + 视觉模型执行」的拼接模式:图像、文本、音频在共享潜空间里做 token 级的跨模态注意力,并涌现出初步的视觉推理能力。这个阶段覆盖理解(VLM)与生成(扩散 / DiT)两条主线,以及它们正在合流的方向。
阶段总览
- 理解 VLM 的三种主流架构(投影式 / 交叉注意力式 / 原生统一式)及各自取舍
- 掌握扩散模型与 Flow Matching 的数学直觉,能解释为什么用 DiT 替代 U-Net
- 理解图像与视频生成的关键难点:时序一致性、物理合理性、长视频记忆
- 了解语音与 Omni 模型的形态(ASR / TTS / 端到端语音对话)
- 能构造与清洗多模态训练数据(图文对、交错数据、视频描述、指令数据)
- 能对多模态模型做有效评测(幻觉、细粒度感知、OCR、空间关系)
- 能做部署与成本核算:视觉 token 量、分辨率、帧率对成本的巨大影响
| 周次 | 主题 | 交付物 |
|---|---|---|
| 第 1 周 | VLM 架构与视觉编码 | 跑通一个开源 VLM 并做细粒度评测 |
| 第 2 周 | 扩散模型与 DiT | 从零实现 DDPM 并训练一个小图像生成器 |
| 第 3 周 | Flow Matching 与图像生成 | 对比不同采样步数与质量的关系 |
| 第 4 周 | 视频生成与一致性 | 分析长视频生成的一致性失效模式 |
| 第 5 周 | 语音与全模态 | 接一个 ASR + TTS 组成语音对话回路 |
| 第 6 周 | 多模态数据与部署 | 数据管线 + 成本核算报告 |
1. 视觉语言模型(VLM)
学习路径
- 读 1.1 表格:对比三种范式的做法/优点/缺点
- 跑 SimpleVLM 前向,看 576 个视觉 token 怎么进入 LLM
- 完成 1.3 练习 1/5:排序交互深度/训练成本,说明 2026 趋势
- 对接 M11:在 mm/vlm.py 里选投影式的封装基线
核心知识点详解
- 三种范式交互深度排序:投影式(视觉编码器→投影层→LLM,交互浅)< 交叉注意力式(层间插视觉交叉注意力,更深)< 原生统一式(视觉/文本 token 同一骨干注意力,最深)。
- 训练成本反向:投影式实现简单、复用成熟 LLM、训练最便宜;交叉注意力式改造结构、成本更高;原生统一式需海量交错数据 + 大算力、门槛最高。
- 投影式是工程基线:
SimpleVLM用Linear(d_vision→d_llm)投影,把 576 个视觉 token 拼到文本前——实现快、易依赖成熟 LLM,适合快速验证。 - 2026 趋势指向原生统一:原生统一在共享潜空间做 token 级跨模态注意力,交互最深、能涌现视觉推理;但数据与算力门槛极高,小团队仍从投影式起步。
学习路径
- 读 1.1 的成本警示:token 随分辨率平方增长
- 手算 336²/1008² 的 token 数,确认 576→5184(9 倍)
- 完成 1.3 练习 2:算 patch=14 时两种分辨率的 token 数
- 对接 M11:算清不同分辨率下图片 token 折算与成本(M11 交付)
核心知识点详解
- 视觉 token 数是 (W/patch)²:patch=14 时:
336²→(336/14)²=576 token、1008²→(1008/14)²=5184——分辨率翻 3 倍 token 涨 9 倍(平方增长)。 - token 随分辨率平方增长:576 token ≈ 一段约 400 字中文的算力成本;图片/文档一多,账单随分辨率平方级放大。
- 动态切图与池化控成本:只对需要看细节的子图用高分辨率切图(tiling),其余用整图低分辨率;视觉 token 压缩(池化/重采样)可把成本降一个数量级。
- 常见坑:所有图都上高分辨率:对简单缩略图也喂 1008²,token 是 336² 的 9×,纯属浪费。按任务需求选分辨率,而不是默认拉满。
学习路径
- 读 1.2:理解幻觉与细粒度感知是能力分水岭
- 跑 hallucination_rate 代码,用 claimed−present 集合算幻觉率
- 完成 1.3 练习 3/4:写幻觉业务危害与评估流程
- 对接 M11:在 mm/vlm.py 上做细粒度评测并单独统计幻觉率
核心知识点详解
- 攻击分水岭:细粒度感知:小物体、密集 OCR、图表数值、空间关系(左/右/上/下)是能力分水岭——通用 VLM 在此远低于人类直觉,需分维度评测。
- 幻觉率的集合计算:
幻觉率 = |claimed − present| / |claimed|,用「模型提到的元素集合 − 图中真实元素集合」的差占比。文字密集/低分辨率/专业图表时幻觉率显著升高。 - 幻觉比 OCR 错更危险:OCR 错误至少对应真实存在的文字;幻觉是说出图中不存在的内容,在医疗/金融/合规会直接误导决策。
- 常见坑:只看整体准确率:整体相似度会被大量简单题拉高,掩盖幻觉与细粒度弱项。必须分维度(OCR/计数/空间/图表)各算准确率,并单独报幻觉率。
学习路径
核心知识点详解
- 原生统一的门槛:需海量交错图文数据 + 大算力在预训练期让视觉/文本共享同一 Transformer 骨干;小团队通常跑不动,只能依赖大厂开源/API。
- 交互最深 & 能涌现视觉推理:跨模态注意力在底层发生,能涌现比投影式更强的视觉推理(如「看+听+说」统一),这是选原生统一的核心收益。
- 选底座看预算与任务:预算紧、任务偏理解 → 用开源投影式 VLM(LLaVA/Qwen-VL/InternVL)底座;要原生多模态统一及最强视觉推理 → 用 Gemini 3 / Qwen3-VL。
- 常见坑:为趋势硬上原生路线:原生统一需要的数据/算力门槛高,多数业务用拼接 + 现有底座已够;趋势≠无脑跟随,先算清预算 ROI 再选。
1.1 三种架构范式
| 范式 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 投影式(后接) | 视觉编码器 ViT → 投影层 → 冻结/微调 LLM | 实现简单、复用成熟 LLM、训练成本低 | 视觉与语言交互较浅,细粒度推理弱 |
| 交叉注意力式 | 在 LLM 层间插入对视觉特征的交叉注意力 | 融合更深,对高分辨率与细节更友好 | 改造 LLM 结构,训练与推理更复杂 |
| 原生统一式 | 视觉 token 与文本 token 在同一骨干内做统一注意力 | 交互最深,能涌现视觉推理能力 | 数据与算力需求极大,工程门槛高 |
2026 年的趋势明确指向原生统一架构:图像与文本不再是「编码器 + 适配器」的拼接,而是在共享潜空间里直接做 token 级跨模态注意力。这也是「原生多模态」这个词的含义。
python# VLM 的最小前向结构(投影式):理解视觉 token 是怎么“进入”LLM 的
import torch, torch.nn as nn
class SimpleVLM(nn.Module):
def __init__(self, vision, d_vision=1024, d_llm=4096, patch=14, img=336):
super().__init__()
self.vision = vision # ViT / SigLIP,输出 patch 特征
self.projector = nn.Sequential( # 关键适配层:维度对齐
nn.Linear(d_vision, d_llm), nn.GELU(), nn.Linear(d_llm, d_llm))
self.n_visual_tokens = (img // patch) ** 2 # 336/14 = 24 -> 576 个视觉 token
print(f"每张图将占用 {self.n_visual_tokens} 个 token —— 这是成本的关键")
def forward(self, pixel_values, text_embeds):
vis = self.vision(pixel_values) # (B, N_patch, d_vision)
vis = self.projector(vis) # (B, N_patch, d_llm)
# 把视觉 token 拼在文本 token 之前(或按占位符插入)
return torch.cat([vis, text_embeds], dim=1)
# 成本直觉:576 个视觉 token ≈ 一段 400 字中文;高分辨率切图会成倍放大
# 这就是「图片一多,账单就爆」的根本原因,也是视觉 token 压缩成为热点的原因
1.2 多模态评测:幻觉与细粒度感知
- 视觉幻觉:模型描述图像中不存在的物体或文字。这是 VLM 最常见也最危险的失效模式。
- 细粒度感知:小物体、密集文字(OCR)、图表数值、空间关系(左/右/上/下)——这些是能力分水岭。
- 计数与比较:数物体个数、比较大小,看似简单但准确率往往远低于人类直觉。
- 文档理解:表格结构、印章、手写体、跨页引用,是实际业务中最有价值的场景。
- 评测方法:不能只看整体相似度。要构造「有标准答案的细粒度问题」,并单独统计幻觉率(模型说出的不存在元素比例)。
python# 幻觉率评测:把「模型提到的元素」与「图中真实元素」做集合比较
def hallucination_rate(samples):
"""samples: [{"claimed": [...], "present": [...]}, ...]"""
total, halluc = 0, 0
for s in samples:
claimed = set(x.strip().lower() for x in s["claimed"])
present = set(x.strip().lower() for x in s["present"])
total += len(claimed)
halluc += len(claimed - present) # 说了但图里没有
return halluc / max(1, total)
# 典型结论:通用 VLM 在自然图片上幻觉率较低,
# 但在「文字密集 / 低分辨率 / 专业图表」上会显著升高 —— 这决定你能否用在业务里
1.3 动手练习与自测
- 三种 VLM 架构(投影式 / 交叉注意力式 / 原生统一式)在「跨模态交互深度」与「训练成本」上如何排序?
- 一张 336×336 图在 patch=14 时产生多少视觉 token?提到 1008×1008 后是多少?
- 为什么视觉幻觉比 OCR 错误更危险?给出一个业务场景。
- 写一个评估流程,把「细粒度感知(OCR / 计数 / 空间)」与「幻觉率」分开统计。
- 2026 年 VLM 架构的趋势是什么?为什么?
2. 生成模型:扩散与 Flow Matching
学习路径
- 读 2.1:理解前向加噪公式与 MSE 去噪目标
- 跑 DDPM 最小实现(MNIST),观察加噪→去噪损失下降
- 完成 2.3 练习 1:写加噪公式与预测 ε 的原因
- 对接 M11:可为图像小数据集跑通一个扩散生成基线
核心知识点详解
- 前向加噪公式:
x_t = √ᾱ_t·x_0 + √(1−ᾱ_t)·ε,其中ᾱ_t = Π_{s≤t} α_s(累积乘积),噪声ε~N(0,1)。加噪可一步到位而非逐 t 迭代。 - MSE 去噪训练目标:训练网络预测噪声:
loss = MSE(model(q_sample(x0,t,ε), t), ε)。预测 ε 与预测 x0/v 等价(可换算),只是参数化不同。 - 采样 = 从噪声迭代去噪:从纯噪声出发按学到的去噪方向迭代(DDPM 需 1000 步)得到样本;DDIM/流匹配可压到几十步。
- 常见坑:时间步条件没注入:网络必须接收时间步 t(用正弦编码)才能区分各噪声档;遗漏 t 会导致不同噪声水平的去噪混在一起、训练失效。
学习路径
- 读 2.1 的「为什么是 DiT」:可扩展性 + 统一性
- 对照 ddpm 骨架,理解把 U-Net 换成 patch 注意力的点
- 完成 2.3 练习 2:给出 DiT 替代 U-Net 的两个关键理由
- 对接 M11:识别你项目里哪些生成子模块该用 DiT
核心知识点详解
- 理由一:可扩展性吃缩放律:Transformer 直接受益于模型/数据规模,越大约好(FID 单调提升);U-Net 的卷积偏置在大规模下收益有限。
- 理由二:统一异构条件:同一套骨干可接受文本 / 图像参考 / 深度图 / 动作 / 相机轨迹等异构条件,支撑「图像编辑、图生视频、动作生成」统一下游。
- 主流 DiT 模型:Sora、Veo、可灵、Wan、HunyuanVideo、CogVideoX、FLUX 基本都是 DiT 系(为视频/图像生成骨干)。
- 常见坑:以为 DiT 必然更好:DiT 需更大数据/算力才显优势;小数据小任务上简单 U-Net 或更省。选骨干要看预算与数据量。
学习路径
- 读 2.2:理解连续速度场 v=x1−x0 与直线路径
- 跑 flow_matching_loss / sample 代码,对比步数对样本的影响
- 完成 2.3 练习 3/5:写路径与速度目标、解释与扩散的关系
- 对接 M11:用直线路径的目标理解多模态生成加速
核心知识点详解
- 直线路径与常速速度场:路径
x_t=(1−t)x0+t·x1,速度目标v=x1−x0(沿直线为常数)。训练 =MSE(model(x_t,t), x1−x0)。 - 为何 20–50 步即可:路径越直、速度场越接近常数,大步长积分误差越小,所以 20–50 步(甚至更少)就能出高质量样本,对比 DDPM 需上千步。
- 可蒸馏到 1–4 步:先训好速度场,再用蒸馏把大模型「教师」压成少步「学生」,FLUX/SD3 敢把采样压到 4 步甚至 1–2 步(见 12.1 的 1 步均值示例)。
- 常见坑:曲线路径硬用大步数:若用弯曲路径(如 DDPM)却只取 20 步,积分误差大、样本是噪声;Flow Matching 的直线路径才是少步的前提。
学习路径
- 读 2.3 练习 4/5 答案:理解 ε / x0 / v 可换算与统一视角
- 跑参数化对比(或对照 11.1),观察 v-prediction 高噪更稳
- 完成 2.3 练习 4/5:各阶段更稳的目标与数学统一
- 对接 M11:为生成管线选目标参数化并记录理由
核心知识点详解
- 三种预测目标:
ε(DDPM 默认,预测噪声)稳定;x0采样后期更准、易约束;v=αε−σx0高噪声步更稳。三者可相互换算(给定 α_t, σ_t)。 - v-prediction 为何高噪更稳:极噪时预测干净 x0 数值敏感;预测速度 v(沿直线对时间求导)更稳,数值上避开极噪区的不稳定。
- 数学统一视角:ε-pred、x0-pred、v-pred 都是「学一个把噪声推向数据的变换」的不同参数化;
v与 Flow Matching / Rectified Flow 速度场同构。 - 常见坑:固定一种预测目标死磕:不同阶段最优目标不同(高噪重 v、后期重 x0)。只用一个目标会在某些噪声档表现差,可混合/切换参数化。
2.1 扩散模型的直觉与最小实现
扩散模型的想法是:定义一条从数据到噪声的加噪路径,然后训练一个网络学会反向去噪。生成时从纯噪声出发,迭代去噪若干步得到样本。它稳定、可控、覆盖模式全,是 2024 年之后图像与视频生成的主流。
python# DDPM 的核心:加噪公式与训练目标(极度精简版)
import torch, torch.nn as nn
class TinyUNet(nn.Module):
def __init__(self, d=64):
super().__init__()
self.net = nn.Sequential(nn.Conv2d(1, d, 3, padding=1), nn.SiLU(),
nn.Conv2d(d, d, 3, padding=1), nn.SiLU(),
nn.Conv2d(d, 1, 3, padding=1))
self.temb = nn.Linear(1, d) # 时间步条件(实际用正弦编码)
def forward(self, x, t):
h = self.net[0](x) + self.temb(t).view(-1, -1, 1, 1)
return self.net[2:](torch.cat([h], dim=1)) if False else self.net(x)
T = 1000
betas = torch.linspace(1e-4, 0.02, T)
alphas = 1.0 - betas
alpha_bar = torch.cumprod(alphas, dim=0) # ᾱ_t
def q_sample(x0, t, noise):
"""前向加噪:x_t = √ᾱ_t · x_0 + √(1-ᾱ_t) · ε —— 一步到位"""
a = alpha_bar[t].view(-1, 1, 1, 1)
return a.sqrt() * x0 + (1 - a).sqrt() * noise
# 训练目标:预测噪声 ε(等价于预测 x0 或速度 v,只是参数化不同)
model = TinyUNet()
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
for x0 in loader:
t = torch.randint(0, T, (x0.size(0),))
noise = torch.randn_like(x0)
loss = nn.functional.mse_loss(model(q_sample(x0, t, noise), t), noise)
opt.zero_grad(); loss.backward(); opt.step()
2.2 Flow Matching 与统一架构
Flow Matching(流匹配)可以理解为扩散的简化版:不定义离散的加噪步,而是直接学习一个从噪声分布到数据分布的连续速度场,训练目标变成回归「把噪声点推向数据点的速度」。它训练更稳、采样步数更少、实现更干净,因此在 2025–2026 年被大量图像/视频模型采用(如视频扩散中的 Flow Matching、机器人 VLA 中的动作头)。
python# Flow Matching 的目标:给定噪声 x0 与数据 x1,学一个线性路径的速度
import torch
def flow_matching_loss(model, x1):
"""x1: 真实数据;x0: 噪声;t~U(0,1)"""
x0 = torch.randn_like(x1)
t = torch.rand(x1.size(0), *([1] * (x1.dim() - 1)))
xt = (1 - t) * x0 + t * x1 # 线性插值路径
v_target = x1 - x0 # 该路径上的真实速度(常数)
return torch.nn.functional.mse_loss(model(xt, t), v_target)
# 采样:从噪声出发,沿学到的速度场用少量步数积分(欧拉法)
@torch.no_grad()
def sample(model, shape, steps=20):
x = torch.randn(shape)
for i in range(steps):
t = torch.full((shape[0],), i / steps)
x = x + model(x, t) * (1.0 / steps) # 20 步左右即可出图
return x
- 为什么少步也行:路径接近直线时速度场近似常数,大步长积分误差小,所以 20–50 步就能出高质量结果,甚至可蒸馏到 1–4 步。
- 统一条件的优点:文本、图像参考、深度图、动作序列都可以作为条件注入同一骨干,这直接支撑了「图像编辑 / 图生视频 / 动作生成」的统一下游。
- 与 VLM 的合流:生成式世界模型与多模态理解模型正在共享骨干(如 mixture-of-transformers:一部分负责推理「应该发生什么」,一部分负责生成「看起来是什么样」)。
2.3 动手练习与自测
- 写出扩散的前向加噪公式 x_t = √ᾱ_t·x_0 + √(1−ᾱ_t)·ε,并说明训练目标为什么可以是预测 ε。
- 为什么 DiT 替代 U-Net 能带来缩放收益?给出两个关键理由。
- 写出 Flow Matching 的直线路径与速度目标,并解释为什么它采样步数更少。
- ε / x0 / v 三种预测目标各在什么阶段更稳?
- 扩散与 Flow Matching 在数学上是什么关系?
3. 视频生成:一致性是最大的难题
学习路径
核心知识点详解
- 五类失效:时序一致性(换脸/闪)、物理合理性(穿模)、长视频漂移、音画不同步、身份保持。
3 段 10 秒镜头标注即可暴露大部分。 - 失效→技术映射:时序一致性→3D VAE/时空注意力/长上下文;物理→物理先验/世界模型预测;漂移→分层生成/潜空间时序映射/相机控制。
- 一致性随时长约指数衰减:短视频看不出差距,拉到 60–90 秒误差逐帧累积演变成结构性崩坏——时长/连续镜头数是关键评测维度。
- 常见坑:只看单帧画质:单帧好看≠视频连贯。评测必须看连续镜头一致性(对象持久性),否则会把「偶然好看」误当可用。
学习路径
核心知识点详解
- 技术手段分全局/局部:全局记忆(身份保持/对象持久性)用参考锚定、3D VAE、长上下文记忆;局部手段(当前镜头)用时空注意力、插帧、相机控制。
- 对象持久性靠长上下文记忆:长镜头里角色不消失/不变形,依赖长期记忆 + 一致性约束(参考锚定/种子锚定),这是「看起来合理」与「真的连贯」的分界线。
- 相机控制防漂移:镜头运动时环境要稳定,靠相机控制 + 潜空间时序映射 + 关键帧插帧,避免「镜头一移环境就变形」。
- 常见坑:只加局部一致性不加长记忆:只在帧内做一致性无法保证跨镜头;长视频靠持续的对象锚定,否则角色到 60 秒后一定崩。
学习路径
核心知识点详解
- 60–90s 一致性差距:不同架构在 60–90 秒连续镜头上的对象持久性一致性差距可以很大,这直接决定能否进生产(广告/影视/仿真)。
- 误差逐帧累积呈指数衰减:物理误差与对象漂移随帧数累积,一致性随时长近似指数衰减——短视频「碰巧好看」掩盖不了结构性崩坏。
- 评测用时长 + 连续镜头数:评测视频模型时,时长与连续镜头数比单帧画质更能区分高下(见 9.2 token 预算也按此算)。
- 常见坑:拿 10 秒样片当生产依据:短视频片段质量高不代表长视频可用。上线前至少要测 60 秒 + 多次连续镜头,看对象持久性与物理一致性。
学习路径
核心知识点详解
- 可交互 = 世界模型的分界:能对动作条件化输出未来帧/状态(而非只播放预先决定的帧)才是世界模型;纯视频生成只是「回想」,不可交互。
- 动作条件化 vs 被动生成:世界模型接受动作/指令作为输入并预测下一状态;视频生成只从潜变量采样。前者有「响应」,后者只是「播放」。
- 用交互性实测判断模型:实测模型的「响应动作/指令」能力:能否在中间注入控制并改变后续帧?能→已具世界模型雏形。
- 常见坑:把好看的展示视频当世界模型:视频生成好≠世界模型。用「可被动作条件化、可交互」来判,而不是看演示视频效果。
3.1 三类失效与对应技术
| 失效类型 | 表现 | 技术手段 |
|---|---|---|
| 时序一致性 | 人物换脸换衣、物体闪烁 | 3D VAE 压缩、时空注意力、长上下文记忆、参考锚定 |
| 物理合理性 | 物体穿模、违反重力与碰撞 | 物理先验、世界模型预测、动作条件化、数据质量 |
| 长视频漂移 | 镜头一移动环境就变形 | 分层生成(关键帧 + 插帧)、潜空间时序映射、相机控制 |
| 音画不同步 | 音效延迟或错位 | 原生 Omni 架构同时生成画面与音频(而非后期拼接) |
| 身份保持 | 多镜头里角色不一致 | 参考图 / 身份编码、种子锚定、一致性约束 |
| 能力 | 短视频(≤10s) | 长视频(60s+) | 关键差异来源 |
|---|---|---|---|
| 画面质量 | 各家接近 | 拉开差距 | 长时间一致性约束 |
| 对象持久性 | 基本满足 | 差别明显 | 长期记忆 / 参考锚定 |
| 物理合理 | 偶有穿模 | 误差累积放大 | 世界模型 / 物理先验 |
| 可交互 | 少数支持 | 尚在探索 | 动作条件化能力 |
| 音画同步 | 后期拼接 | 原生同生成 | Omni 架构 |
经验上,视频一致性随时长近似指数衰减:短视频看不出差别,一旦拉到 60 秒,误差会逐帧累积,把「偶然好看」暴露成「结构性崩坏」。所以评测视频模型时,时长与连续镜头数比单帧画质更能区分高下。
3.2 动手练习与自测
- 视频生成的三类核心失效是什么?各对应什么技术手段?
- 为什么「能生成好看短视频」不足以判断视频模型能否进生产?
- 长视频的对象持久性(object permanence)为什么是分水岭?
- 「可被动作条件化」为什么被视为世界模型与视频生成的分界?
- 身份保持(角色一致)可用哪些手段提升?
4. 语音与全模态(Omni)
学习路径
- 读 4.1 与表格:对比级联/语音LLM/Omni 三条路线
- 用浏览器 ASR + LLM API + 系统 TTS 搭个最小语音回路
- 完成 4.2 练习 1:按延迟与副语言权重给场景选路线
- 对接 M11:为语音问答估算端到端延迟预算
核心知识点详解
- 三条技术路线:级联式(ASR→LLM→TTS,成熟可控)、端到端语音对话(直接语音进出,保留副语言)、Omni 统一模型(文本/图像/音频/视频同模型处理生成)。
- 延迟 vs 副语言的取舍:级联延迟三端相加(≥1s)且语气/情绪在中间丢失;端到端延迟低、保留副语言但训练/工程难。延迟与副语言权重越高越靠后端到端。
- 按场景选路线:要成熟易调试→级联;要保留情绪的助手→语音 LLM;要低延迟自然对话→端到端 Omni。
- 常见坑:无视端到端延迟预算:语音交互门槛是轮次延迟 < 1s。选路线前先拆各环节时延(ASR/LLM/TTS),否则产品听到「延迟叠加」才改架构。
学习路径
- 读 4.1:理解 ASR/TTS 组件与开源生态
- 跑 whisper-tiny ONNX 量化(或读示例)做本地识别
- 完成 4.2 练习 2/4:拆时延预算、写声音克隆合规红线
- 对接 M11:在语音回路里评估 WER 与延迟
核心知识点详解
- Whisper 系是 ASR 主力:Whisper(编码器-解码器)仍是开源主力;浏览器端可用
whisper-tiny/base的 ONNX 量化版做本地离线识别(CPU 也能跑)。 - TTS 从拼接到神经声码器:TTS 从拼接式进化到神经声码器、再到零样本声音克隆;声纹授权与合成水印是合规硬约束(见 4.1)。
- 选型看延迟与精度:实时本地识别偏好 tiny/base 量化版(低延迟);精度优先用
large-v3。用 WER 评估 ASR;长音频要分段 + 重叠窗口防截断/重复。 - 常见坑:整段一次性识别大音频:长音频直接整段喂 Whisper 会因上下文过大而截断/幻觉。要分段 + 重叠窗口(如 30s/overlap 5s),再去重处理边界。
学习路径
- 读 4.1:掌握 <1s 门槛与流式链路
- 实测你的回路各环节延迟,拼流水线并行
- 完成 4.2 练习 2/3:拆延迟预算、写 ASR/TTS 评测指标
- 对接 M11:用 WER/MOS 评估语音回路并优化延迟
核心知识点详解
- 端到端 <1s 门槛:语音交互体验门槛是轮次延迟 < 1000ms,由「流式 ASR 首字 200–600ms + LLM 500–3000ms + 流式 TTS 首包 150–400ms」流水线并行 + 早启动拼出来。
- 三个阶段指标不同:ASR 看 WER(词错率);TTS 看 MOS(自然度)与说话人相似度;语音对话看打断(barge-in)成功率与轮次延迟。
- 压延迟靠流水线并行:不要三端串行等完整结果;用流式 ASR(VAD 断句)+ 流式生成 + 流式 TTS,边收边处理边播放。
- 常见坑:只测 50 分位延迟:语音对话体验看 P99,长尾波动的轮次最伤人。要测并压 P99 <1s,而不是只报告均值。
学习路径
核心知识点详解
- 合规红线:声音克隆必须做声纹授权 + 合成音频水印 + 可检测性,防止深度伪造滥用;这是监管关注点、工程之外的硬约束。
- 声纹授权:克隆前需本人显式授权(声纹授权);未授权使用他人声纹是合规红线。
- 落地措施:给 TTS 加合成音标记/水印、做音频来源可检测;高风险场景设滥用拦截与追踪。
- 常见坑:把合规当纯技术问题:忽视授权与水印会在上线后触雷(深度伪造监管)。工程实现之外要先设计授权流与追踪机制。
4.1 三条技术路线
- ASR:Whisper 系仍是开源主力;浏览器端可用小模型(如 whisper-tiny/base 的 ONNX 量化版)做本地识别。
- TTS:从拼接式到神经声码器,再到零样本声音克隆。合规上必须做声纹授权与防滥用(这是监管关注点)。
- 实时性:语音交互的体验门槛是端到端延迟 < 1s,这要求流式 ASR + 流式生成 + 流式 TTS 全链路配合。
- 评测:ASR 看 WER;TTS 看自然度(MOS)与相似度;对话看轮次打断(barge-in)与响应延迟。
| 路线 | 延迟构成 | 副语言信息 | 典型实现 |
|---|---|---|---|
| 级联式 | ASR + LLM + TTS 三段相加(≥1s) | 易在中间丢失 | Whisper + LLM + 神经 TTS |
| 语音 LLM | 音频 token + LLM + 声码器 | 保留(语气 / 情绪) | 音频 tokenizer + LLM |
| 端到端 Omni | 单次前向 + 流式声码 | 原生保留 | GPT-4o 语音 / Gemini 原生语音 |
4.2 动手练习与自测
- 三条语音技术路线各适合什么场景?给出选择判据。
- 实时语音交互的体验门槛时延是多少?如何拆解各环节预算?
- ASR / TTS / 语音对话分别用什么指标评测?
- 声音克隆有哪些合规红线?工程上如何落实?
- 端到端语音模型为什么能实现「打断(barge-in)」?
5. 多模态数据与部署
学习路径
- 读 5.1 表格:理解六类多模态数据的关键质量点
- 拿一个图文对/图表数据跑一遍,标出哪些需要过滤
- 完成 5.3 练习 3:说明交错图文为何是原生多模态核心数据
- 对接 M11:为 PDF 建结构化表示(段落 + 图表)准备数据形态
核心知识点详解
- 六类数据形态:图文对(噪声大需过滤)、交错图文(原生核心)、视频描述(时间对齐)、文档/图表(结构还原更有价值)、指令数据(覆盖弱项)、合成数据(控多样性)。
- 交错图文是原生多模态核心:网页天然是图文交错长序列,能教模型「图文顺序对应、跨模态指代」——原生多模态预训练最关键的数据。
- 文档/图表强调结构:对 PDF/报表/扫描件,段落 + 表格结构还原比纯文本更有价值(这正是 M11 PDF 结构化表示的目标)。
- 常见坑:图文对不看相关性:网页图文对中描述与图常有错配;不过滤直接训练会让模型学到大量噪声(见 5.1 质量过滤)。
学习路径
- 读 5.1 的 filter 代码:理解 CLIP 相似度 + 文本启发式过滤
- 跑 filter_image_text,调 min_score 看保留比例变化
- 完成 5.3 练习 1/2:说明低质占比与组合过滤手段
- 对接 M11:对图文数据做相关性过滤后再入库
核心知识点详解
- 组合过滤手段:
CLIP/SigLIP相似度打分 + 文本启发式(短文本、"image"/"untitled" 占位文本剔除)+ 长度下限。这是性价比最高的组合。 - 低质占比与伤害:真实网页图文对里常有 40%+ 低质量样本;不过滤直接训练会让模型学到大量噪声与图文错配,伤害下游。
- min_score 的选择:
filter_image_text(pairs, clip, proc, min_score=0.25, min_len=8)用clip.logits_per_image打分 ≥ min_score 才保留;阈值调高→更干净但丢样本,需权衡。 - 常见坑:阈值一刀切丢稀有样本:min_score 设太高会把难但高价值的配对丢掉。可先看保留比例曲线再定,避免「为了干净」损失长尾语义。
学习路径
- 读 5.2 表格:理解各类部署优化手段与收益
- 跑成本核算脚本,对某分辨率/步数配置算显存与延迟
- 完成 5.3 练习 4:写出视觉 token 优化的几个方向与量级
- 对接 M11:算清图片 token 折算 + 显存峰值(M11 交付)
核心知识点详解
- 降视觉 token:分辨率自适应、动态切图、池化压缩,可把成本降数倍(视觉 token 数决定大部分多模态成本)。
- 生成加速:少步采样、蒸馏到 1–4 步、量化(FP8/INT8),把生成延迟降数倍;视频还需 3D VAE 时空压缩(显存主杠杆)。
- 调度与缓存:动态批处理 / 优先级队列 / GPU 共享提升吞吐;图像哈希 / 语义缓存避免重复计算;级联降级(小模型草稿→满意再精修)兼顾体验与成本。
- 常见坑:不算 token 与显存峰值就定架构:选 VLM/扩散架构前必须核算图片 token 折算 + 显存峰值(视频 49 帧可上 20GB),否则上线即 OOM 或爆账单。
学习路径
核心知识点详解
- 风格坍缩风险:合成数据模型会陷入统一风格与构图(风格坍缩),多样性不足会损害微调的泛化——需在生成条件上做多样性控制。
- 标注自动校验:合成样本的标注(如 OCR/计数)可能本身错误,必须用自动校验(规则/另一模型交叉核对)过滤错标,否则把错误当标注。
- 缓解组合:控制生成条件多样性 + 自动校验标注 + 与真实数据混合配比(合成占一定比例而非全替代)。
- 常见坑:合成数据全量替代真实数据:合成数据分布与真实有偏,若全替代会导致模型在真实分布上崩。要有配比上限并持续监控真实样本表现。
5.1 数据形态与质量
| 数据类型 | 来源 | 关键质量点 |
|---|---|---|
| 图文对 | 网页 alt 文本、图库、商品数据 | 文本描述与图片是否真正相关(噪声极大,需过滤) |
| 交错图文 | 网页、教程、说明书 | 图文顺序对应关系,是原生多模态预训练的核心数据 |
| 视频描述 | 字幕、解说、样例标注 | 时间对齐;长视频需要分段描述 |
| 文档 / 图表 | PDF、报表、扫描件 | 结构还原(表格、版面)比纯文本更有价值 |
| 指令数据 | 人工标注的问答对 | 覆盖细粒度感知、OCR、空间关系、计数等弱项 |
| 合成数据 | 用生成模型造图文 / 视频 | 多样性控制,避免风格坍缩;标注需自动校验 |
python# 图文对质量过滤:CLIP 相似度 + 文本启发式,是性价比最高的清洗组合
import torch
@torch.no_grad()
def filter_image_text(pairs, clip_model, clip_proc, min_score=0.25, min_len=8):
kept = []
for img, text in pairs:
if len(text.strip()) < min_len: # 文本太短("image1.jpg")直接丢
continue
if text.strip().lower() in {"图片", "照片", "image", "photo", "untitled"}:
continue
inputs = clip_proc(text=text, images=img, return_tensors="pt", padding=True)
score = clip_model(**inputs).logits_per_image.item()
if score >= min_score: # 图文相关性达标
kept.append((img, text))
return kept
# 经验:真实网页图文对里常有 40%+ 的低质量样本,不过滤直接训练会显著伤害模型
5.2 部署与成本核算
| 优化方向 | 手段 | 收益 |
|---|---|---|
| 降低视觉 token | 分辨率自适应、动态切图、池化压缩 | 成本可降数倍 |
| 生成加速 | 少步采样、蒸馏到 1–4 步、量化(FP8 / INT8) | 延迟降数倍 |
| 视频编码压缩 | 3D VAE 时空压缩、关键帧 + 插帧、分块生成 | 显存与算力的主要杠杆 |
| 批处理与调度 | 动态批处理、优先级队列、GPU 共享 | 吞吐提升,成本下降 |
| 缓存 | 图像哈希 / 语义缓存,避免重复计算 | 常见场景命中率高 |
| 级联降级 | 先小模型快速出草稿,用户满意再精修 | 体验与成本兼顾 |
5.3 动手练习与自测
- 真实网页图文对里低质量样本占比大概多少?不做过滤直接训练会怎样?
- 写出图文质量过滤的组合手段(至少两种信号)。
- 交错图文(interleaved)数据为什么是原生多模态预训练的核心?
- 视觉 token 成本可从哪几个方向优化?各降多少量级?
- 合成数据用于多模态训练有什么风险?如何缓解?
6. 对比学习与 CLIP:对齐图文空间
学习路径
- 读 6.1:理解 InfoNCE 分子/分母与温度 τ
- 跑 InfoNCE 伪代码或双塔示例,观察对称损失
- 完成 6.3 练习 1:写分子分母并解释 τ 的作用
- 对接 M11:用 CLIP 图文对齐做以文搜图/以图搜图
核心知识点详解
- InfoNCE 分子分母:分子
exp(sim(I_i,T_i)/τ)(正样本相似度温度缩放);分母Σ_j exp(sim(I_i,T_j)/τ)(含 1 正 + N−1 负,即 batch 内其他图)。损失−log(分子/分母)。 - 对称损失:图像→文本 与 文本→图像 两方向各算一次取平均,保证图文双向对齐。
- 温度 τ 控制锐度:τ 典型
0.01~0.1;越小 logits 越极端、对比任务越难、学到越 sharp 的表征。sim用余弦相似度。 - 常见坑:τ 设过大或过小:τ 太大任务太简单、表征学不好;太小易过拟合负样本噪声。先把 logits 稳定后扫 τ 观察分布锐度再定。
学习路径
- 读 6.1:理解为何需大批次、如何用多卡累积
- 跑小批量伪代码,理解负样本随 batch 增加
- 完成 6.3 练习 2:说明为何依赖极大 batch、如何白嫖负样本
- 对接 M11:设计图文检索的 embedding 入库与批量构建
核心知识点详解
- 负样本来自 batch 内:InfoNCE 的分母用 batch 内的其他图/文做负样本,免维护负样本库——这是 CLIP 能大规模训练的关键。
- 为什么依赖极大 batch:batch 越大分母负样本越多、对比任务越难、表征越好。CLIP 用
32k–64k多卡梯度累积,训练约 30 亿样本(~590k step @ 32k)。 - 规模与数据的关系:训练图文对从 400M(CLIP)增到数 B,零样本越强;数据量是零样本泛化的决定因素。
- 常见坑:batch 小却期望好表征:个人卡 batch 只有几百时,负样本太少对比难不够。要么用内存队列补负样本,要么选 SigLIP(对 batch 不敏感)。
学习路径
- 读 6.2:理解类别 prompt → 文本编码 → 相似度 → argmax 流程
- 跑 clip_zero_shot 代码,换 prompt 模板观察结果变化
- 完成 6.3 练习 4/5:写零样本分类流程、说明 prompt 集成
- 对接 M11:用零样本分类做图文匹配打分
核心知识点详解
- 零样本分类流程:类别名写 prompt("a photo of a {class}")→ 文本编码归一化 → 与图像特征算余弦 × 温度 →
argmax取最相似类。全程不需要下游训练数据。 - 文本编码归一化:
txt_feat = F.normalize(text_enc(texts)),与img_feat归一化后logits = img @ txt.T * 100(温度放大)。 - prompt 集成提鲁棒:用多模板("a photo of a {c}"、"{c} 的图片"…)各算一次再平均,减少单一措辞偏差,提升零样本分类稳定性。
- 常见坑:类别名直出不改写:类别词短(如"apple")直接当文本喂效果差;写成完整 prompt 模板能显著提升,这是零样本分类第一步优化。
学习路径
- 读 6.2:对比 CLIP softmax 与 SigLIP sigmoid 的损失差异
- 跑 SigLIP 逐对打分示例,看对小 batch 的稳定性
- 完成 6.3 练习 3:写 SigLIP 改进与为何对 batch 不敏感
- 对接 M11:pick SigLIP 作视觉塔的考量
核心知识点详解
- CLIP softmax vs SigLIP sigmoid:CLIP 用 batch 内归一化交叉熵(分母随 batch 构成变化);SigLIP 对每对 (image,text) 独立做二分类(匹配/不匹配),正负解耦。
- 对 batch size 不敏感:因为不做 batch 内归一化,SigLIP 小 batch 也能训好、稳定——而不像 CLIP 小 batch 易训偏。
- 长尾/难负更鲁棒:SigLIP 的独立打分可对难负样本重点加权,不易被 batch 平均掉;SigLIP-2 因此成 2026 多数 VLM 视觉塔首选。
- 常见坑:在小 batch 硬套 CLIP:只给 CLIP 几百的 batch 训练,负样本量小导致表征差;此时应换 SigLIP(无 batch 依赖)而非硬加 batch。
6.1 InfoNCE:把「匹配」变成分类
CLIP 用对比学习把图像与文本编码到同一向量空间:正样本对(同一图的 caption)靠近,负样本对远离。其核心损失是 InfoNCE:把「从一堆里挑出正确配对」建模为 N 分类。
text# InfoNCE(NT-Xent 变体)
# 一个 batch 有 N 个图文对;对第 i 对:
# 分子: exp( sim(I_i, T_i) / τ ) # 正样本相似度(温度缩放)
# 分母: Σ_j exp( sim(I_i, T_j) / τ ) # 含 1 个正 + (N-1) 个负(其他图)
# L_i = -log( 分子 / 分母 )
# 对称:图像->文本 与 文本->图像 两方向各算一次取平均
# sim = 余弦相似度;τ(温度) 典型 0.01~0.1,控制分布锐度
| 组件 | 作用 | 常见取值 |
|---|---|---|
| 温度 τ | 缩放 logits、控制难度 | 0.01–0.1 |
| batch 内负样本 | 替代海量负样本库 | batch 越大越好(常 8k–32k, 多卡累积) |
| 对称损失 | 图文双向对齐 | 两方向平均 |
| 双塔编码器 | 图/文各自塔,最后投影同维 | ViT-B/32 + Transformer |
| 规模要素 | CLIP 量级(示意) | 影响 |
|---|---|---|
| 训练图文对 | 400M(CLIP)→ 数 B(后续) | 数据越多零样本越强 |
| batch size | 32k–64k(多卡累积) | 负样本多、对比难 |
| 训练步数 | ~30 亿样本(~590k step @ 32k) | 需大算力/长时间 |
| 视觉塔 | ViT-B/32 → ViT-L/14 | 分辨率与参数影响细粒度 |
6.2 CLIP 零样本分类怎么算
CLIP 最强的能力是零样本分类:把类别名写成 prompt("a photo of a {class}"),编码所有类别文本,再与图像编码算余弦相似度,取最高者。整个过程不需要任何下游训练数据。
python# CLIP 零样本分类(伪代码)
import torch.nn.functional as F
def clip_zero_shot(image, classes, image_enc, text_enc, prompts="{c}"):
img_feat = F.normalize(image_enc(image), dim=-1) # (1, D)
texts = [prompts.format(c=c) for c in classes]
txt_feat = F.normalize(text_enc(texts), dim=-1) # (C, D)
logits = img_feat @ txt_feat.T * 100.0 # 相似度(温度放大)
return classes[logits.argmax()] # 取最相似类
# 进阶:prompt 集成("a photo of a {c}", "a drawing of a {c}"...) 提升鲁棒性
SigLIP 的改进:把 CLIP 的 softmax(归一化)换成sigmoid 损失,对每个 (image, text) 对独立做二分类(是否匹配),不再依赖 batch 内归一化。好处是不依赖超大 batch,小 batch 也能训好,且对长尾/难负样本更鲁棒——这正是 2025–2026 年许多 VLM 视觉编码器的首选(SigLIP-2 等)。
| 维度 | CLIP(softmax) | SigLIP(sigmoid) |
|---|---|---|
| 损失 | batch 内归一化交叉熵 | 逐对二分类(匹配/不匹配) |
| 负样本来源 | 仅 batch 内 | batch 内 + 构造/难负 |
| 对 batch 大小敏感度 | 高(分母变) | 低(独立打分) |
| 小 batch 表现 | 易训偏 | 稳定 |
| 长尾/难负样本 | 易被平均掉 | 可被重点加权 |
| 2026 采用度 | 基线仍常用 | 新视觉塔主流(SigLIP-2) |
6.3 动手练习与自测
- 写出 InfoNCE 的分子与分母,并解释温度 τ 的作用与典型取值。
- CLIP 为什么依赖极大 batch?不维护负样本库是怎么做到的?
- SigLIP 相对 CLIP 的 sigmoid 损失改进在哪里?为什么它对 batch size 不敏感?
- 写出 CLIP 零样本分类流程(类别 prompt → 文本编码 → 相似度 → argmax)。
- prompt 集成(多模板平均)为什么能提升零样本鲁棒性?
7. ViT:把图像当 token 序列
学习路径
- 读 7.1:理解 patch/CLS/位置编码与弱归纳偏置
- 跑 PatchEmbed 极简版,算 224/14=256 token
- 完成 7.3 练习 1/5:写组件作用、算 token 数
- 对接 M11:在视觉编码里用 ViT 输出 patch 序列
核心知识点详解
- patch embedding 把图变 token:把图切 P×P patch,每 patch 拉平过线性投影成一个 token。224×224、patch=14 →
(224/14)²=256个 token。 - [CLS] 聚合全局:额外一个可学 [CLS] token 与 patch token 一起过 Transformer,用其输出做分类(CNN 则用全局池化)。
- 位置编码补回 2D 结构:patch 打散后需加可学位置编码补回空间信息;CNN 靠卷积平移不变性隐含位置——这就是「弱归纳偏置」的由来。
- 常见坑:低估数据依赖:弱归纳偏置使 ViT 在小数据(ImageNet-1k)打不过 ResNet,需 JFT-300M 级数据才反超——小数据任务先想清楚数据量够不够。
学习路径
- 读 7.1 表格:理解 ViT 大数据反超现象
- 对照表内分数,理解数据规模对 ViT 的影响
- 完成 7.3 练习 2:解释为何小数据打不过、大数据反超
- 对接 M11:评估你的任务数据量是否够 ViT 类编码器
核心知识点详解
- 大数据反超 CNN:ViT-B/16 用 JFT-300M 达 84.2%(反超 ResNet-50);DeiT 用 ImageNet-1k(1.2M)+ 蒸馏也能到 79.8%,说明数据量决定了谁赢。
- 弱归纳偏置需要更多数据:ViT 缺少局部性/权重共享偏置,小数据学不好中间层;数据补足偏置缺失后规模优势才显现并反超强偏置 CNN。
- 判断数据是否够:目标任务数据量 < 百万级时优先考虑 CNN 或 DeiT 蒸馏;数据海量(千万级)则 ViT/VLM 系编码器收益更大。
- 常见坑:小数据硬上 ViT-B/L:只有几万张图却用大 ViT,没数据支撑只会欠拟合。先评估数据量,必要时预训练权重 + 蒸馏。
学习路径
- 读 7.2:理解 Swin 窗口注意力与复杂度下降
- 跑全局 vs 窗口注意力的复杂度对比(或做表)
- 完成 7.3 练习 3:解释 O(N²)→O(N) 的原理
- 对接 M11:在高分辨率场景考虑窗口注意力省算力
核心知识点详解
- 窗口注意力的复杂度:标准 ViT 全局注意力 O(N²)(N=patch 数);Swin 只在局部窗口内自注意力 → 复杂度近 O(N),高分辨率下省约 80×。
- 移位窗口实现跨窗通信:纯窗口注意力信息只在窗内流动;Swin 用移位窗口(下一层窗口错位)+ 掩码,让不同窗的 token 互相通信,保留全局依赖。
- 层次化特征:Swin 逐层合并 patch 得到多尺度/层次化特征,适合检测、分割等任务。
- 常见坑:窗口太小丢长程依赖:窗口过小、又没有移位/跨窗机制时,远处的空间关系无法建模——高分辨率里要平衡窗口大小与通信。
学习路径
- 读 7.2 尾段:理解 2B–6B 超大视觉塔趋势
- 跑一个视觉塔 embedding 示例,看 token 数与 projector
- 完成 7.3 练习 4:写视觉塔越大的成本代价
- 对接 M11:在 vlm.py 里选视觉塔并记录 token 成本
核心知识点详解
- 主流视觉塔:SigLIP / SigLIP-2、InternViT 等超大 ViT(2B–6B 参数)作 VLM 编码器,再接轻量 projector 到 LLM。
- 视觉塔越大,token 越贵:视觉塔越大细粒度/OCR 越强,但视觉 token 数成为成本核心(随分辨率平方涨)——大塔的收益要用 token 成本去权衡。
- 选塔看任务:文档/细粒度优先大塔(SigLIP-2/InternViT);简单识别用中小塔省 token。
- 常见坑:无脑上超大视觉塔:2B–6B 塔带来的精度提升可能撑不起 token 与显存翻倍的代价。先测 target 数据集的细粒度基准再决定塔大小。
7.1 patch embedding、class token 与位置编码
ViT 的核心思想:把图像切成 P×P 的 patch,每个 patch 拉平后过线性层变成一个 token,再像文本一样喂进 Transformer。于是「图像理解」被统一成「token 序列理解」。
| 组件 | 做法 | 与 CNN 的区别 |
|---|---|---|
| patch embedding | 14×14 切图,每 patch 线性投影 | CNN 用滑动卷积,局部感受野逐步扩大 |
| class token ([CLS]) | 额外一个可学 token,聚合全局 | CNN 靠全局池化 |
| position embedding | 给每个 patch 加可学位置向量 | CNN 靠卷积的平移不变性隐含位置 |
| 归纳偏置 | 弱(几乎无局部性假设) | 强(局部性、权重共享) |
python# ViT 前向的极简版(patch -> token -> Transformer)
import torch, torch.nn as nn
class PatchEmbed(nn.Module):
def __init__(self, img=224, patch=14, d=768):
super().__init__()
self.n = (img // patch) ** 2 # 224/14 = 16 -> 256 个 token
self.proj = nn.Conv2d(3, d, patch, stride=patch) # 卷积即「无重叠切图+投影」
def forward(self, x):
return self.proj(x).flatten(2).transpose(1, 2) # (B, n_tokens, d)
# 拼接 [CLS] + 256 个 patch token,加位置编码,过 Transformer
# 输出取 [CLS] 做分类,或取全部 token 给 VLM 用
| 模型/设置 | 训练数据 | Top-1(示意) | 说明 |
|---|---|---|---|
| ViT-B/16 | JFT-300M | 84.2% | 大数据下反超 ResNet |
| ViT-L/16 | JFT-300M | 87.1% | 规模越大收益越明显 |
| DeiT-S | ImageNet-1k(1.2M) | 79.8% | 小数据+蒸馏可训 |
| ResNet-50 | ImageNet-1k | 76.1% | 强归纳偏置但天花板低 |
7.2 变体与高效化:Swin 的窗口注意力
标准 ViT 是全局注意力,复杂度 O(N²)(N=patch 数),高分辨率下爆炸。Swin Transformer 引入窗口注意力(只在局部窗口内做自注意力,再跨窗口移位通信),把复杂度降到近线性,且天然支持层次化特征(适合检测/分割)。
| 变体 | 注意力范围 | 复杂度 | 特点 |
|---|---|---|---|
| ViT (global) | 全图 | O(N²) | 表征强、吃数据 |
| Swin | 局部窗口 + 移位 | O(N) | 层次化、省算力 |
| DeiT | ViT + 蒸馏 token | O(N²) | 小数据也能训 |
| MViT / ViT-H | 多尺度 | O(N²)~ | 视频/多分辨率 |
2026 年的 VLM 视觉塔趋势:SigLIP-2 / InternViT 等超大 ViT(2B–6B 参数)作编码器,再接轻量 projector 到 LLM。视觉塔越大,细粒度感知与 OCR 越强,但视觉 token 数随之成为成本核心(见 1.1)。
7.3 动手练习与自测
- ViT 的 patch embedding、[CLS] token、位置编码各起什么作用?
- 为什么 ViT 在 ImageNet-1k 上打不过 ResNet,却在 JFT-300M 上反超?
- Swin 的窗口注意力把复杂度从 O(N²) 降到近似多少?为什么可行?
- 2026 年 VLM 视觉塔的主流选择是什么?视觉塔越大带来什么代价?
- 224×224、patch=14 时序列有多少 token?
8. VLM 架构深入:连接器、分辨率与训练阶段
学习路径
- 读 8.1 表格:对比四种连接器的保真与省 token
- 跑 project 前向,感受 视觉特征 → LLM 的维度对齐
- 完成 8.5 练习 1:按需求选连接器类型
- 对接 M11:在 vlm.py 里选连接器并记录取舍
核心知识点详解
- 四种连接器:线性投影(最简最快、信息压缩强)、MLP(2 层稍强仍轻量)、Q-Former(query 对视觉做 bottleneck 抽取)、Perceiver Resampler(cross-attn 重采样到固定 token 数)。
- 保真 vs 省 token:追求保真/细粒度(文档、图表、OCR)→ MLP 或轻 Q-Former;追求省 token/固定长度(视频、多图)→ Perceiver Resampler。
- 主流开源用 MLP 或直接投影:LLaVA-OneVision、Qwen-VL、InternVL 多用 MLP 或直接投影 + 动态分辨率,兼顾实现与质量。
- 常见坑:固定低分辨率丢细节:连接器再强也补不回被判掉的分辨率。无论选哪种连接器,都要配合动态分辨率/切图(见 8.2)才能保细节。
学习路径
- 读 8.2:理解动态切图的 token 平方增长
- 跑 dynamic_tiles 代码,调 base/max_tiles 看 token 变化
- 完成 8.5 练习 2:说明切图解决什么、代价是什么
- 对接 M11:按分辨率预算切图并设 max_tiles(M11 交付)
核心知识点详解
- 动态切图的 token 计算:每 tile 按 base(如 336)编码且约 256 token:1×1→256、2×2→1,024、3×3→2,304、4×4→4,096。随 tile 数平方级增长。
- 切图解决丢细节:固定低分辨率会丢小字/图表;
dynamic_tiles按宽高比切多个子图分别编码,兼顾「看清全局」与「看清局部」。 - max_tiles 是硬约束:
dynamic_tiles(img, base=336, max_tiles=12)超出即丢弃/下采样。否则高分图会切出几十个 tile,token 与成本失控。 - 常见坑:一律全程高分辨率:只在需要看细节的子图(图表/小字)上高分辨率,普通场景整图低分辨率即可;无脑全高清会让 token 涨 9×。
学习路径
- 读 8.3 表格:对比主流 VLM 的视觉塔与亮点
- 跑一个开源 VLM 示例,理解其连接器与分辨率
- 完成 8.5 练习 5:说明 Gemini 3 原生多模态 vs 拼接的区别
- 对接 M11:选一个开源 VLM 作文档问答基座
核心知识点详解
- 代表模型差异:LLaVA(CLIP/SigLIP + MLP,开源基线)、Qwen-VL/Qwen3-VL(动态分辨率,强 OCR/文档)、InternVL(超大 InternViT)、Gemini 3(原生多模态统一骨干)。
- Gemini 3 原生 vs 拼接:Gemini 3 在预训练期就让图像/音频/视频与文本共享同一 Transformer 骨干,跨模态注意力在底层发生;拼接式是 ViT 编码后经适配器接入冻结 LLM、交互浅。
- 选型看任务与资源:文档问答 → Qwen3-VL/InternVL(强 OCR);统一多模态 → Gemini 3/Qwen3-VL;自部署基线 → LLaVA 系。
- 常见坑:只看一句话宣传:选基座要实测你的数据分布(OCR/图表/空间),并核算视觉 token 成本;别只凭「强 OCR」/「原生」的标签决策。
学习路径
- 读 8.4 表格:掌握三阶段各自的冻结与对齐目标
- 复盘 lora 微调流程,理解指令微调阶段
- 完成 8.5 练习 3/4:写三阶段、说明只看对接会「看得见不会用」
- 对接 M11:规划你的 VLM 微调阶段与数据
核心知识点详解
- 三阶段的冻结与对齐:① 对齐预训练:海量图文对,冻结视觉塔,让视觉 token 与 LLM 词空间对齐;② 多任务预训练:图文/视频/OCR/检测混合、部分解冻,学多任务视觉能力;③ 指令微调:指令-回答对,全参或 LoRA。
- 「看得见≠会用」:只做第一阶段只能让视觉特征被 LLM 读懂,未教会它用视觉信息做多任务。跳过二/三阶段会出现「看得见但不会用」。
- 每个阶段解决一个目标:一阶段「能读懂」、二阶段「多种任务会用」、三阶段「按指令精准输出」。缺任一段对应能力就有明显短板。
- 常见坑:只做指令微调:跳过对齐预训练,视觉特征未与词空间对齐,指令微调也救不回来。三阶段要按顺序走,别跳步。
8.1 连接器方案对比
VLM 三段式 = 视觉编码器 + 连接器 + LLM。连接器负责把视觉特征「翻译」成 LLM 能懂的 token,方案差异直接决定信息保真度与参数量。
| 连接器 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 线性投影 | 单层 Linear(d_vis → d_llm) | 最简、最快 | 信息压缩强、细节易丢 |
| MLP | 2 层 MLP + 激活 | 稍强、仍轻量 | 中等 |
| Q-Former | 可学 query 对视觉做 bottleneck 抽取 | 压缩可控、跨模态对齐好 | 多一坨参数、训练复杂 |
| Perceiver Resampler | cross-attn 重采样到固定 token 数 | 输出长度固定、省 token | 可能丢细节 |
8.2 分辨率处理:切图与动态分辨率
固定低分辨率会丢细节。主流做法是动态分辨率 + 切图(tiling):原图按宽高比切成多个子图(tile),每个 tile 编码成若干视觉 token,再拼回序列;超分辨率信息作为单独 tile。这样兼顾「看清全局」与「看清局部」。
python# 动态切图:按原图比例切若干 tile,每块独立编码
def dynamic_tiles(img, base=336, max_tiles=12):
w, h = img.size
scale = base / min(w, h)
tw, th = int(w * scale), int(h * scale)
cols, rows = max(1, round(tw / base)), max(1, round(th / base))
tiles = []
for r in range(rows):
for c in range(cols):
tile = img.crop((c*base, r*base, (c+1)*base, (r+1)*base))
tiles.append(tile)
return tiles[:max_tiles] # 超出的丢弃或下采样
# token 数 = Σ tile 的 patch 数;动态分辨率下可能从 256 涨到 1024+
| 原图 | 切图网格 | tile 数 | 视觉 token(每 tile 256) |
|---|---|---|---|
| 336×336 | 1×1 | 1 | 256 |
| 672×672 | 2×2 | 4 | 1,024 |
| 1008×1008 | 3×3 | 9 | 2,304 |
| 1344×1344 | 4×4 | 16 | 4,096 |
8.3 代表模型差异
| 模型 | 视觉塔 | 连接器 | 亮点 |
|---|---|---|---|
| LLaVA / LLaVA-OV | CLIP/SigLIP | MLP | 开源基线、生态成熟 |
| Qwen-VL / Qwen3-VL | ViT + 动态分辨率 | MLP + 切图 | 强 OCR/文档、原生多模态 |
| InternVL | InternViT(超大) | MLP | 视觉塔大、细粒度强 |
| Gemini | 原生多模态(统一骨干) | — | 图像/视频/音频统一建模 |
8.4 训练三阶段:各自对齐什么
| 阶段 | 数据 | 对齐目标 | 冻结什么 |
|---|---|---|---|
| 对齐预训练 | 海量图文对 | 让视觉 token 与 LLM 词空间对齐 | 通常冻视觉塔 |
| 多任务预训练 | 图文/视频/OCR/检测混合 | 学会多任务视觉能力 | 部分解冻 |
| 指令微调 | 人工指令-回答对 | 学会按指令做细粒度任务 | 全参数 / LoRA |
关键洞察:第一阶段只解决「视觉特征能被 LLM 读懂」,第二阶段解决「模型真的会用视觉信息做多种任务」,第三阶段解决「按用户指令精准输出」。跳过任一阶段都会在对应能力上出现明显短板(如只做一阶段会「看得见但不会用」)。
8.5 动手练习与自测
- 四种连接器(线性 / MLP / Q-Former / Perceiver)各适合什么需求?
- 动态分辨率 + 切图解决了什么问题?代价是什么?
- 列出 VLM 训练的三阶段,以及各阶段冻结什么、对齐什么。
- 为什么只做第一阶段会出现「看得见但不会用」?
- Gemini 3 的原生多模态与「ViT + LLM 拼接」的本质区别是什么?
9. 视频理解:帧、时序与 token 爆炸
学习路径
- 读 9.1:理解三种帧采样策略与时序位置编码
- 跑 video_tokens 估算,对比采样前后 token 数
- 完成 9.3 练习 1/2/3:算帧数、写策略取舍、说明 Temporal PE
- 对接 M11:为视频问答选定采样帧数
核心知识点详解
- 三种帧采样策略:均匀采样(等间隔 K 帧,覆盖全片但可能漏关键时刻)、关键帧(镜头切换/动作检测,抓重点省 token)、密集采样(高帧率,细但 token 爆炸)。常取 8–32 帧。
- 时序位置编码 Temporal PE:帧间顺序靠 Temporal PE 注入(帧级 embedding 或 3D 位置=帧内 2D + 帧间 1D),让注意力区分「先发生/后发生」动作,对因果/排序问题关键。
- token 计算:30s@8fps=240 帧;每帧 256 token → 采样 16 帧 =
16×256=4096;若不采样则240×256=61440(撑爆上下文)。 - 常见坑:采样漏掉关键时刻:均匀采样可能在两个语义点之间取帧漏掉关键动作;对事件型视频用关键帧采样更省更准。
学习路径
- 读 9.2:理解 token = 帧数 × 每帧 token 的爆炸问题
- 跑 video_tokens 代码,对比采样 vs 全帧
- 完成 9.3 练习 1:算 240 帧全额与采样 16 帧
- 对接 M11:估视频类请求的 token 预算
核心知识点详解
- token = 帧数 × 每帧 token:30s@8fps=240 帧;采样 16 帧 =
16×256=4096 token;不采样全帧 =61440 token——直接撑爆上下文。 - 全帧 vs 采样差 15 倍:240 帧全编码约
61440token,采样到 16 只剩4096,差距超过一个数量级,是视频类请求的第一成本杠杆。 - 为什么全帧不可行:1 分钟视频全帧对应数万 token,比一张图贵 100 倍以上;超出上下文长度还会被迫截断丢信息。
- 常见坑:拿全帧堵高精度:以为全帧更准却实际超上下文被截断,反而更差。应先采样 + 分层(先粗看再精看 relevant 段)。
学习路径
- 读 9.2:理解四种压缩手段(降帧/固定 token/3D VAE/分层)
- 跑 video_tokens(3D VAE) 代码,算压缩后的 token 预算
- 完成 9.3 练习 4/5:写压缩手段、说明为何窗口注意力省 80 倍
- 对接 M11:在视频管线里选压缩策略
核心知识点详解
- 四种压缩手段:降帧率(关键帧优先)、每帧 Perceiver 压到固定 token、3D VAE 时间维压缩、分层(先摘要再精看 relevant 段)。
- 3D VAE 压缩公式:
video_tokens(F,H,W) = lf·(lh//patch)·(lw//patch)(时间 /td、空间 /sd)。49帧480×832 压后20280token、121帧720×1280 压后111600。 - 窗口注意力省约 80×:49 帧 20280 token 全时空注意力 fp16 下 K V + 注意力矩阵约 20 GB;改为只看前后 12 帧的窗口注意力只需约 0.26 GB——相差近 80 倍。
- 常见坑:忽略注意力矩阵显存:只算 token 数不算注意力矩阵大小时,长序列会莫名 OOM。长视频必须用“空间全注意力 + 时间窗口注意力 + 关键帧全局记忆”三段式。
学习路径
- 读 9.3 练习 5 答案:理解「看不看/看多少」优先于选模型
- 跑 token 预算脚本,量化 1 分钟视频成本
- 完成 9.3 练习 5:说明为何帧决策比模型更重要
- 对接 M11:在路由里决定是否看视频、看多少帧
核心知识点详解
- 1 分钟视频贵 100×:1 分钟视频全帧可能对应数万 token,比一张图贵 100 倍以上——视频类请求的成本天花板极高。
- 先决策看多少优于选模型:「要不要看视频、看多少帧、看哪几段」对成本的影响远大于选哪个模型;这又回到路由与预算控制。
- 决策流程:路由先判断「是否真的需要看视频」→ 用关键帧/低采样粗看 → 分层只对 relevant 段精看。避免照单全收。
- 常见坑:预览片段也要全帧编码:即使只取 10 秒预览,若全帧编码仍会上万 token。按内容类型分别设定帧数上限,别统一拉满。
9.1 帧采样与时序位置编码
视频 = 帧序列。直接对每帧做 ViT 会 token 爆炸(1 分钟 30fps = 1800 帧)。做法是帧采样:均匀/关键帧抽样到 K 帧(常 8–32 帧),每帧取若干 token,再在时序维做位置编码让模型知道先后顺序。
| 策略 | 做法 | 取舍 |
|---|---|---|
| 均匀采样 | 等间隔取 K 帧 | 简单、覆盖全片但可能漏关键时刻 |
| 关键帧 | 镜头切换/动作检测取帧 | 抓重点、省 token |
| 密集采样 | 高帧率 | 细但 token 爆炸 |
9.2 长视频的 token 爆炸与压缩
长视频的瓶颈是token 数 = 帧数 × 每帧 token。压缩手段:① 降低帧率(关键帧优先);② 每帧用 Perceiver/重采样压到固定 token;③ 用 3D VAE 在时间维压缩(视频生成同款思路);④ 分层——先粗看全片摘要,再对 relevant 片段精看。
python# 视频 token 预算估算
def video_tokens(n_frames, tokens_per_frame, sampler="uniform", k=16):
picked = min(k, n_frames) if sampler == "uniform" else n_frames
return picked * tokens_per_frame # 例如 16 帧 * 256 = 4096 token
# 30s@8fps=240 帧 -> 若只取 16 帧、每帧 256 token = 4096
# 若不采样 240*256 = 61440 token —— 直接撑爆上下文
python# 用 3D VAE 压缩后的真实 token 预算(空间 /8, 时间 /4, patch 2)
def video_tokens(F, H, W, sd=8, td=4, patch=2):
lf = 1 + (F - 1)//td # 潜空间帧数(首帧不压缩)
lh, lw = H//sd, W//sd
return lf * (lh//patch) * (lw//patch)
for F, H, W in [(16, 480, 832), (49, 480, 832), (121, 720, 1280)]:
print(F, '帧', H, 'x', W, '->', video_tokens(F, H, W), 'tokens')
# 预期输出:
# 16 帧 480 x 832 -> 6240 tokens
# 49 帧 480 x 832 -> 20280 tokens
# 121 帧 720 x 1280 -> 111600 tokens
9.3 动手练习与自测
- 30 秒 8fps 视频共多少帧?若全帧每帧 256 token 是多少?均匀采样到 16 帧后是多少?
- 帧采样的三种策略各有什么取舍?
- 时序位置编码(Temporal PE)解决什么问题?
- 长视频 token 爆炸的四种压缩手段是什么?
- 为什么「要不要看视频、看多少帧」比选模型更重要?
10. 语音与音频:从 ASR 到端到端对话
学习路径
- 读 10.1:理解 Whisper 的多任务特殊 token 机制
- 跑 whisper transcribe 示例,切换 transcribe/translate 任务
- 完成 10.3 练习 1/2/5:写多任务格式、选型、重叠窗口
- 对接 M11:接 Whisper 做语音入站识别
核心知识点详解
- 编码器-解码器 + mel 谱:Whisper 音频 mel 谱过 encoder,decoder 自回归生成文本;一套权重覆盖多语言多任务。
- 多任务特殊 token:在输入前拼接
<|startoftranscript|>、语言标记、<|transcribe|>/<|translate|>、时间戳标记来切换任务——同一个 decoder 靠条件 token 学会不同模式。 - 长音频重叠窗口:长音频要分段 + 重叠窗口(如 30s/overlap 5s)避免截断与幻觉重复;边界词靠重叠保全上下文,再对重复做去重。
- 常见坑:整段一次转录长音频:一次性喂长音频会因体验上下文截断或产生幻觉重复。务必分段 + 重叠 + 去重处理。
学习路径
- 读 10.2 表格:对比级联/语音LLM/端到端
- 搭一个 ASR→LLM→TTS 回路,感受级联的延迟叠加
- 完成 10.3 练习 4:说明语音 LLM 与级联在副语言信息上的差别
- 对接 M11:思考端到端语音对话的成本
核心知识点详解
- 三条路线:级联(ASR→LLM→TTS)、语音 LLM(音频离散 token 进 LLM)、端到端(语音直接进出)。
- 副语言信息之差:级联在 ASR 与 TTS 之间有文本瓶颈,语气/情绪易丢失;语音 LLM 直接建模音频 token 可保留副语言(语气/情绪);端到端原生保留。
- 音频离散 token:语音 LLM 用音频 tokenizer 把声音切成离散 token 与文本 token 在同一 Transformer 联合建模,才能保留非文字信息。
- 常见坑:级联以为能自然对话:级联三段拼接无法做「边说边打断」,语气也丢失;要自然打断/情绪保留就得上语音 LLM 或端到端。
学习路径
核心知识点详解
- 各环节时延预算:流式 ASR 首字
200–600ms、LLM500–3000ms、流式 TTS 首包150–400ms;端到端目标<1000ms轮次延迟。 - 用流水线并行拼 <1s:不要三端串行等完整结果;流式 ASR(VAD 断句)+ 流式生成 + 流式 TTS,边收边处理边播放 + 早启动压总延迟。
- barge-in 打断:端到端模型在用户说话中途即可「听、想、回」,无需等完整语句结束,因此能自然处理打断与重叠发言。
- 常见坑:忽略 VAD 与首字延迟:只优化 LLM 端面忽略听写首字,体验仍卡;从
本地 VAD 断句 + 小模型 ASR砍首字最实际。
学习路径
核心知识点详解
- 合规红线:声音克隆做声纹授权 + 合成音频水印 + 可检测性,防止深度伪造滥用——这是监管硬约束。
- 落地措施:为 TTS 加合成音标记/水印与来源可检测;高风险场景设授权流、滥用拦截与追踪。
- 授权是第一道闸:未授权使用他人声纹是红线;产品需在克隆前完成本人显式授权流程。
- 常见坑:把合规留给上线后:授权流与水印必须在架构设计期就纳入,否则临时加补丁成本高且可能漏。
10.1 Whisper:编码器-解码器与多任务格式
Whisper 用编码器-解码器做语音识别:音频 mel 谱过 encoder,decoder 自回归生成文本。它的妙处是多任务格式——在输入前加特殊 token(如 <|startoftranscript|>、语言标记、<|transcribe|>/<|translate|>)来指定任务(转录/翻译/带时间戳),一套权重覆盖多语言多任务。
python# Whisper 的多任务条件 (伪代码)
# 输入: [<|startoftranscript|>, <|en|>, <|transcribe|>, <|notimestamps|>] + mel
# 输出: 对应语言的文本
# 关键: 这些条件 token 让同一个 decoder 学会「切换到不同任务模式」
result = whisper_model.transcribe(
audio, language="en", task="transcribe", # 也可 task="translate"
)
# 端到端时延取决于模型尺寸: tiny(32MB) < base < small < ... < large-v3
10.2 语音 LLM 与端到端对话
| 路线 | 拼接方式 | 优点 | 缺点 |
|---|---|---|---|
| 级联 | ASR → LLM → TTS | 成熟、好调试 | 延迟叠加、副语言丢失 |
| 语音 LLM | 音频编为离散 token 进 LLM | 保留语气/情绪 | 需音频 tokenizer |
| 端到端 | 语音直接进、语音直接出 | 低延迟、自然 | 数据/工程门槛高 |
2026 年的实时语音模型(如 GPT-4o 语音、Gemini 原生语音、各家 Omni 模型)走端到端:语音切成离散 token 或连续表征,与文本 token 在同一个 Transformer 里联合建模,能在用户说话中途就「听、想、回」,实现打断(barge-in)与自然轮次。体验门槛是端到端延迟 < 1s。
| 环节 | 典型时延(流式) | 优化手段 |
|---|---|---|
| 流式 ASR | 200–600 ms 首字 | 小模型 / 局部 VAD 断句 |
| LLM 思考+生成 | 500–3000 ms(取决于是否思考) | 低温度、缓存、小模型兜底 |
| 流式 TTS | 150–400 ms 首包 | 神经声码器量化、边生成边播 |
| 端到端目标 | < 1000 ms 轮次延迟 | 三段流水线并行 + 早启动 |
10.3 动手练习与自测
- Whisper 的多任务格式靠什么实现?一套权重如何覆盖转录 / 翻译 / 时间戳?
- 实时本地 ASR 与精度优先各该选什么尺寸的模型?
- 写出一条流式语音对话的端到端时延预算(各环节毫秒数)。
- 语音 LLM 与级联式在「副语言信息」上的差别是什么?
- 长音频识别为什么需要重叠窗口?
11. 扩散模型数学进阶:引导、加速与潜空间
学习路径
- 读 11.1 表格:理解 ε / x0 / v 及换算
- 跑参数化对比,观察 v-prediction 在高噪步更稳
- 完成 11.4 练习 5:说明哪种与 Flow Matching 统一
- 对接 M11:为生成管线选目标参数化
核心知识点详解
- 三种预测目标:
ε(DDPM 默认,预测噪声)稳定;x0采样后期更准、易约束;v=αε−σx0(预测速度)高噪声步更稳。 - 可相互换算:给定 α_t、σ_t,ε/x0/v 三者可相互转换——只是参数化不同,网络都能拟合,但数值稳定性不同。
- v 与 Flow Matching 统一:
v与 Flow Matching / Rectified Flow 的速度场均质同构,是 2025–2026 多视频/高分辨率模型的选择。 - 常见坑:全阶段用一个目标:高噪步重 v、后期重 x0;固定单目标会在特定噪声档表现差。可混合/切换参数化解耦不同阶段的最优目标。
学习路径
核心知识点详解
- CFG 外推公式:
ε_hat = ε_uncond + w·(ε_cond − ε_uncond),同时跑有条件/无条件两次预测再线性外推,w控制文本对齐强度。 - w 的取值区间:
w=3~7常用且文图贴合、保持多样;w>10出现过饱和、文字伪影、构图崩、多样性下降。 - 视频需时域 CFG:视频里还需对运动强度做时域引导,防止「静止但精致」的画面;时空分别引导才平衡。
- 常见坑:w 太大追求贴文:w 太大虽贴 prompt 但过度饱和/伪影/多样性崩。用「文本对齐 vs 多样性」曲线找甜点位,别一味调大。
学习路径
核心知识点详解
- DDIM 非马尔可夫确定性采样:不保证逐 t 加噪马尔可夫链,用确定性公式直接跳步反演,把 1000 步 DDPM 压到 20–50 步质量损失小。
- 允许跳步:确定性假设使相邻 t 步可合并,跳步后仍可重建,故 20–50 步即可。
- 经验步数:图像通常 DDPM 1000 步 / DDIM 50 步;潜空间扩散 + 蒸馏可到
20–30甚至更少。 - 常见坑:越少步越好:步数太少仍有细节损失或伪影。以任务可接受的画质为下限,别盲目压步。
学习路径
- 读 11.3:理解 VAE 潜空间压缩与算力收益
- 手算 token 数 262144→4096,体验 1/64 FLOPs
- 完成 11.4 练习 3:写压缩倍数与注意力 token 数
- 对接 M11:评估生成管线是否值得上潜空间扩散
核心知识点详解
- VAE 压缩 8×:像素 512×512×3 → 潜空间 64×64×4(8 倍压缩),像素空间注意力 token 262,144 → 潜空间
4096,降 64×。 - FLOPs ≈ 1/64:单次去噪 FLOPs 降约
1/64(8²),这就是 SD 能跑在消费级 GPU 的根本原因。 - 代价:丢极细高频细节:VAE 压缩会丢一部分极细纹理,所以潜空间扩散在超高清/极细细节上不如像素空间。
- 常见坑:只看到省算力忽略保真:极高保真/专业级细节任务用潜空间可能不够;先对比「VAE 重建清晰度」判断能否接受压缩损失。
11.1 预测目标:ε / x0 / v
| 预测目标 | 网络输出 | 特点 |
|---|---|---|
| ε (噪声) | 预测加进去的噪声 | DDPM 默认,稳定 |
| x0 (干净图) | 预测原始数据 | 采样后期更准、易约束 |
| v (速度) | 预测速度场 v=αε−σx0 | 高噪声步更稳、与 Flow Matching 统一 |
三者可相互转换(给定 α_t, σ_t),只是参数化不同。v-prediction 在极噪步更数值稳定,且和 Flow Matching 的速度场同构,是 2025–2026 许多视频/高分辨率模型的选择。
11.2 分类器无关引导(CFG)
CFG 是「文本对齐」的关键:同时跑有条件与无条件两次预测,按引导强度 w 外推:
text# CFG:在条件与无条件预测之间插值
# ε_hat = ε_uncond + w * ( ε_cond - ε_uncond )
# w(引导强度): 越大越贴合 prompt,但多样性和自然度下降
# 经验: w=3~7 常用;w>10 易过饱和、文字伪影、构图崩
# 实现: 把空 prompt 也拼进 batch,一次前向得两个输出,再线性组合
11.3 DDIM 加速与潜空间扩散
DDIM 用非马尔可夫确定性采样,把 1000 步 DDPM 压到 20–50 步且质量损失小。而潜空间扩散(Latent Diffusion)先在 VAE 把图像压到 8×8 倍小的潜空间再扩散——把像素级去噪换成潜变量级去噪,算力降约 1/64(8²),这是 SD 系列能跑在消费级 GPU 的根本。
text# 为什么 latent diffusion 更高效
# 像素空间: 512x512x3 -> U-Net 在 (512,512) 上算注意力 O(HW)^2
# 潜空间 : 64x64x4 (VAE 压缩 8x) -> 注意力 token 数降 64 倍
# 代价: VAE 编码/解码的一次性开销 + 潜空间可能丢极细高频细节
# DDIM 采样: x_{t-1} = ...(确定性, 可跳步) -> 步数 1000->25 仍可用
| 维度 | 像素空间扩散 | Latent Diffusion (SD) |
|---|---|---|
| 潜变量尺寸 | 512×512×3 | 64×64×4(VAE 压缩 8×) |
| U-Net / DiT token 数 | 262,144 | 4,096(降 64×) |
| 单次去噪 FLOPs | ≈ 1.0(基准) | ≈ 1/64(同算力可更细) |
| 典型步数 | 1000 (DDPM) / 50 (DDIM) | 50 (DDIM) / 20–30 (蒸馏) |
| 代价 | 消费级难跑 | 消费级可跑 |
11.4 动手练习与自测
- 写出 CFG 的外推公式,并说明 w 取 3~7 与 >10 的差别。
- DDIM 把 DDPM 的 1000 步压到多少步?为什么可以跳步?
- 潜空间扩散为什么比像素空间省算力?给出压缩倍数与注意力 token 数对比。
- CFG 在视频生成里为什么还需要时域引导?
- ε / x0 / v 哪种参数化与 Flow Matching 统一?
12. Flow Matching / Rectified Flow 深入
学习路径
- 读 12.1:理解直线插值路径与常速 v=x1−x0
- 跑 Flow Matching 最小示例,看 1 步均值到 1.985
- 完成 12.2 练习 1/3:写路径与速度、说明训练优势
- 对接 M11:理解 FLUX/SD3 的生成加速原理
核心知识点详解
- 直线插值路径:
x_t = (1−t)x0 + t·x1(t:0→1,x0=噪声、x1=数据);速度是导数,沿直线为常数v=x1−x0。 - 训练即回归速度场:
loss = MSE(model(x_t,t), x1−x0),目标干净稳定,这就是 Rectified Flow 的「整流」——把弯曲路径掰直。 - 路径越直步数越少:速度场近常数时大步长积分误差小,1 步就能把均值推到目标近值(示例 1 步均值到 1.985,目标 2.0)。
- 常见坑:把均值当完整分布:少步后均值已对但方差不收敛仍不完整;1 步 std 0.476 vs 目标 0.583——仍要多步才能收敛到正确分布,别只看均值。
学习路径
- 读 12.1 表格/结论:路径越直采样步数越少
- 跑 sample 代码,对比 1/2/4/8 步的均值与 std
- 完成 12.2 练习 2:写为何可蒸馏到 1–4 步
- 对接 M11:比较不同采样步数与质量的关系
核心知识点详解
- 路径越直则步数越少:直线路径速度场近常速,1 步均值
1.985(目标 2.0)、2 步1.997、4 步1.996——均值几乎一步到位。 - 可蒸馏到 1–4 步:直线路径使大步长积分误差小,FC/FLUX、SD3 能把采样压到 4 步甚至蒸馏到
1–2步。 - 分布收敛看 std 不看均值:均值 1 步就对,但 std 从 0.476→0.583 需更多步收敛——少步会欠方差、多步才完整。
- 常见坑:用均值评估生成质量:均值只反映位置,不反映多样性/方差。生成质量要同时看均值(位置)与 std(多样性),否则被「均值对」误导。
学习路径
- 读 12.1 的 2026 地位:理解扩散与流匹配同族
- 对照 11.1 的 v-prediction,理解与 DiT 兼容
- 完成 12.2 练习 5:写数学上的统一
- 对接 M11:用统一视角理解理解与生成合流
核心知识点详解
- 扩散与流匹配同族:两者都是「学一个把噪声推向数据的变换」,只是参数化不同——流匹配把弯曲加噪路径「整流」成直线。
- 与 DiT 兼容:Flow Matching 的速度目标与
v-prediction同构,而 DiT 是骨干;同一 DiT 骨干可用不同的预测目标,天然兼容。 - 统一视角的意义:用统一视角,「理解」与「生成」正搭同一骨干(如 mixture-of-transformers),支撑世界模型方向。
- 常见坑:把两者当完全不同的方法:它们在数学上是同一家族(参数化差异)。理解这一层才能在看 FLUX/SD3 技术报告时不被术语绕晕。
12.1 为什么训练更直
扩散的路径是「加噪→去噪」的随机过程,轨迹弯曲、需要多步。Rectified Flow 把路径直接定义成噪声到数据的直线插值,训练目标是沿这条直线的常速场。路径越直,采样步数越少——可蒸馏到 1–4 步,且训练目标更简单稳定。
text# Rectified Flow 的路径与速度
# 直线路径: x_t = (1-t)*x0 + t*x1 (t:0->1, x0=噪声, x1=数据)
# 速度目标: v = dx/dt = x1 - x0 (沿直线是常数!)
# 训练: MSE( model(x_t, t), x1 - x0 )
# 采样: 从 x0 出发,沿学到的 v 积分(几步即可,因为路径近直线)
# 与 DDPM 关系: 可视为把「弯曲的加噪路径」整流成「直线」
python# Flow Matching 最小可运行示例(纯标准库):把噪声推向 N(2, 0.7)
import random, statistics
random.seed(0)
def data(n): return [random.gauss(2.0, 0.7) for _ in range(n)]
N = 4000
x0 = [random.gauss(0.0, 1.0) for _ in range(N)] # 噪声
x1 = data(N) # 数据
t = [random.random() for _ in range(N)]
xt = [(1.0 - ti)*a + ti*b for ti, a, b in zip(t, x0, x1)]
vt = [b - a for a, b in zip(x0, x1)] # 真速度 = x1 - x0 (常数)
def lstsq3(A, y): # 正规方程 + 高斯消元
n = 3
AtA = [[sum(r[i]*r[j] for r in A) for j in range(n)] for i in range(n)]
Aty = [sum(r[i]*yy for r, yy in zip(A, y)) for i in range(n)]
M = [row[:] + [Aty[i]] for i, row in enumerate(AtA)]
for c in range(n):
p = max(range(c, n), key=lambda r: abs(M[r][c]))
M[c], M[p] = M[p], M[c]
pv = M[c][c]
for j in range(c, n+1): M[c][j] /= pv
for r in range(n):
if r != c:
f = M[r][c]
for j in range(c, n+1): M[r][j] -= f*M[c][j]
return [M[i][n] for i in range(n)]
w = lstsq3([[1.0, ti, xi] for ti, xi in zip(t, xt)], vt)
print('coef [bias, t, x]:', [round(v, 3) for v in w])
def sample(steps): # Euler 积分
x = [random.gauss(0.0, 1.0) for _ in range(20000)]
dt = 1.0 / steps
for i in range(steps):
tt = i*dt
x = [xi + dt*(w[0] + w[1]*tt + w[2]*xi) for xi in x]
return x
for k in (1, 2, 4, 8):
x = sample(k)
print('steps', k, 'mean', round(statistics.mean(x), 3),
'std', round(statistics.pstdev(x), 3))
# 预期输出(近似):
# coef [bias, t, x]: [1.984, 1.066, -0.524]
# steps 1 mean 1.985 std 0.476
# steps 2 mean 1.997 std 0.541
# steps 4 mean 1.996 std 0.57
# steps 8 mean 1.997 std 0.583
读这三个数:均值目标 2.0——1 步就把均值推到 1.985,说明直线路径的单步积分误差极小;再增加到 8 步,均值几乎不动(1.997),分布只做微调。这正是 FLUX / SD3 敢把采样压到 4 步甚至更少、并进一步蒸馏到 1–2 步的原因。对比之下,DDPM 的弯曲路径若只用 1 步,图像几乎是噪声。
12.2 动手练习与自测
- 写出 Rectified Flow 的直线路径与速度目标,并说明为什么速度是常数。
- 为什么路径越直采样步数越少?可蒸馏到几步?
- Rectified Flow 相对 DDPM 的训练优势是什么?
- FLUX / SD3 采用什么训练目标?
- 「扩散」与「流匹配」在数学上如何统一?
13. DiT:用 Transformer 替代 U-Net
学习路径
- 读 13.1:理解 adaLN-Zero 的条件注入机制
- 跑 gate=0 vs gate=0.8 示例,看恒等 vs 条件输出
- 完成 13.2 练习 1:写注入方式、说明为何 gate 初始化 0
- 对接 M11:理解主流生成骨干的 zero-init 设计
核心知识点详解
- adaLN-Zero 条件注入:用条件(时间步/文本)经零初始化 MLP 预测 LayerNorm 的
(shift, scale, gate),h = x×(1+scale)+shift。 - gate 初 0 退化为恒等:
h_out = x + gate·h_attn;gate=0 时残差分支贡献为 0,整层开头是恒等映射(示例 max|out−x|=0.0),训练第一步梯度平稳传播。 - 条件逐步「接管」:随训练 gate 从 0 长到 0.5–1.5,条件调制才逐步生效——这就是绝大多数 2026 DiT 骨干(FLUX/Wan/HunyuanVideo)默认开 zero-init 的原因。
- 常见坑:条件随机初始化破坏深层:若不 gate 而是直接随机调制,深层 Transformer 一上来就被条件噪声破坏、梯度不稳。gate 初始化 0 是稳定性关键。
学习路径
- 读 13.1 表格:看 DiT 从 XS 到 XL 的算力与质量
- 跑或对照参数对比,体会 70x 算力的 FID 提升
- 完成 13.2 练习 2/3:写计算与质量变化、解释为何优于 U-Net
- 对接 M11:评估是否值得上更大 DiT 骨干
核心知识点详解
- XS→XL 约 70x:DiT 从 0.4G(XS,1x)到 28G(XL,约 70x),FID 随规模单调提升,清晰度与一致性增强。
- 遵循缩放律:Transformer 模型/数据越大生成质量单调提升且计算高效,这正是「可扩展性」的核心卖点。
- U-Net 的局限:U-Net 的卷积偏置在大规模下收益有限,FID 提升随规模趋平、难以企及 Transformer 的缩放曲线。
- 常见坑:拿小数据断言 DiT 缩放失败:缩放律需要足够大模型 + 大 token 数 + 大数据才显优势;在极小任务上 DiT 未必比 U-Net 强,别据此误判。
学习路径
核心知识点详解
- 两种文本注入方式:① cross-attention:在 DiT 各层对文本特征做交叉注意力;② concat 进 adaLN:文本特征拼进条件向量一起预测 shift/scale/gate。
- cross-attention 更强但更贵:cross-attn 让每层都能显式关注文本 token,文图对齐更强,但增加序列交互、更贵;concat 更轻量。
- 按任务选注入:强文本对齐任务(文生图/文生视频)多用 cross-attention 或两者结合;轻量/速度敏感用 concat 进 adaLN。
- 常见坑:浅层不看文本:若只在少数层注入文本,模型对文本对齐较弱。检查各层是否都传递了条件,别只在输出端加。
学习路径
- 读 13.1 尾段与练习 5:理解骨干为何转向 DiT
- 对照主流模型表,确认都采用 DiT + zero-init
- 完成 13.2 练习 5:写为何都用 DiT 骨干
- 对接 M11:在生成子模块遵循 DiT 选型惯例
核心知识点详解
- 主流骨干全线 DiT:Sora、Veo、可灵、Wan、FLUX、HunyuanVideo、CogVideoX 都转 DiT/Transformer 骨干,
zero-init成默认。 - 理由一:可扩展性:Transformer 直接吃缩放律收益,越大约好 FID 单调提升——U-Net 难企及。
- 理由二:统一性:同一骨干接受文本/图像/动作/相机轨迹等异构条件,支撑视频生成/世界模型等统一下游。
- 常见坑:照搬旧 U-Net 设计:迁移项目常保留 U-Net 的通道/结构假设。转 DiT 要改成 patch 化 + zero-init + 自适应条件注入,否则发挥不出缩放收益。
13.1 adaLN-Zero 条件注入
DiT 把 U-Net 换成 Transformer:在 patch 上做注意力。条件(时间步 t、文本、类别)通过 adaLN-Zero 注入——用条件预测 LayerNorm 的 scale/shift(以及 gate),且初始化为零,使残差分支从「恒等」开始,训练更稳、条件可控。
text# adaLN-Zero: 用条件预测归一化参数
# 输入条件 c (如时间步 t 的编码)
# (shift, scale, gate) = MLP_zero_init(c) # 零初始化 MLP
# 每个 DiT block 内:
# h = x * (1 + scale) + shift # 自适应 LayerNorm
# h = Attention(h)
# h = x + gate * h # gate 初始 0 -> 先恒等
# 文本条件: 走 cross-attention 或 concate 到条件 c 一起进 adaLN
| DiT 规模(G) | 相对计算 | 生成质量(FID, 示意) | 规律 |
|---|---|---|---|
| 0.4 (XS) | 1x | 较高 | 可跑但质量有限 |
| 2 (S) | ~5x | 中 | 明显提升 |
| 8 (B) | ~20x | 较好 | 接近可用 |
| 28 (XL) | ~70x | 优 | 清晰、一致性强 |
python# adaLN-Zero 为什么稳: gate=0 时整个 block 是恒等映射
import random
random.seed(1)
def layernorm(x):
m = sum(x)/len(x)
v = sum((xi-m)**2 for xi in x)/len(x)
return [(xi-m)/((v+1e-5)**0.5) for xi in x]
d = 4
x = [random.gauss(0, 1) for _ in range(d)]
def block(x, shift, scale, gate, fb=0.5):
h = [xi*(1.0+s)+sh for xi, s, sh in zip(layernorm(x), scale, shift)]
attn = [hi*fb for hi in h] # 占位子层
return [xi + gate*a for xi, a in zip(x, attn)]
o0 = block(x, [0.0]*d, [0.0]*d, 0.0) # 零初始化
print('gate=0 -> max|out-x| =', round(max(abs(a-b) for a, b in zip(o0, x)), 6))
o1 = block(x, [0.2]*d, [0.1]*d, 0.8) # 训练后
print('gate=0.8 -> max|out-x| =', round(max(abs(a-b) for a, b in zip(o1, x)), 3))
# 预期输出:
# gate=0 -> max|out-x| = 0.0
# gate=0.8 -> max|out-x| = 0.536
这个 0.0 就是 adaLN-Zero 的核心:训练第一步时,所有条件分支贡献为 0,整层退化成恒等映射,于是深层 Transformer 不会一上来就被随机的条件调制破坏,梯度能平稳传播。随着训练推进,gate 从 0 长到 0.5–1.5,条件才逐步「接管」——这也是绝大多数 2026 的 DiT 视频/图像骨干(FLUX、Wan、HunyuanVideo)默认开 zero-init 的原因。
13.2 动手练习与自测
- adaLN-Zero 如何注入条件?为什么 gate 初始化为 0?
- DiT 从 XS 到 XL,相对计算与生成质量大致如何变化?
- DiT 的 scaling 表现为什么优于 U-Net?
- 文本条件在 DiT 里怎么进?两种常见方式是什么?
- 为什么 Sora / Veo / FLUX 都转向 DiT 骨干?
14. 文生图与文生视频:架构演进与难点
学习路径
核心知识点详解
- 演进主线:骨干 U-Net → DiT、目标 DDPM → Rectified Flow、文本编码 CLIP → T5/多模态,文本对齐更强、细节更真、采样更快。
- SD 三层骨架:SD = CLIP 文本编码 + VAE 潜空间 + U-Net 去噪;SDXL 加大 U-Net + 双 CLIP;FLUX 用 DiT + Rectified Flow。
- 三者差异:SD 开源生态/消费级可跑;SDXL 分辨率细节提升;FLUX 高保真、强文本对齐、采样更快(可少步)。
- 常见坑:以为 FLUX 只有图像:FLUX 采用 DiT + 多模态文本编码器,是「骨干演进」的范本;理解它才能举一反三到视频 DiT 模型。
学习路径
核心知识点详解
- 三大难度:时空一致性(人物/物体跨帧不变形不闪)、物理合理性(重力/碰撞/遮挡)、时长与记忆(长镜头不漂移)。
- 失效技术映射:时空→3D VAE/时空注意力/参考锚定;物理→物理先验/世界模型预测/动作条件;长镜→关键帧+插帧/潜空间时序映射。
- 身份保持:多镜头角色一致用参考图/身份编码/种子锚定,是长视频可用的必要条件。
- 常见坑:忽略物理合理性评测:只看时序一致不测物理,会出现「连贯但穿模/违反重力」的假象——物理合理性要单独设评测项。
学习路径
- 读 14.2 表格:对比 Sora/Veo/Wan/可灵/HunyuanVideo
- 跑一个开源视频模型,观察其骨干与时长
- 完成 14.3 练习 3:对比 Sora 与 Wan 的时长/部署差异
- 对接 M11:选视频基座并记录其能力边界
核心知识点详解
- 主流模型对比:Sora(DiT 时空 patch,最长约 60s,强物理一致/镜头语言);Veo(原生多模态 DiT);Wan(开源 DiT 14B/1.3B,可本地部署);可灵(分钟级高保真人像);HunyuanVideo(开源 3D VAE + DiT,中英对齐好)。
- Sora vs Wan 差异:Sora 闭源、最长约 60s、强一致;Wan 开源(14B/1.3B)、数秒至十余秒、可本地部署与社区生态。
- 选型看时长与部署:要自部署/可控 → Wan/HunyuanVideo;要长时高一致 → 闭源 Sora/Veo/可灵;要中英对齐 → HunyuanVideo。
- 常见坑:拿时长当唯一指标:时长≠一致质量。选型要看你的目标场景「需要多长 + 能否自部署 + 物理/身份一致性」综合判断,不是越长越好。
学习路径
核心知识点详解
- 原生多模态共享骨干:同一个骨干既理解又生成(图像/视频/文本),支持「看图→生成一致视频」「理解视频→生成字幕与编辑」。
- 合流为何是世界模型方向:理解(该发生什么)+ 生成(看起来什么样)统一后,模型才能对世界做可交互的预测与生成——这正是世界模型。
- Gemini 3 / 各家 Omni 都在走:Gemini 3、各家的 Omni/世界模型都朝「理解与生成共享骨干」的合流点走(如 mixture-of-transformers)。
- 常见坑:把理解/生成割裂设计:仍按「LLM 调度 + 视觉模型执行」两套拼接时,跨模态交互浅;要触达视觉推理,需让理解与生成在骨干层贴近。
14.1 文生图架构演进:SD → SDXL → FLUX
| 模型 | 骨干 | 训练目标 | 特点 |
|---|---|---|---|
| Stable Diffusion | U-Net + VAE + CLIP | DDPM/ε | 开源生态、消费级可跑 |
| SDXL | 更大 U-Net + 双 CLIP | DDPM | 分辨率/细节提升 |
| FLUX | DiT + 多模态文本编码器 | Rectified Flow | 高保真、强文本对齐 |
演进主线:U-Net → DiT、DDPM → Rectified Flow、文本编码器从 CLIP 升级到 T5/多模态。结果是文本对齐更强、细节更真、采样更快。
14.2 文生视频:时空一致性、物理合理、时长
视频生成(Sora / Veo / Wan / 可灵)在图像生成之上叠加三个难度:① 时空一致性(人物/物体跨帧不变形、不闪);② 物理合理性(运动符合重力/碰撞/遮挡);③ 时长与记忆(长镜头不漂移)。
| 难点 | 表现 | 技术手段 |
|---|---|---|
| 时空一致性 | 换脸/闪烁/物体变形 | 3D VAE、时空注意力、参考锚定 |
| 物理合理 | 穿模、违反重力 | 物理先验、世界模型预测、动作条件 |
| 长镜头漂移 | 镜头一动环境就变 | 关键帧+插帧、潜空间时序映射 |
| 身份保持 | 多镜头角色不一致 | 参考图/身份编码、种子锚定 |
| 模型 | 骨干 | 上下文/时长 | 关键能力 |
|---|---|---|---|
| Sora | DiT + 时空 patch | 最长约 60s | 强物理一致、镜头语言 |
| Veo (Gemini) | 原生多模态 DiT | 数十秒级 | 与 Gemini 文本/图像打通 |
| Wan | 开源 DiT(14B/1.3B) | 数秒–十余秒 | 可本地部署、社区生态 |
| 可灵 (Kling) | 自研 DiT | 分钟级 | 高保真人像/动作 |
| HunyuanVideo | 开源 3D VAE + DiT | 数秒级 | 中文语义对齐好 |
14.3 动手练习与自测
- 文生图架构从 SD → SDXL → FLUX 的演进主线是什么(骨干 / 目标 / 文本编码器)?
- 文生视频在图像生成之上多了哪三个难度?
- Sora 与 Wan 在上下文 / 时长与部署方式上的差别是什么?
- 「统一理解与生成」的方向为什么重要?
- 身份保持与长镜头漂移各用什么手段缓解?
15. 多模态评测:测什么、局限在哪
学习路径
核心知识点详解
- 主流基准:MMBench(多选感知+推理,猜中率约 25%)、MMMU(大学级跨学科图文推理)、MMBench-Video(视频时序)、SEED-Bench/RealWorldQA(真实场景感知)。
- 基准偏感知需拆推理:多数基准偏感知(「图里有什么」),真正难的是推理(「为什么会发生」)。一个模型可能 MMBench 高分却在空间/因果推理崩,必须单独拆推理子集。
- 各基准局限:MMBench 多选可猜、区分度有限;MMMU 题难方差大、易污染;视频基准标注成本高、长视频覆盖有限。
- 常见坑:只看总分不看维度:MMBench 总分会被感知题拉高,掩盖推理/细粒度弱项。要按维度拆,别被整体分迷惑。
学习路径
核心知识点详解
- 感知 vs 推理:感知题考「图中有什么」(识别/OCR/计数),推理题考「为什么/下一步」(空间、因果、逻辑)——后者是能力真正分水岭。
- 多数基准偏感知:主流基准(SEED-Bench/RealWorldQA 等)偏感知、轻推理;整体分会被简单感知题拉高,需单独拆推理子集才能看真实推理力。
- 分维度评测:感知题与推理题分开算准确率并分别报告;推理维度弱项(空间/因果)要单列,否则被掩盖。
- 常见坑:拿感知总分当推理能力:模型可能感知高分、推理崩。评测报告必须感知/推理分别出分,否则上线复杂任务会意外失败。
学习路径
- 读 15.2:理解选择题偏差/污染/细粒度缺失
- 跑 hallucination_rate 分维度统计,忽略总分
- 完成 15.3 练习 2/3/4:写选择题偏差与自建价值
- 对接 M11:对含图表文档做单项评测并算幻觉率
核心知识点详解
- 选择题可策略性猜测:单选可被策略猜测抬高(猜中率约 25%);应辅以开放式 + 人工/LLM 评判,避免「靠猜得分」。
- 幻觉率要单测:幻觉率、OCR、空间关系这些弱项常不在总分内,必须单独统计(见 hallucination_rate)。
- 自建优于刷榜:用业务分布真实样本(文档/图表/监控帧)建私有评测,比刷公开榜更能反映真实可用性,且能溯源 + 污染检查。
- 常见坑:只用公开多选基准定上线:公开多选可猜、污染且偏感知,无法支撑上线决策。要自建含开放式与细粒度项的分维评测。
学习路径
- 读 15.2:理解按能力分桶 + 单独统计幻觉率
- 跑 evaluate_vlm 代码,输出四维 acc 与幻觉率
- 完成 15.3 练习 5:写 M11 多模态 RAG 相对纯文本 RAG 的优势
- 对接 M11:实现多模态索引并对比多模态 vs 纯文本 RAG
核心知识点详解
- 按能力分桶评测:
evaluate_vlm按维度分桶(OCR/计数/空间/图表)各报准确率并单独统计幻觉率;示例 ocr 0.72、count 0.55、chart 0.48、幻觉率 0.118。 - 幻觉率 >0.05 要警惕:幻觉率超过 0.05 就需警惕、业务要加外部校验;用
|claimed−present|/|claimed|计算。 - 多模态 RAG vs 纯文本 RAG:含图表文档上,多模态 RAG 把图表/版面的视觉信息纳入检索与回答;纯文本 RAG 在图表数值、结构关系上会丢失信息导致答错。
- 常见坑:计数/图表弱却不上心:计数与图表读数常是最大弱项(示例 chart 0.48)。针对弱项用更强 VLM 或外部 OCR/结构化抽取兜底。
15.1 主流基准测什么
| 基准 | 考什么 | 局限 |
|---|---|---|
| MMBench | 感知与推理的多选(含图表/ocr) | 多选可猜,区分度有限 |
| MMMU | 大学级跨学科图文推理 | 题难、方差大、易污染 |
| MMBench-Video | 视频时序与事件理解 | 标注成本高、长视频覆盖有限 |
| SEED-Bench / RealWorldQA | 真实场景感知 | 偏感知、轻推理 |
| 基准 | 题量(量级) | 题型 | 需注意 |
|---|---|---|---|
| MMBench (EN/CN) | ~3,000 多选 | 感知/推理混合 | 猜中率 ~25%,看细分维度 |
| MMMU | ~11,500 题 | 大学级跨学科 | 专家标注、方差大 |
| MMBench-Video | ~4,000 视频问答 | 时序/事件 | 长视频覆盖有限 |
| RealWorldQA | ~700 图 | 真实场景空间 | 偏感知、轻推理 |
15.2 评测的局限与自建
- 选择题偏差:单选可被策略性猜测抬高分数,应辅以开放式 + 人工/LLM 评判。
- 污染:公开基准同样面临训练数据泄露,需污染检查。
- 细粒度缺失:幻觉率、OCR 准确率、空间关系这些弱项常不在总分之内,要单测。
- 自建优先:用你业务分布的真实样本(文档、图表、监控帧)建私有评测,比刷公开榜更有意义——这也正是 Hamauls Orion M11「多模态理解与检索」要做的。
python# 自建多模态评测:按能力维度分桶,单独统计幻觉率
def evaluate_vlm(model, samples):
# samples: [{"img":..., "q":..., "gold":..., "dim":..., "claimed":[...], "present":[...]}]
from collections import defaultdict
acc, tot = defaultdict(int), defaultdict(int)
claimed_all, halluc_all = 0, 0
for s in samples:
pred = model.ask(s["img"], s["q"])
tot[s["dim"]] += 1
if normalize(pred) == normalize(s["gold"]):
acc[s["dim"]] += 1
claimed_all += len(s["claimed"])
halluc_all += len(set(s["claimed"]) - set(s["present"])) # 说了但图里没有
for dim in tot:
print(f"{dim}: acc={acc[dim]/tot[dim]:.2f} (n={tot[dim]})")
print("幻觉率:", round(halluc_all / max(1, claimed_all), 3))
# 预期输出(示意):
# ocr: acc=0.72 (n=40)
# count: acc=0.55 (n=30) <- 计数是大弱项
# spatial: acc=0.63 (n=30)
# chart: acc=0.48 (n=25) <- 图表读数最弱
# 幻觉率: 0.118 <- >0.05 需警惕, 业务需加外部校验
hamauls_orion/mm/vlm.py、ingest.py、多模态索引,正是把本节「理解 + 检索 + 成本」三件事落地。15.3 动手练习与自测
- 多数基准偏「感知」还是「推理」?为什么这会导致误导?
- 选择题型评测的偏差是什么?如何补足?
- 自建评测集相比刷公开榜的价值是什么?
- 幻觉率、OCR、空间关系这些弱项为什么常不在总分里?
- M11 的多模态 RAG 相比纯文本 RAG 在含图表文档上的优势来自哪里?
项目里程碑
Hamauls Orion 要看得懂你的文档和图片:接入视觉语言模型做版面理解与图表问答,把图像也纳入检索索引(图文统一向量空间),并处理多模态输入的 token 预算。
本阶段产出(直接进入项目仓库)hamauls_orion/mm/vlm.py:VLM 推理封装(图像/图表/表格问答),含图像预处理与分辨率预算hamauls_orion/mm/ingest.py:PDF / 扫描件 → 版面分析 → 段落 + 图表的统一结构化表示- 多模态索引:图像 embedding 入库,支持以文搜图与以图搜图
docs/exp/multimodal.md:纯文本 RAG vs 多模态 RAG 在含图表文档上的效果对比- 多模态输入的成本核算(图像 token 折算 + 显存峰值)
阶段练习项目
- 在 150 条自建样本上输出四维准确率(OCR / 计数 / 空间 / 图表)并给出每维的 bootstrap 置信区间
- 单独报幻觉率(
|claimed−present|/|claimed|),并判断是否超过 0.05 阈值 - 产出一份失效模式清单,按严重度排序可指导选型
- 样本按能力维度分桶(OCR / 计数 / 空间 / 图表),每桶样本量足够给稳定估计
- 用
normalize做答案规范化后严格比对准确率,避免格式误判 - 对每张图收集
claimed/present集合,算幻觉率并区分「文字密集 / 低分辨率 / 图表」子场景 - 统计对整体准确率但单独报告幻觉率,避免被总分掩盖弱项
- 用 bootstrap(≥1000 次重采样)给每维与幻觉率配置信区间
scripts/mm/eval_vlm.py+ 150 条标注数据集- 四维准确率 + 幻觉率分维评测报告
- 失效模式清单与「能否上业务」的选型结论
不做模型训练 / 微调;不做开放式任务的 LLM-judge 评判(只测可验证的细粒度与幻觉)。
- 两个版本都能从纯噪声生成可看图像,且在训练稳定性 / 损失曲线上可被解释
- 对比 DDIM 与 Flow Matching 在不同采样步数(如 1/4/8/20/50 步)下的生成质量与均值/std
- 给出「多几步能换来多少质量提升」的量化结论
ddpm.py:x_t=√ᾱ_t·x0+√(1−ᾱ_t)·ε加噪 + MSE 去噪目标,ᾱ_t累积正确flow.py:直线路径x_t=(1−t)x0+t·x1+ 常速目标v=x1−x0,用激励/欧拉采样- 两者都在 MNIST/小数据集上跑通并记录训练 / 采样步数对比
- 对 Flow Matching 分别用 1/4/8/20/50 步采样,看均值与 std 收敛(少步只看均值会欠方差)
- 对比 ε-pred 与 v-prediction 在不同噪声档的稳定性
scripts/mm/diffusion_{ddpm,flow}.py+ 训练脚本- 生成样本对比图与「步数 – 质量」曲线
- DDPM vs Flow Matching 的稳定性 / 步数报告
不训练大 DiT/潜空间扩散;只在像素小数据集上验证数学与数采集正确性。
- 生成 3 段 10 秒以上镜头并逐帧标注失效类型,统计各类型出现频率
- 量化一致性随时间(帧数)的变化,判断是否呈近似指数衰减
- 把观察到的失效映射到对应技术手段(3D VAE / 时空注意力 / 参考锚定等)
- 用开源视频模型生成至少 3 段 10 秒以上镜头,固定采样与 prompt 保证可复现
- 按时序一致性 / 物理合理性 / 长视频漂移 / 身份保持四类标注失效
- 统计每类失效随时间分布,判断是否逐帧累积 / 指数衰减
- 对比不同时长(如 ≤10s vs 60s+)的一致性差距,说明为何短视频好看 ≠ 可进生产
- 评估生成段 token 预算,量化「1 分钟视频贵 100×」的真实量级
- 标注脚本 + 失效分类数据集
- 技术分析报告(含时间-失效累积曲线)
- 失效→技术映射清单与可用性结论
不训练视频模型;不评估音画同步(身锚定或单测评)之外的生成质量维度。
- 能跑通「语音输入 → ASR → LLM 推理 → TTS 播放」的闭环,且离线 ASR 部分在浏览器本地运行
- 量化端到端轮次延迟(目标 < 1s)并拆解各环节(ASR / LLM / TTS 延迟预算)
- 用 WER/MOS(或近似)给出 ASR / TTS 质量基线
- 用
whisper-tiny/base的 ONNX 量化版在浏览器端做本地离线 ASR(CPU 可跑) - ASR → LLM API → 神经 TTS 组成级联回路,三段延迟分别计时
- 长音频分段 + 重叠窗口(如 30s/overlap 5s)避免截断与幻觉重复
- 用流水线并行 / 早启动把轮次延迟压向 < 1s,记录 P50/P99
- 测量 WER(ASR)与 MOS(TTS,可近似自评)并评估异步打断(barge-in)可行性
- 浏览器端 ASR 集成 + 语音回路 Demo
- 各环节延迟拆解与端到端 P50/P99 报告
- WER / MOS 质量报告与局限说明
不做端到端语音 LLM 训练;不实现真正语音打断的产品级实现(只做可行性评估)。
- 同一批含图表文档上,多模态 RAG 相对纯文本 RAG 的问答准确率显著更高(quantified)
- 以文搜图 / 以图搜图在自建图文对上召回可用(Top-k 命中率达标)
- 算清图片 token 折算 + 显存峰值,给出含图表文档的成本基准
mm/vlm.py:VLM/版面模型做 PDF 版面/图表问答,按图表 token 折算成本mm/ingest.py:PDF → 结构化段落 + 图表,提取单图 embedding- 多模态索引:图像 embedding 入库支持余弦检索,归一化后与文本索引混合
- 对比「纯文本 RAG」与「多模态 RAG」在同一含图表文档评测集上的准确率,给 bootstrap 置信区间
- 统计含图表文档的图片 token 数(按分辨率折算)与显存峰值,输出成本核算表
hamauls_orion/mm/{vlm,ingest}.py+ 多模态索引- 多模态 vs 纯文本 RAG 的准确率对比报告
- 图片 token 折算 / 显存 / 成本核算表(M11 交付物)
不训练多模态模型;不做视频索引;不做跨语言 / 讲义的模糊检索。
常见误区
- 不做分辨率与切图策略,导致视觉 token 爆炸,成本高到无法上线。
- 只看整体相似度评测,忽略幻觉率与细粒度感知,上线后频繁出错。
- 把图文对的网页数据直接用于训练,未做相关性过滤,模型学到大量噪声。
- 误以为 U-Net 仍是主流,不了解 DiT 的可扩展性与统一条件能力。
- 用「能生成好看短视频」判断视频模型可用性,忽略长镜头一致性与物理合理性。
- 把声音克隆能力当作纯技术问题,忽视授权与合规风险。
- 忽略多模态数据的许可与版权,训练数据来源不透明,为后续合规埋雷。
面试高频问题速答
VLM 的三种架构范式各有什么取舍?
投影式:视觉编码器 + 投影层 + LLM,实现简单、复用成熟 LLM、训练便宜,但跨模态交互浅,细粒度推理较弱。交叉注意力式:在 LLM 层间插入视觉交叉注意力,融合更深、对高分辨率细节更好,但结构改造复杂、训练与推理成本高。原生统一式:视觉与文本 token 在同一骨干做统一注意力,交互最深、可涌现视觉推理,但需要海量交错数据与算力。2026 年趋势指向原生统一。
为什么现代生成模型从 U-Net 转向 DiT?
两个原因:① 可扩展性——Transformer 能直接受益于缩放律,模型变大时生成质量持续提升,而 U-Net 的卷积归纳偏置在超大规模下收益有限;② 统一性——同一骨干可接受文本、图像、动作、相机轨迹等异构条件,从而支持视频生成、图像编辑与动作生成等统一下游,这是世界模型方向所必需的。
扩散模型和 Flow Matching 的关系?
两者都是「学一个从噪声到数据的变换」。扩散模型定义离散加噪步骤并学习去噪;Flow Matching 直接学习连续时间上的速度场,目标是把噪声点沿一条路径推到数据点。Flow Matching 训练更稳、采样步数更少、实现更简洁,因此在近两年的图像与视频模型中被广泛采用。它们在数学上可以视为同一家族的不同参数化。
视觉 token 为什么是成本关键?怎么优化?
视觉 token 数 ≈ (分辨率/切图尺寸)²。分辨率翻三倍,token 数涨九倍,而每个 token 都要过完整的注意力与 FFN,成本线性甚至更差地增长。优化手段:分辨率自适应(按任务需求降采样)、动态切图(只在需要看细节时切)、视觉 token 池化或重采样压缩、缓存重复图像、以及在路由层用小模型处理简单图像任务。
多模态模型最危险的失效模式是什么?怎么防?
视觉幻觉——描述图中不存在的内容,在医疗、金融、合规场景可能造成实际损害。防御:① 评测上单独统计幻觉率而不只报整体准确率;② 要求模型对不确定内容显式表达不确定或拒绝回答;③ 引入外部校验(OCR 引擎、结构化抽取后再比对);④ 高风险场景用人工复核;⑤ 训练数据里加入「否定的样本」以降低过度描述倾向。