扩散模型与多模态:AI 如何生成图像、看懂图文音

中等 🟡AI 学习
5 个标签
预计阅读时间:17 分钟
扩散模型Stable Diffusion多模态CLIP文生图

扩散模型与多模态:AI 如何生成图像、看懂图文音

如果说大语言模型解决的是"AI 如何理解和生成文字",那么扩散模型和多模态技术解决的就是"AI 如何理解和生成图像、声音,以及如何把这些不同形式的信息统一起来处理"。从 Stable Diffusion、Midjourney 生成的惊艳插画,到 GPT-4V、Gemini 这类"能看图会说话"的模型,背后都离不开这两块拼图。本文用尽量少的数学、尽量多的类比,把这两个知识点讲透。

🎨 文生图:扩散模型的去噪魔法

一个反直觉的核心思想

扩散模型(Diffusion Model)解决"如何生成一张图片"的思路非常特别:它不是让模型直接"画"出一张图,而是让模型学会"从一堆噪点中,一步步把图片还原出来"。

类比一下:想象你有一张清晰的照片,你把它放进"搅拌机",每搅拌一次就往里面加一点点随机噪声。搅拌几百次之后,这张照片彻底变成了一团看不出任何内容的雪花噪点。这个"不断加噪声、直到变成纯噪点"的过程,就是扩散模型的前向过程(Forward Process)——它本身并不需要学习,只是一个数学上定义好的加噪规则。

真正需要"学习"的是反向过程(Reverse Process):训练一个神经网络(通常是 U-Net 或近年的 Transformer 结构),让它学会做一件事——"给定一张加了噪声的图片,猜一猜这一步到底加了多少噪声,然后把这部分噪声减掉"。如果模型每一步都能准确地"去掉一点点噪声",那么从纯噪点开始,反复调用这个模型几十次,就能一步步"雕刻"出一张清晰的图像。

为什么这个看似绕远路的方法反而好用

直接训练一个模型"从随机噪声一步到位生成图片"是非常困难的——这相当于要求模型一次性解决所有问题(构图、纹理、光影、细节)。而扩散模型把这个超难的任务拆解成了几十上百个"微小的去噪"小任务,每一步只需要做一件很简单的事:判断当前图里的噪声长什么样,然后去掉一点点。这就像雕塑家不是一凿子把石像刻出来,而是通过成百上千次精细的小动作逐渐显露出雕像的轮廓。每一小步的难度都很低,模型很容易学好,但把这些小步骤累积起来,就能完成极其复杂的生成任务。这也是为什么扩散模型生成的图像质量普遍优于早期的 GAN(生成对抗网络)——它用"步步为营"换来了"步步精细"。

文本如何指挥去噪的方向

只会"去噪声"还不够,我们还需要让模型按照文字描述(比如"一只戴墨镜的柯基在沙滩上冲浪")生成对应内容,这就是文本条件引导(Text-to-Image Conditioning)

做法大致是:先用一个文本编码器(例如 CLIP 的文本塔,或者 T5 这类语言模型)把提示词变成一组向量,这组向量在每一步去噪时都会"喂"给去噪网络,相当于在模型耳边不断提醒"记住,你要还原的是柯基冲浪的画面,不是别的"。技术上常用交叉注意力(Cross-Attention)机制来实现这种"提醒":图像的中间特征去"查询"文本向量,把与文字最相关的图像区域强化、不相关的区域弱化。这样一来,同样的去噪起点(一团随机噪声),配上不同的文字提示,就能雕刻出完全不同的画面。

Stable Diffusion 与 Midjourney 的技术脉络

DDPM(2020):奠定了"加噪—去噪"扩散模型的数学基础,但直接在像素空间上操作,计算量极大,生成一张图要上千步。
Stable Diffusion(2022,Stability AI / CompVis):关键创新是潜在扩散(Latent Diffusion)——不在像素空间做扩散,而是先用一个自编码器(VAE)把图片压缩成一个小得多的"潜在空间"表示,扩散过程在这个小空间里进行,最后再用 VAE 解码回像素图。这让计算量大幅下降,使得普通显卡也能跑文生图,是 Stable Diffusion 能开源普及的核心原因。
Midjourney:技术细节没有完全公开,但公开信息与效果表现显示其同样基于扩散模型路线,重点投入在美学训练数据筛选、精细化的提示理解和多阶段放大(upscaling)流程上,因此风格更具"艺术感"。
后续演进:从 U-Net 骨干逐渐转向 Diffusion Transformer(DiT,如 Stable Diffusion 3、Sora 的图像/视频生成部分采用的架构),并搭配一致性模型、蒸馏等技术把原本需要几十步的采样压缩到几步甚至一步,大幅提速。

