我最早以为,文生图就是模型把文字“翻译”成一张图片,就像把中文翻译成英文一样。后来我发现,这个想法错得离谱——模型并不是在“翻译”,而是在“生成”一段连续的视觉信息,而且这个生成过程,更像是在一堆噪声里慢慢地“抠”出一张图,而不是从零开始画画。

这个认知转折发生在我第一次用 Stable Diffusion 生成“一只猫坐在月球上”的时候。出来的图,猫的耳朵轮廓很清晰,但月球表面坑坑洼洼的纹理其实是一堆像素的随机组合,只不过恰好符合了我对“月球”的预期。那一刻我突然意识到,模型根本不知道猫是什么、月球是什么,它只是学到了“猫”和“月球”这两个词在像素空间中对应着什么样的统计分布。
那么,这种从文字到像素的映射到底是怎么建立起来的?我们一步一步拆开看。
文字不是“指令”,而是“导航坐标”
整个文生图的核心,可以分成两个独立但紧密配合的模块:一个精通图像统计的“画家”,和一个能读懂文字并把它转化成这个画家能理解的坐标系的“翻译官”。在 Stable Diffusion 里,这个“画家”叫做潜在扩散模型(Latent Diffusion Model),而“翻译官”就是CLIP 文本编码器。
CLIP 是 OpenAI 在 2021 年提出的模型,它用 4 亿个图文对训练,学会了把文字和图片映射到同一个向量空间里CLIP 论文。简单说,如果一张图片和一段文字描述的是同一个东西,它们在那个空间里的坐标就非常接近。文生图用到的就是 CLIP 的文本编码器部分:输入一段文字,输出一个固定长度的向量,这个向量就代表了文字在“图像语义空间”里的位置。
这个向量,就是后续生成过程的导航坐标。它不会命令模型“画一只猫”,而是告诉模型:“你要生成的图片,最终在 CLIP 空间里离‘猫’这个词的坐标很近”。模型的任务就是找到一张图片,让它在这个空间里的位置和文字坐标尽可能重合。
潜在扩散模型:在“压缩包”里画画
说完理解,我们来看生成。扩散模型的核心思想其实很反直觉:先学会把一张清晰的图片慢慢变成纯噪声,再反过来,从一个随机噪声开始,一步一步“去噪”,最后变回一张清晰的图片。训练过程就是让模型学会“如何逆转噪声”。
最早提出这个思路的是 DDPM(去噪扩散概率模型),但直接在 512×512 像素空间里做去噪,计算量巨大。Stable Diffusion 的巧妙之处在于,它不在像素空间里操作,而是先把图像压缩到一个低维度的潜在空间(latent space),在这个“压缩包”里做扩散,最后再解压回像素Stable Diffusion 论文。这个压缩和解压的过程靠的是变分自编码器(VAE):编码器把图像压缩成 64×64×4 的潜在表示,解码器再把它还原成 512×512 的图片。在潜在空间里做扩散,计算量直接降了一个数量级,这就是它能在消费级显卡上跑的原因。
训练扩散模型时,给一张真实图片,先通过 VAE 编码成潜在表示,然后逐步加入噪声,让模型预测每一步应该去掉多少噪声。实际上,模型预测的是噪声本身,因为只要知道噪声,就能从当前带噪声的潜在表示中减去它,得到更清晰的版本。这个预测过程需要条件——也就是文字向量。所以模型接收的输入是:当前的带噪潜在表示 + 文字向量,输出是对应噪声的预测。
文字是怎么“控制”去噪方向的?
这里面有一个关键机制:交叉注意力(cross-attention)。UNet 是扩散模型的主体网络,它由多个下采样和上采样块组成,每个块里都插入了交叉注意力层。文字向量通过交叉注意力,告诉 UNet 在每一个去噪步骤中,该重点关注哪些空间区域。
举个例子,当文字是“一只猫坐在月球上”时,交叉注意力会让模型在生成过程中,对那些与“猫”相关的潜在特征区域(比如形状、纹理)更敏感,同时对“月球”相关的区域施加不同的约束。这就像有一个教练在旁边不停地说:“注意,这里应该是毛茸茸的,那边应该是坑坑洼洼的。”
但光有文字引导还不够。在实际推理时,Stable Diffusion 还用了无分类器引导(Classifier-Free Guidance, CFG)。原理很简单:同时生成两个去噪路径,一个接收文字条件,一个接收空条件(无文字),然后取两者的差值,按一个比例(CFG scale)加到文字条件的结果上。这个操作相当于把生成的图像往文字方向“推”得更狠,让图像和文字描述更匹配CFG 论文。
CFG scale 越高,图像越符合文字描述,但也会带来副作用:色彩过饱和、细节丢失,甚至出现奇怪的伪影。我最早用 Stable Diffusion 时,总喜欢把 CFG scale 拉到 15 以上,以为越“忠实”越好,结果生成的人脸像塑料一样,后来才明白,CFG 本质上是在逼模型走极端,适度就好,过高就会破坏图像的自然分布。
完整链路:从文字到图片的一次生成
现在我们把整个链路串起来,假设输入是“一只穿宇航服的柴犬,浮在太空,背景是星云,4k 高清”:
- 文本编码:CLIP 文本编码器把这段文字转换成一个向量,维度是 768(SD 1.x)或 1024(SDXL)。
- 初始化噪声:在潜在空间里随机采样一个 64×64×4 的噪声张量,这是“画布”的初始状态。
- 迭代去噪:UNet 收到这个噪声张量和文字向量,预测当前步骤应该去掉的噪声,然后减去它。这个过程重复 20~50 次(取决于采样步数),每一步都让潜在表示更接近一张“清晰”的图像。
- VAE 解码:最终得到的潜在表示通过 VAE 解码器,上采样还原成 512×512×3 的像素图片。
整个过程,模型没有“画”任何一笔,它只是在不停地修正一个数学张量,直到这个张量在 VAE 的解码规则下,恰好映射出一张符合文字描述的图片。
你以为的“创造力”,其实是“统计惯性”
很多人第一次用文生图都会被惊艳到,觉得模型有“想象力”。但如果你深究它的工作机制,你会发现它做的其实是一件非常机械的事:在训练数据中学到了一个巨大的条件概率分布,然后在推理时从这个分布里采样。它之所以能生成从来没见过的“柴犬宇航员”,不是因为它在创造,而是因为训练数据里有“柴犬”“宇航服”“太空”这些概念的组合片段,扩散模型把它们拼在了一起。
这解释了为什么文生图在生成人手、文字、复杂结构时经常翻车。因为这些元素在训练数据中的分布极度不均匀,或者本身就缺乏清晰的统计规律。人手在图片中的姿态千变万化,模型很难学到稳定的“五根手指”的几何约束,所以经常多出几根手指或者手指揉成一团。文字也是一样:图片里的文字和像素没有固定的对应关系,模型只会学到一堆抽象的笔画轮廓,生成出来的“文字”只能看个大概,不能读。
几个我踩过的坑
负向提示词为什么这么重要?
很多人用 Stable Diffusion 时会填一堆负向提示词,比如“丑陋、畸形、低质量”,这其实是在手动调整 CFG 的引导方向。因为 CFG 会同时考虑正向和反向的推拉,负向提示词告诉模型:“远离这些概念在 CLIP 空间里的坐标”。但它的作用不是万能的,如果负向词太多,会过度约束采样路径,反而让图像变得平淡。我现在的习惯是只保留关键的几个,比如“低质量,模糊”就够了。
采样步数越多越好吗?
不是。扩散模型每步都假设噪声服从一个特定的分布,步数太少会导致噪声预测不准确,图像模糊;步数太多,一方面浪费计算,另一方面也会因为数值误差累积导致细节丢失。通常 20~30 步就已经足够收敛,再多步数提升微乎其微。我测试过 50 步和 100 步的同一张图,几乎看不出区别,但时间翻了一倍。
为什么 SD 1.5 和 SDXL 的“手”还是容易崩?
这和 VAE 的解码能力有关。潜在空间在压缩时会丢失高频细节,尤其是手指这样的小尺度结构。SDXL 的 VAE 比 SD 1.5 大了不少,手部问题已经有明显改善,但依然不是 100% 可靠。这本质上是统计学习固有的局限,除非加入结构化的先验(比如手部骨骼模型),否则很难根治。
一张表说清不同文生图方案的核心区别
| 模型 | 文本编码 | 生成空间 | 引导方式 | 关键特点 |
|---|---|---|---|---|
| DALL·E 2 | CLIP(非公开) | 像素空间扩散(或潜在) | CLIP + CFG | 先验网络生成 CLIP 图像嵌入,再解码 |
| Stable Diffusion 1.5 | CLIP ViT-L/14 | 潜在空间扩散 | 交叉注意力 + CFG | 开源,社区生态丰富,VAE 固定 |
| SDXL | 两个 CLIP 模型(OpenCLIP) | 潜在空间扩散(更大) | 交叉注意力 + CFG | 改善手部、文字,增加条件注入 |
| Midjourney v6 | 自研(未公开) | 可能为潜在扩散 | 未知,可能包含复杂引导 | 高度风格化,审美优化,闭源 |
FAQ:一些你可能在纠结的问题
文生图真的“理解”空间关系吗?
不完全。它理解的是统计上的共现关系。比如“猫坐在椅子上”,训练数据中猫和椅子的像素往往以某种上下关系出现,所以模型能生成出大致合理的空间布局。但如果你说“猫在椅子下面,椅子在猫上面”,模型可能还是会生成猫坐在椅子上,因为这种反常识的样本在数据里太少。它的空间理解是一种统计近似,不是几何推理。
为什么有时同一句提示词,两次生成的图像完全不同?
因为初始噪声是随机的。扩散模型从随机噪声出发,每一步采样都带有随机性,所以最终结果会发散。这就是为什么文生图需要“种子”来控制可复现性。
能用中文提示词吗?
取决于文本编码器。Stable Diffusion 的 CLIP 模型是用英文图文对训练的,对中文几乎不识别,只能靠英文。但有些社区模型额外训练了中文文本编码器,就可以支持中文。不过效果通常不如英文,因为训练数据量远小于英文。
文生图离“设计工具”还有多远?
目前它更像一个“灵感生成器”,而不是可精确控制的设计工具。你无法精确指定某个物体的位置、大小、颜色,只能通过提示词碰运气。ControlNet 这类技术的出现,让控制力有了巨大提升,但距离全参数的精确操控还有很长一段路。在我看来,文生图真正的价值不是替代设计师,而是把脑子里模糊的想法快速可视化,作为一个起点。
最后,我想说,文生图不是魔法,它只是把语言和图像之间的统计桥梁搭建得足够结实。理解它的工作原理,不是为了崇拜它,而是为了更好地使用它、避开它的盲区,并在它“翻车”时,知道该敲打哪个部分。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/41.html