深度生成模型:DDGM的原理、优化与应用
1. DDGM代码示例
以下是一个DDGM类的代码示例:
z = self.reparameterization(torch.tanh(mu_i),
log_var_i)
mu_x = self.decoder_net(z)
return mu_x
# For sanity check, we also can sample from the forward
# diffusion.
# The result should resemble a white noise.
def sample_diffusion(self, x):
zs = [self.reparameterization_gaussian_diffusion(x, 0)]
for i in range(1, self.T):
zs.append(self.reparameterization_gaussian_diffusion(
zs[-1], i))
return zs[-1]
运行完整代码后,训练DDGM可以得到如下结果:
- 随机选择的真实图像。
- 来自DDGM的无条件生成图像。
- 应用前向扩散后最后随机水平的可视化,结果图像类似于纯噪声。
- 一个ELBO的验证曲线示例。
2. DDGM的扩展与改进
目前,DDGM是非常流行的深度生成模型。原始的DDGM有许多有趣的改进和见解:
-
解析边缘化中间步骤
:由于前向扩散由高斯分布和均值的线性变换组成,可以解析地边缘化中间步骤,得到:
[q(z_t|x) = N(z_t|\sqrt{\bar{\alpha}
t}x, (1 - \bar{\alpha}_t)I)]
其中(\alpha_t = 1 - \beta_t),(\bar{\alpha}_t = \prod
{s=1}^{t} \alpha_s)。这意味着可以直接采样(z_t)而无需采样所有中间步骤。
-
计算条件分布
:可以计算如下分布:
[q(z_{t-1}|z_t, x) = N\left(z_{t-1}|\tilde{\mu}
t (z_t, x), \tilde{\beta}_tI\right)]
其中:
[\tilde{\mu}_t (z_t, x) = \frac{\sqrt{\bar{\alpha}
{t-1}}\beta_t}{1 - \bar{\alpha}
t}x + \frac{\sqrt{\alpha_t} (1 - \bar{\alpha}
{t-1})}{1 - \bar{\alpha}
t}z_t]
[\tilde{\beta}_t = \frac{1 - \bar{\alpha}
{t-1}}{1 - \bar{\alpha}
t}\beta_t]
然后,ELBO可以重写为:
[L(x; \theta, \varphi) = E_Q\left[KL [q(z_T |x)\parallel p(z_T )] + \sum
{t>1} KL [q(z_{t-1}|z_t, x)\parallel p_{\theta}(z_{t-1}|z_t)] - \log p_{\theta} (x | z_1)\right]]
现在,可以随机选择(L_t)作为目标,这样做的好处是不需要在内存中保留所有梯度,每次只更新一层。
-
改进反向扩散
:训练反向扩散可能会有问题,因为添加额外的潜在层会增加额外的KL项。为了使模型(p_{\theta} (z_{t-1} | z_t) = N\left(z_{t-1}|\mu_{\theta} (z_t), \sigma^2_tI\right))更强大,(\mu_{\theta} (z_t))应尽可能接近(\tilde{\mu}
t (z_t, x)),得到:
[\mu
{\theta} (z_t) = \frac{1}{\sqrt{\alpha_t}}\left(z_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}
t}}\epsilon
{\theta}(z_t)\right)]
其中(\epsilon_{\theta}(z_t))由DNN参数化,旨在估计(z_t)中的噪声。
-
简化目标函数
:每个(L_t)可以简化为:
[L_{t,simple} = E_{t,x_0,\epsilon}\left[\left|\epsilon - \epsilon_{\theta}\left(\sqrt{\bar{\alpha}_t}x_0 + \sqrt{1 - \bar{\alpha}_t}\epsilon, t\right)\right|^2\right]]
这种目标函数对训练和合成图像的最终质量有益。
3. 相关后续研究
有许多关于DDGM的后续研究,主要包括以下几个方面:
|研究方向|具体内容|
| ---- | ---- |
|改进DDGM|Nichol和Dhariwal通过学习反向扩散中的协方差矩阵、提出不同的噪声调度等方法,提高了DDGM的训练稳定性和性能。[76]的作者提出用傅里叶特征扩展可观测变量和潜在变量,以提高神经网络处理噪声的能力,并引入新的噪声调度和函数来提高前向扩散过程的数值稳定性。|
|采样加速|Kong和Ping以及Watson等人专注于加速采样过程。|
|超分辨率|Saharia等人将DDGM用于超分辨率任务。|
|与基于分数的生成模型的联系|基于分数的生成模型与DDGM密切相关,这种联系为DDGM和随机微分方程之间提供了简洁的关联。|
|DDGM的变分视角|存在一种变分视角可以直观地解释DDGM,并在图像合成任务中取得惊人的结果。|
|离散DDGM|目前DDGM主要关注连续空间,[79, 80]提出了离散空间的DDGM。|
|音频DDGM|Kong等人提出将DDGM用于音频合成。|
|作为VAE的先验|Vahdat等人和Wehenkel等人提出将DDGM作为VAE的灵活先验。|
4. DDGM、VAEs和Flows的比较
以下是DDGM、VAEs和Flows基于一些标准的比较:
|模型|训练稳定性|似然计算|重建能力|是否可逆|潜在表示维度|
| ---- | ---- | ---- | ---- | ---- | ---- |
|DDGMs|稳定|近似|困难|否|否|
|VAEs|稳定|近似|容易|否|可能|
|Flows|稳定|精确|容易|是|否|
这三种模型有很多相似之处。总体而言,训练相对稳定,但所有模型都可能出现数值问题。分层VAEs可以看作是DDGM的推广。研究这些模型之间的联系是一个有趣的研究方向。
mermaid图如下:
graph LR
A[DDGM] --> B[改进与扩展]
B --> B1[解析边缘化]
B --> B2[条件分布计算]
B --> B3[反向扩散改进]
B --> B4[目标函数简化]
A --> C[后续研究]
C --> C1[改进DDGM]
C --> C2[采样加速]
C --> C3[超分辨率]
C --> C4[与分数模型联系]
C --> C5[变分视角]
C --> C6[离散DDGM]
C --> C7[音频DDGM]
C --> C8[VAE先验]
A --> D[与VAEs和Flows比较]
深度生成模型:DDGM的原理、优化与应用
5. DDGM训练流程解析
DDGM的训练过程可以通过以下流程图来展示:
graph TD
A[输入数据x] --> B[前向扩散]
B --> C[计算q(zt|x)和q(zt - 1|zt, x)]
C --> D[随机选择Lt作为目标]
D --> E[更新模型参数]
E --> F[反向扩散训练]
F --> G[生成图像]
具体的训练步骤如下:
1.
输入数据
:将原始数据 (x) 输入到模型中。
2.
前向扩散
:通过一系列的高斯分布和线性变换,将数据 (x) 逐步转化为噪声 (z_T)。在这个过程中,可以利用解析边缘化的结果 (q(z_t|x) = N(z_t|\sqrt{\bar{\alpha}
t}x, (1 - \bar{\alpha}_t)I)) 直接采样 (z_t),而无需采样所有中间步骤。
3.
计算条件分布
:计算 (q(z
{t-1}|z_t, x)),并将ELBO重写为 (L(x; \theta, \varphi) = E_Q\left[KL [q(z_T |x)\parallel p(z_T )] + \sum_{t>1} KL [q(z_{t-1}|z_t, x)\parallel p_{\theta}(z_{t-1}|z_t)] - \log p_{\theta} (x | z_1)\right])。
4.
选择目标函数
:随机选择 (L_t) 作为目标,这样可以避免在内存中保留所有梯度,每次只更新一层。
5.
更新模型参数
:使用随机梯度下降等优化算法更新模型的参数 (\theta) 和 (\varphi)。
6.
反向扩散训练
:在反向扩散过程中,为了使模型 (p_{\theta} (z_{t-1} | z_t) = N\left(z_{t-1}|\mu_{\theta} (z_t), \sigma^2_tI\right)) 更强大,需要让 (\mu_{\theta} (z_t)) 尽可能接近 (\tilde{\mu}
t (z_t, x)),即 (\mu
{\theta} (z_t) = \frac{1}{\sqrt{\alpha_t}}\left(z_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}
t}}\epsilon
{\theta}(z_t)\right))。
7.
生成图像
:经过训练后,模型可以从噪声中反向生成图像。
6. 不同模型在实际应用中的选择
在实际应用中,选择合适的生成模型至关重要。以下是根据不同需求对DDGM、VAEs和Flows的选择建议:
|应用需求|适用模型|原因|
| ---- | ---- | ---- |
|对生成图像质量要求高,不追求精确似然计算|DDGM|可以生成高质量的图像,虽然似然计算是近似的,但在图像合成等任务中表现出色。|
|需要进行图像重建,且希望有潜在表示的维度压缩|VAEs|重建能力容易实现,并且可以实现潜在表示的维度压缩,适用于需要提取特征的任务。|
|需要精确的似然计算和可逆操作|Flows|能够精确计算似然,并且具有可逆性,适用于需要进行精确概率估计的任务。|
7. DDGM代码实现细节补充
在前面给出的DDGM类代码示例基础上,我们可以进一步补充一些实现细节。以下是一个更完整的代码示例:
import torch
class DDGM:
def __init__(self, T, decoder_net):
self.T = T
self.decoder_net = decoder_net
def reparameterization(self, mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * std
def reparameterization_gaussian_diffusion(self, z, i):
# 这里需要根据具体的扩散过程实现
pass
def forward(self, mu_i, log_var_i):
z = self.reparameterization(torch.tanh(mu_i), log_var_i)
mu_x = self.decoder_net(z)
return mu_x
def sample_diffusion(self, x):
zs = [self.reparameterization_gaussian_diffusion(x, 0)]
for i in range(1, self.T):
zs.append(self.reparameterization_gaussian_diffusion(zs[-1], i))
return zs[-1]
# 示例使用
# 假设 decoder_net 是一个已经定义好的解码器网络
decoder_net = torch.nn.Sequential(
torch.nn.Linear(100, 256),
torch.nn.ReLU(),
torch.nn.Linear(256, 784),
torch.nn.Sigmoid()
)
ddgm = DDGM(T=100, decoder_net=decoder_net)
mu_i = torch.randn(1, 100)
log_var_i = torch.randn(1, 100)
output = ddgm.forward(mu_i, log_var_i)
print(output.shape)
在这个代码示例中,我们定义了一个
DDGM
类,包含了重参数化、前向传播和扩散采样等方法。同时,我们还给出了一个简单的使用示例,展示了如何使用这个类进行前向传播。
8. 总结
DDGM作为一种流行的深度生成模型,具有许多独特的优势。通过解析边缘化、改进反向扩散、简化目标函数等方法,DDGM在图像合成等任务中取得了很好的效果。同时,相关的后续研究也在不断拓展DDGM的应用范围,如加速采样、超分辨率等。与VAEs和Flows相比,DDGM在训练稳定性、似然计算、重建能力等方面有其自身的特点。在实际应用中,需要根据具体的需求选择合适的模型。通过对DDGM训练流程的解析和代码实现细节的补充,我们可以更好地理解和应用这一模型。
超级会员免费看
2126

被折叠的 条评论
为什么被折叠?