简化版扩散去噪流程

下面用伪代码勾勒一次"文生图"推理的核心步骤,帮助建立直观印象(不追求数学严谨):

pythonCode
# 简化版:Stable Diffusion 式文生图推理流程

def text_to_image(prompt, num_steps=30):
    # 1. 把文字提示编码成向量,作为去噪过程的"导航仪"
    text_embedding = text_encoder.encode(prompt)

    # 2. 在潜在空间里生成一个纯随机噪声,作为起点
    latent = random_noise(shape=(4, 64, 64))

    # 3. 反复调用去噪网络,一步步减少噪声
    for step in reversed(range(num_steps)):
        noise_level = schedule[step]          # 当前这一步理论上的噪声强度
        predicted_noise = denoise_unet(
            latent,
            timestep=step,
            condition=text_embedding           # 交叉注意力:让文字指挥去噪方向
        )
        # 用预测出的噪声,把 latent 往"更干净"的方向推进一点
        latent = remove_noise(latent, predicted_noise, noise_level)

    # 4. 把去噪完成的潜在表示,用解码器还原成像素图片
    image = vae_decoder.decode(latent)
    return image

整个过程可以理解为一条"流水线":文字 → 向量导航仪 → 一团噪声 → 循环去噪(每步都参考导航仪)→ 干净的潜在图 → 解码成真实像素图片。步数越多,去噪越精细,但也越耗时,这也是为什么现在很多产品都在研究"少步甚至一步生成"的加速技术。

无分类器引导:让生成结果更"听话"

实际的文生图系统里还有一个常用小技巧,叫无分类器引导(Classifier-Free Guidance,CFG)。做法是:每一步去噪时,模型分别预测"有文字提示"和"没有文字提示(空提示)"两种情况下的噪声,然后把两者的差值放大后叠加回去,公式大致是:

textCode
最终预测噪声 = 无条件预测噪声 + CFG强度 × (有条件预测噪声 - 无条件预测噪声)

CFG 强度调得越高,生成结果就越贴合文字描述,但过高会让画面显得生硬、失真;调得太低则画面自由发挥、可能偏离提示词。这也是为什么很多文生图工具会暴露一个"提示词相关度""引导系数"之类的滑杆参数,本质上调的就是这个 CFG 值。

扩散模型 vs GAN:两种生成范式的对比

在扩散模型流行之前,图像生成的主流是 GAN(生成对抗网络,Generative Adversarial Network):训练一个"生成器"造假图,一个"判别器"辨真假,两者对抗着共同进步。两种范式各有取舍:

训练稳定性:GAN 的对抗训练容易出现"模式坍塌"(生成器只会画几种很像的图)、训练不稳定;扩散模型的训练目标是"预测噪声"这样一个简单的回归问题,收敛更稳定。
生成质量与多样性:扩散模型在细节丰富度和多样性上通常更有优势,较少出现 GAN 常见的重复纹理、伪影问题。
生成速度:这是扩散模型的短板——GAN 通常一次前向传播就能出图,扩散模型需要几十步迭代,因此实际产品里都在做"减少步数"的优化(如一致性模型、渐进式蒸馏)。

从图像到视频:扩散模型的自然延伸

理解了"给图片加噪去噪"之后,"给视频生成"的思路也就不难理解了——可以把视频看作"多帧图像 + 时间维度",扩散模型只需要在时间轴上增加一层注意力(Temporal Attention),让模型在去噪时不仅参考同一帧内的空间信息,还参考前后帧的连贯性,从而保证生成的视频画面连贯、不闪烁。Sora 等文生视频模型正是把这一思路和 Diffusion Transformer 结合,将视频也切成时空patch 一起处理。

🖼️ 多模态:AI 同时看懂图文音

图片也能变成"token"

大语言模型的世界里,一切输入最终都被切成一串 token(词元),再变成向量交给 Transformer 处理。多模态模型的第一个关键突破,就是让图片也能被切成"token",从而复用同一套 Transformer 架构。

