AI 绘画中的扩散模型是近年来在计算机视觉和图像生成领域中获得关注的一种深度学习方法。这种模型特别擅长于生成高质量的图像,包括艺术作品和逼真的照片样式的图像。扩散模型的关键思想是通过一个渐进的、可逆的过程将数据(在这个场景中是图像)从有序状态转换到无序状态,然后再逆转这个过程来生成新的数据。
https://readpaper.com/pdf-annotate/note?pdfId=4557071478495911937¬eId=1833652073759793152
在上图中,您可以看到扩散模型中加噪过程的可视化表示。这个序列展示了一个清晰、结构化的图像如何逐渐变得更加嘈杂和失真,直到最终变成完全的噪声。
1.初始状态:从原始数据 ( x_0 )(例如一张清晰图像)开始。
2.逐步加噪:在每个时间步 ( t ),按照预定义的噪声计划向数据添加噪声,这通常是通过应用高斯噪声来实现的。
x
t
=
α
t
x
t
?
1
+
1
?
α
t
?
x_t = \sqrt{\alpha_t} x_{t-1} + \sqrt{1 - \alpha_t} \epsilon
xt?=αt??xt?1?+1?αt???
x
t
x_t
xt? 表示第t步加噪后的数据。
α
t
\alpha_t
αt?是时间步 t 处的噪声水平系数,控制噪声的加入量。
x
t
?
1
x_{t-1}
xt?1?是前一步的数据。
?
\epsilon
?是从标准正态分布中采样的随机噪声。
3.最终状态:经过多个时间步后,数据变为纯噪声 x T x_T xT?
## 假设您已有一个图像张量 x_0(比如从图像文件中加载并转换为张量),下面是如何实现加噪过程的示例代码:
import torch
def add_noise(x, t, beta_min, beta_max):
"""
加噪过程
:param x: 原始图像张量
:param t: 当前时间步
:param beta_min: 噪声增加的最小系数
:param beta_max: 噪声增加的最大系数
:return: 加噪后的图像
"""
# 计算噪声比例 alpha
N = 1000 # 假设扩散步骤总数
beta_t = beta_min + (t / N) * (beta_max - beta_min)
alpha_t = 1 - beta_t
# 计算加噪后的图像
noise = torch.randn_like(x)
x_t = torch.sqrt(alpha_t) * x + torch.sqrt(1 - alpha_t) * noise
return x_t
# 示例:假设原始图像 x_0 是一个 PyTorch 张量
x_0 = torch.randn(1, 3, 256, 256) # 一个示例图像张量,大小为 256x256,3通道
# 对图像进行加噪
t = 500 # 当前时间步,比如 500
x_t = add_noise(x_0, t, beta_min=0.1, beta_max=0.2) # 应用加噪函数
在这组图像中,您可以看到 AI 图像生成中去噪过程的可视化表示。这个序列展示了一个噪声多、结构不清的图像如何逐渐变得更加清晰和定义,直到最终转变成一个连贯且可识别的场景或对象。
在去噪过程中,一个关键的步骤是根据当前的噪声状态和模型的预测来恢复数据的原始状态。数学上,这可以表示为:
x t ? 1 = 1 α t ( x t ? 1 ? α t 1 ? α ˉ t ? θ ( x t , t ) ) x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right) xt?1?=αt??1?(xt??1?αˉt??1?αt???θ?(xt?,t))
(
x
t
?
1
)
( x_{t-1} )
(xt?1?) 是上一时间步的重建状态。
(
x
t
)
( x_t )
(xt?) 是当前时间步的状态。
(
α
t
)
( \alpha_t )
(αt?) 和
(
α
ˉ
t
)
( \bar{\alpha}_t )
(αˉt?) 是与时间步相关的噪声级别参数。
(
?
θ
(
x
t
,
t
)
)
( \epsilon_\theta(x_t, t) )
(?θ?(xt?,t))是由模型参数为
(
θ
)
( \theta )
(θ)预测的噪声。
去噪过程是一个非常精细和复杂的操作,涉及到大量的迭代和反向传播,以确保重建的数据尽可能接近原始数据。在实际应用中,这需要大量的数据和计算资源。
import torch
import torch.nn as nn
class DenoisingModel(nn.Module):
def __init__(self):
super(DenoisingModel, self).__init__()
# 定义 UNet 或其他适合的模型结构
# 例如: self.unet = UNet()
def forward(self, x, t):
# x 是带噪声的图像,t 是时间步信息
# 返回去噪后的图像
# 例如: return self.unet(x, t)
# 示例: 假设 x_T 是最后的噪声状态图像张量
x_T = torch.randn(1, 3, 256, 256) # 一个示例噪声图像张量
# 初始化模型和优化器
model = DenoisingModel()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 假设的去噪过程
for t in reversed(range(0, 1000)): # 假设1000个时间步
optimizer.zero_grad()
# 生成模型的输入(需要自己定义如何融合时间步信息)
model_input = torch.cat([x_T, get_timestep_embedding(t)], dim=1)
# 执行去噪
x_pred = model(model_input, t)
# 定义损失函数(需要自己定义适合的损失函数)
loss = compute_loss(x_pred, x_T)
# 反向传播和优化
loss.backward()
optimizer.step()
区别点 | 扩散模型 | GAN |
---|---|---|
工作机制 | 基于逆过程逐步还原真实数据分布 | 包含生成器与判别器的对抗框架 |
训练方式 | 最大化似然估计 | 最小化判别器损失,最大化生成器损失 |
生成样本质量 | 质量较高,接近真实分布 | 质量参差不齐,易产生模式崩溃 |
训练稳定性 | 训练较为稳定 | 训练难度较大,需要精心设计 |
优势 | 样本质量好,训练稳定 | 可以学习更复杂分布 |
劣势 | 学习能力较弱 | 样本质量不稳定,训练困难 |
扩散模型在图像生成方面的应用包括但不限于: