1. Stable Diffusion是什么?
想象你有一杯清水,滴入一滴墨水。墨水会慢慢扩散,直到整杯水变成均匀的灰色——这就是**扩散(Diffusion)**的直观例子。Stable Diffusion的核心思想,正是模拟这种“从有序到无序”的扩散过程,再神奇地让它“倒放”,从而从噪声中生成清晰的图像。
1.1 生成模型的“魔法”
Stable Diffusion属于生成模型,和GAN、VAE一样,它能凭空创造出图片、文字甚至音乐。但它的独特之处在于:
- 不需要对抗训练:相比GAN中生成器和判别器的“左右互搏”,Stable Diffusion只需训练一个神经网络,稳定性更高。
- 分步操作:像画画先打草稿再细化,它通过多次“去噪”逐步完善图像,细节更丰富。
提示:你可以把Stable Diffusion想象成一个“逆向PS工具”——不是给图片加滤镜,而是从一团马赛克中还原出真实画面。
1.2 扩散与复原:颜料与水
用生活场景类比:
- 前向扩散(加噪):就像把一幅画浸入水中,颜料逐渐晕开,最终变成一片混沌。
- 反向去噪(复原):通过观察颜料的扩散规律,逆向推算出最初的画作。
关键突破在于:科学家发现,只要用神经网络学会预测“颜料扩散的路径”,就能让这个过程可逆。这就是Stable Diffusion的“灵魂”——UNet噪声预测器。
2. 前向扩散:如何把图片变成噪声?
2.1 马尔可夫链的“小步快跑”
前向扩散的核心是马尔可夫链——每次加噪只依赖当前状态,与过去无关。就像蒙眼走路,每一步只根据脚下调整方向。
数学表达为:
# 伪代码:第t步加噪 noise = randn_like(image) # 随机噪声 image = sqrt(1 - β_t) * image + sqrt(β_t) * noise其中β_t是预设的噪声计划(从0.0001到0.02线性增长),控制每一步的“破坏力度”。
2.2 一步到位的“跳步技巧”
如果逐帧加噪太慢,可以直接从原图X₀跳到第t步:
# 利用αₜ=1-βₜ的累积乘积 cumulative_α = prod(α[:t]) noised_image = sqrt(cumulative_α) * X₀ + sqrt(1 - cumulative_α) * noise当t足够大时,cumulative_α≈0,图片彻底变成随机噪声。
注意:这种“跳步”能加速训练,但实际去噪仍需一步步来,就像视频倒放必须逐帧处理。
3. 反向去噪:AI如何“脑补”图像?
3.1 UNet的噪声预测课
反向过程的核心是一个UNet网络,它的任务是:
- 输入:带噪图片
Xₜ和时间步t - 输出:预测噪声
Z̃(即“颜料扩散的方向”)
训练时,通过最小化预测噪声与实际噪声的差距:
loss = ||UNet(Xₜ, t) - true_noise||²3.2 贝叶斯推导:如何“倒推”上一步?
已知Xₜ求Xₜ₋₁,本质是求解条件概率q(Xₜ₋₁|Xₜ)。通过贝叶斯公式和重参数化技巧,最终得到:
# 去噪单步公式 predicted_X₀ = (Xₜ - sqrt(1 - αₜ) * Z̃) / sqrt(αₜ) Xₜ₋₁ = sqrt(αₜ⁻¹) * (Xₜ - (1 - αₜ)/sqrt(1 - αₜ) * Z̃) + sqrt(βₜ) * randn()其中αₜ⁻¹是αₜ的倒数,βₜ为噪声方差。
为什么不能一步到位?
因为UNet预测的噪声Z̃存在误差,小步迭代能逐步修正,就像用橡皮擦一点点修改草图。
4. 实战中的技巧与优化
4.1 噪声计划(Noise Schedule)
βₜ的取值影响生成质量:
- 线性增长:简单但可能导致后期去噪困难
- 余弦调度:让
βₜ在中期增长更快,更符合自然图像特征
4.2 采样加速:DDIM与PLMS
原始DDPM需要1000步迭代,优化方法如:
- DDIM:通过非马尔可夫链跳步采样,50步即可出图
- PLMS:用多项式拟合噪声路径,减少计算量
4.3 条件控制:文本到图像
通过CLIP模型将文字描述编码为向量,作为UNet的额外输入:
# 文本提示引导生成 text_embedding = CLIP("一只戴墨镜的猫") noise = UNet(Xₜ, t, text_embedding)5. 为什么Stable Diffusion如此强大?
- 物理启发的数学之美:扩散理论源自热力学,数学框架严谨。
- 渐进式生成:相比GAN的“一步到位”,分步修正能处理复杂细节。
- 开源生态:模型权重和训练代码公开,社区贡献了无数插件(如ControlNet)。
我在实际测试中发现,调整CFG Scale(条件控制强度)和采样步数对效果影响极大。例如生成人像时,步数太少会导致面部模糊,而过高可能引入伪影。