具体做法是图像分块(Patch Embedding):把一张图片(比如 224×224 像素)切成一个个小方块(例如 16×16 像素一块),这样一张图就变成了几百个小图块,就像把一段文字切成一个个字词。每个小图块经过一个视觉编码器(通常是 ViT,Vision Transformer)压缩成一个向量,这个向量的形式和文本 token 的向量在维度上是一致的。于是,"一张图片"就被转换成了"一串图像 token",可以和文字 token 拼在一起,喂给同一个 Transformer 去处理。这就是"图片也是一种语言"这个说法的技术来源——只是图像的"词汇"不再是汉字或字母,而是一个个视觉图块的抽象表示。

视觉编码器如何与语言模型对接

光把图片切成 token 还不够,还得让语言模型"看懂"这些视觉 token 到底代表什么语义,这里有两条主流技术路线:

路线一:CLIP 式图文对比学习。 CLIP(Contrastive Language-Image Pre-training)的训练方式很巧妙:拿海量的"图片—文字描述"配对数据(例如网络上的图片和它的 alt 文本),训练两个编码器——一个专门编码图片,一个专门编码文字——让匹配的图文对在向量空间里的距离尽可能近,不匹配的图文对距离尽可能远。类比一下,这就像训练两个不同语言的翻译官,让他们各自把内容翻译成同一种"通用语言"(向量空间),只要说的是同一件事,翻译出来的向量就应该几乎重合。训练完成后,CLIP 的图像编码器就具备了"用语言能理解的方式描述图片内容"的能力,可以直接被复用到下游任务中。

路线二:Vision Encoder + Projection Layer 接入 LLM。 这是目前多模态大模型(如 LLaVA 系列思路)常用的架构:

1.用一个预训练好的视觉编码器(常直接用 CLIP 的图像塔)把图片转换成一组视觉特征向量;
2.用一个轻量的投影层(Projection Layer,通常只是一两层全连接网络),把视觉特征向量"翻译"成语言模型能够理解的向量空间和维度;
3.把这些"翻译"过的视觉 token,和文字 prompt 的 token 拼接在一起,一并输入给语言模型(LLM);
4.LLM 本身不需要重新训练全部参数,只需要通过指令微调,学会在同一个输入序列里同时处理"图像 token"和"文字 token",就能根据两者的融合信息生成回答。

可以把这个架构理解为:"一位精通视觉的翻译官(视觉编码器)先把图片内容翻译成一份摘要,一个小小的适配器(投影层)把这份摘要转换成语言模型习惯的措辞,然后交给语言模型(大脑),大脑结合这份视觉摘要和用户的文字提问,给出综合回答"。

用伪代码大致表示这个流程:

pythonCode
# 简化版:多模态大模型"看图说话"推理流程

def multimodal_chat(image, question):
    # 1. 图像分块并编码:图片 -> 一串视觉特征向量
    patches = split_into_patches(image, patch_size=16)
    visual_features = vision_encoder(patches)      # 类似 CLIP 的图像塔

    # 2. 投影层:把视觉向量翻译成语言模型的"词向量空间"
    visual_tokens = projection_layer(visual_features)

    # 3. 文本 token 化
    text_tokens = tokenizer.encode(question)

    # 4. 拼接视觉 token 与文本 token,一起喂给语言模型
    input_tokens = concat(visual_tokens, text_tokens)
    answer = llm.generate(input_tokens)

    return answer

"看图说话""听声辨意"是怎么实现的

有了上面的架构,"看图说话"(Image Captioning / Visual Question Answering)就顺理成章了:模型把图像 token 和"请描述这张图片"这句文字 token 拼在一起,语言模型部分依然按照训练好的语言建模能力,一个词一个词地生成回答——只不过它在生成每个词时,注意力机制可以同时参考图像 token 和已经生成的文字,从而做到"依据图片内容组织语言"。这也解释了为什么这类模型能做更复杂的任务,比如"图里这个红色按钮在哪个位置""这张财报截图里营收同比涨了多少"——本质上都是"文字 token + 视觉 token 联合注意力"的应用。

音频模态走的是类似思路:一段语音先经过特征提取(例如梅尔频谱图 Mel-Spectrogram),把连续的声音信号切分成一个个时间片段,每个片段编码成一个向量,这一步和"图像切 patch"在思想上完全一致——都是把连续、非离散的原始信号,转换成一串离散的、语言模型能处理的"音频 token"。之后同样通过一个投影层对接到语言模型,模型就能"听懂"语音内容,结合文字指令做语音识别、语音问答,甚至在语音助手场景里做到"听声辨意"——不仅识别出说了什么字,还能感知语气、情绪等副语言信息。

