文生图的底层流程可以概括为:一个经过海量数据训练的模型,理解你的文字描述,然后从一个纯粹的随机噪声开始,一步步“去噪”,最终“雕刻”出一幅符合描述的、逼真或风格化的图像。
有的读者朋友有点不理解,一团随机噪声,为什么扩散模型可以一步一步的去除噪声,从而生成逼真的图片呢?按理说,噪声是完全随机的,扩散模型怎么可以知道哪里的噪声应该去掉呢?
简单来说,答案的核心是:模型并不是“知道”噪声在哪里然后去掉,而是在学习“预测”被添加进去的噪声本身。 它是在一步步地将“随机噪声图”往“更像真实图片”的方向引导。
我们来拆解这个过程。
扩散模型并不是一种通用的“去噪器”,随便给它一张满是噪点的照片就能还原。它的能力建立在非常特殊的训练之上。
想象一下,我们如何教一个学生修复被破坏的古画:
我们有一幅完好的古画(真实图片)。
1、我们往上面泼一次墨水(添加一点点高斯噪声),得到图A1。 然后告诉学生:“这是原画被泼一次墨水的样子,你要学会从A1恢复成原画。”
2、我们在A1上再泼一次墨水,得到图A2。 然后问学生:“看,这是泼了两次的样子,你能从A2恢复成A1吗?”
3、如此重复,泼上几百上千次墨水, 直到最后这幅画完全变成一潭黑水(纯随机噪声),完全看不出原样。
4、在每一步“泼墨水”时,我们都精确地记录了“这次泼的墨水量和泼在了哪里”(也就是添加的噪声)。
扩散模型的训练目标,不是让模型直接学会从“一潭黑水”一步跳到“古画”,而是学会一个更简单、可拆解的任务: 给定一张“泼了t次墨水”的画,让它预测出第t次泼上去的那层墨水长什么样。
当训练完成后,我们给模型一潭纯粹的“黑水”(完全是随机噪声)。这相当于假设这幅画已经被泼了最多次数(比如1000次)的墨水。
现在,奇迹般的“去噪”过程开始了,它完全是训练过程的倒放:
1、第1000步: 输入是纯噪声。模型预测:“如果这是从一张稍微清晰点的画泼墨而来,那第1000次泼的墨应该长这样。”
2、去除预测的噪声: 我们把预测出的这层“墨水”从纯噪声中减去。这样,我们就得到了一幅稍微不那么像黑水、依稀有了点结构的图像(相当于第999步的状态)。
3、第999步: 把上一步得到的图像再次输入模型。模型预测:“要从第999步变到第998步,需要去掉的噪声是这些。”
4、循环往复: 如此重复成百上千次,每一步只负责逆转“一次泼墨”的微小破坏。每一步的“去噪”任务都非常简单、具体,只对应当前的噪声水平。
最终,我们从一片混沌,一步步退回到一幅清晰的图像。
所以,回到上面的问题:扩散模型怎么可以知道哪里的噪声应该去掉呢?
它知道的不是“噪声的绝对位置”,而是“在从更清晰图像到更模糊图像的这条特定退化路径上,我应该逆向迈出哪一小步”。
噪声并非完全随机:对模型来说,纯随机噪声就像被压缩到极限的数据。它虽看似混乱,但在模型眼中,蕴含着所有可能图像结构的“种子”。模型的每一步,都是在解读这个“种子”,把它朝一个明确的方向解压缩一点。
方向由全局一致性决定:模型去噪时,遵循一个总原则:“我要让这张图整体变得更像一只猫(如果种子对应猫)”。因此,它不会在一个区域减噪声让那里像猫毛,在另一个区域加噪声让那里像车轮。它学习到了图像的全局一致性,会协调所有像素的修改,共同塑造一个合理整体。
概率分布的高原漫步:想象两片高地,一片叫“纯噪声”,一片叫“真实图像”,中间由长坡连接。扩散模型就像在这长坡上,从“纯噪声”高原出发,每一步都朝着“真实图像”那个高原的方向,小心翼翼地往下走一步,最终抵达目的地。
简言之,扩散模型生成逼真图片,靠的不是魔法般的“看清”噪声,而是学会了逆向行走一条它自己亲手铺就的、从清晰到混沌的千步长阶。 每一步都只解决一个微小问题,积跬步以至千里。
不能直接还原,除非运气爆棚。
你提的这个场景,等于是在问扩散模型有没有“读心术”。答案是否定的,原因刚好能进一步解释它的工作原理。
扩散模型去噪的每一步,都必须回答同一个问题:“根据当前这张图,我是往哪个方向的真实图像走的?”
这个问题要能回答,需要一个关键前提:当前这张图,必须是某张真实图像被逐步加噪后的产物。
你随便生成的一团随机噪声,几乎肯定不在任何真实图像的“退化路径”上。它不是一张被泼了墨水的猫图,也不是被泼了墨水的风景图。对模型来说,这是一个它从未在训练中见过的、不合法的状态。
把它扔给模型,就像突然把一个地球物理学家丢到一个物理定律完全不同的星球上,然后问他哪边是北。他的知识和导航经验会瞬间失效。
虽然模型无法处理,但程序总会输出一个结果。这个结果,可以理解为模型在强行将输入“解释”为它所学分布中的一个点。
它的思考过程类似: “我收到一团噪声,我只能假设它是从我的图片库里某张图被完全破坏而来的。虽然它不符合任何一张,但程序必须跑,那我就找个跟我最像的种子吧。”
所以最终生成的,大概率是它在训练中见过最多的、最平均的图像。可能是模糊的人脸、难以辨认的物体,甚至是某种诡异的纹理——绝不是你指定的那只猫。
这就像压缩文件和解压密码的关系:
扩散模型的生成过程:相当于把一张图片用特定算法“压缩”成看似随机的噪声(加密),而模型多步去噪的过程,就是用对应的“解压密钥”一步步解压。
你的那团随机噪声:是一个完全随机的乱码文件,根本不是用这个算法压缩出来的。你硬要用解压软件去打开它,软件会报错,或者输出一团无意义的乱码。
你唯一能通过一团随机噪声得到一只逼真猫的方法是:你恰好“猜中”了某个猫图对应的噪声种子。
但这概率,相当于你把一本小说翻译成一种你自创的密码,然后随便翻一页密码本,就希望它恰好对应原著中某个完整的章节。这在实际中是不可能的。
这个特性,恰恰是扩散模型生成内容多样性的来源——你随便给的纯噪声,就是一个“随机种子”,它会生成独一无二的猫,但绝不是你心里想的那只。