结合comfyui的基础工作流讲解扩散模型原理:
训练前准备数据集,就是先加噪
对一张真实图像(如猫的照片)逐步添加高斯噪声,经过多步(如1000步)后,图像变成纯随机噪声。
这个过程是固定的数学过程(无需模型参与),目的是生成带标签的训练数据。
训练就是去噪
开始训练前,由于原图越大计算量越复杂,因此要把图像压缩小,就叫VAE编码(VAE是Variational Autoencoder),缩小的结果叫Latent Space(潜在空间),比如比如将高维数据(如512×512图像)压缩为低维潜在表示(如64×64的Latent)。
开始训练,模型的任务是预测如何从第t步的噪声图中去除噪声,使其更接近原始图像。
训练时,模型会看到“第t步的噪声图”并尝试预测,然后损失函数通过比较模型预测的噪声图像与真实的噪声图像,计算损失(如均方误差),并反向传播更新模型权重。这个学出来的模型权重就是数据的概率分布(例如,每个像素可能的颜色值),而非直接生成确定的图像(可以想象64×64的Latent中每个元素都是某种颜色的概率值)。
训练完成后,保存的模型权重就是checkpoint(如 sd-v1.5.ckpt)。
推理就是用这个模型权重生成新图像,首先,你给模型一张充满马赛克的纸,并输入你这张纸的尺寸,ComfyUI的Empty Latent Image节点会用VAE编码把它压缩成个充满噪声的Latent Space,传给一个叫采样器的函数,采样器从模型权重(Latent大小的颜色概率)中随机抽取一个样本(样本就是数学的概率论里讲的一个随机试验中,所有结果中的一个,采样器随便抽了一个),抽取时它会考虑你输入的提示词,确保抽到的“图片”符合你的提示词,然后采样器输出这个latent样本。此时VAE又来了,VAE的解码器将这个小latent,解码为像素图像(尺寸就是你给的马赛克纸的大小,如 512×512)。
所以,扩散最终就是让模型学会“任意步数t下,如何从噪声中恢复数据”。
我们再来总结下扩散模型的运行过程:
(1) 训练阶段
输入:原始图像(如一张猫的照片)。
步骤:
VAE 编码器 将图像压缩为 Latent(64×64×4)。相比直接在像素空间操作,Latent Space 的计算量更小,且能捕捉数据的本质特征(如形状、风格)。
扩散模型在 Latent Space 中学习如何逐步去噪(前向扩散 + 反向训练)。
训练目标:让模型学会从噪声 Latent 恢复原始 Latent(而非直接处理像素)。
(2) 生成阶段(推理)
输入:随机噪声(64×64×4 的 Latent)。
步骤:
扩散模型(U-Net) 在 Latent Space 中迭代去噪,生成干净的 Latent。
VAE 解码器 将最终 Latent 解码为像素图像(如 512×512×3)。