概括来说,多模态大模型能"通吃"图文音的关键,就在于所有模态最终都被转换成统一形式的向量 token 序列,再交给同一个 Transformer 主干去做注意力计算——差异只在于"前端"用什么样的编码器(图像用 ViT / CLIP,音频用频谱编码器,文本用普通的词表 embedding),"后端"的语言模型主干可以是完全共享的。

音频的离散化:从连续波形到"音频词表"

进一步看,近年的语音大模型(如一些端到端语音助手)会把音频编码得更彻底——用 EnCodec、SoundStream 这类神经音频编解码器,把连续的声音波形压缩成一串离散的音频编码(Discrete Audio Tokens),效果上很像给声音也建了一个"词表"。这样一来,音频 token 不仅能像文本 token 一样被语言模型"预测下一个",甚至可以直接复用语言模型训练时用的自回归目标(预测下一个 token),使模型既能"听懂"语音,也能"说出"语音,实现真正意义上的语音到语音直接对话,而不需要"语音转文字 → 文字处理 → 文字转语音"这样绕一圈的传统流水线。

多模态与扩散模型的交汇

值得一提的是,文生图和多模态理解这两条技术线正在相互靠拢:一方面,像 DALL·E 3 这样的文生图系统会先用一个语言模型把用户简短的提示词"扩写"成更详细、更准确的描述,再交给扩散模型去生成,本质上是"多模态理解能力反哺生成质量";另一方面,GPT-4o 等原生多模态模型开始尝试让同一个模型同时具备理解和生成图像的能力,图像既是输入 token,也可以作为输出 token 被模型直接"生成"出来,图像生成和语言生成在模型内部逐渐统一到同一套 token 预测框架下。这提示了一个趋势:未来"理解"和"生成"可能不再是两套独立系统,而是同一个多模态大模型的一体两面。

实际应用一览

| 能力 | 依赖技术 | 典型场景 |

| --- | --- | --- |

| 文生图 | 扩散模型 + 文本条件引导 | Stable Diffusion、Midjourney 插画创作 |

| 图生图 / 局部重绘 | 扩散模型 + 部分加噪 | 电商图修图、AI 换装 |

| 看图问答 | Vision Encoder + Projection Layer + LLM | 拍照识题、截图问答 |

| 图文检索 | CLIP 对比学习 | 以文搜图、以图搜图 |

| 语音助手 | 音频编码 + 多模态 LLM | 实时语音对话、会议纪要 |

| 文生视频 | 扩散模型 + 时序注意力 | Sora 类视频生成 |

❓ 常见误区澄清

误区一:"扩散模型就是给图片加滤镜去噪"。 实际上扩散模型的"去噪"只是训练时的一种数学手段,真正的目的是让模型学会"从任意随机噪声出发,生成符合训练数据分布的全新图像",而不是修复某张已有的、被污染的照片(虽然它确实也能做图像修复类任务)。

误区二:"多模态模型是把图像识别模型和语言模型简单拼接"。 单纯拼接两个独立训练的模型很难让它们"理解"彼此,关键在于通过对比学习(CLIP)或投影层 + 联合指令微调,让视觉特征真正对齐到语言模型能理解的语义空间,这一步"对齐"训练才是多模态能力的核心难点。

误区三:"步数越多,图片一定越好"。 去噪步数增加确实能让细节更精细,但超过一定步数后收益迅速递减,反而会显著拖慢生成速度,实际产品中往往会结合加速采样算法,在少量步数(如 20~30 步甚至更少)内就达到接近收敛的效果。

✨ 小结

扩散模型解决的是"如何从无到有生成高质量内容":通过"加噪—去噪"的迂回路径,把一个困难的生成任务拆解成大量简单的小步骤,再靠文本条件引导,让生成过程听从文字指挥。多模态技术解决的是"如何让 AI 同时理解不同形式的信息":核心思路是把图像、音频这些连续信号都转换成和文本 token 形式统一的向量序列,再借助对比学习(如 CLIP)或投影层,把不同模态的"语言"对齐、接入同一个大脑(LLM)。这两条技术路线共同支撑起了今天"文生图""看图说话""语音交互"等丰富的 AI 应用场景,也是理解 Stable Diffusion、GPT-4V、Gemini 这类系统工作原理的两把钥匙。