生成模型学习笔记——DDPM、DDIM、VAE、ControlNet

目录

1、DDPM

2、DDIM

3、VAE(Variational AutoEncoder)

4、ControlNet


1、DDPM

2、DDIM

3、VAE(Variational AutoEncoder)

图像生成发展起源:从VAE、VQ-VAE、扩散模型DDPM、DETR到ViT、Swin transformer-CSDN博客

重参数化技巧:

        重参数化技巧的核心思想是将随机变量的采样过程转化为一个确定性过程。具体来说,如果我们假设 q(z|x) 是一个高斯分布,可以表示为:

z=\mu +\sigma \epsilon

  • 确定性部分\mu\sigma是由模型预测出的参数,这些参数可以通过反向传播来更新。
  • 随机性部分\epsilon \sim N(0,1)是独立于输入 x 的随机噪声,它提供了必要的随机性,使得模型可以学习更加复杂的潜在表示。

如果直接预测 z,则在随机采样的过程中,模型无法获得参数信息,因为 z 的采样是一个离散不可微的过程,导致梯度不会通过 z 传播。重参数化技巧可以保证我们从进行采样,同时又能保留梯度信息。

Stable Diffusion和GAN的对比:

        Stable Diffusion是一种基于随机微分方程的生成方法,通过逐步增加噪声来扰动原始图像,直到完全随机化。然后通过逐步减少噪声来恢复图像,同时使用一个神经网络来预测下一步的噪声分布。Stable Diffusion的优点是可以在连续的潜在空间中生成高质量的图像,而不需要对抗训练或GAN的损失函数。缺点是需要较长的采样时间和较大的模型容量。Stable Diffusion更适合需要高质量和连续性的图像生成任务。

        GAN是一种基于对抗训练的生成方法,它由一个生成器和一个判别器组成。生成器从一个随机向量中生成图像,判别器从真实数据和生成数据中区分真假。GAN的优点是可以在离散的像素空间中快速生成图像,而且可以通过不同的损失函数和正则化方法来改善生成质量和多样性。缺点是训练过程可能不稳定,导致模式崩溃或低质量的输出。而且GAN需要仔细调整超参数和损失函数来达到好的效果,这可能很耗时和困难。GAN更适合需要快速和多样性的图像生成任务。

总结如下:
Stable Diffusion:
①训练过程稳定;
②可以生成高质量、高分辨率的图像;
​​​​​​​③从给定均值和方差的随机噪声中采样,生成图像的多样性较好;
③适用于图像修复、去噪等任务。
④缺点:生成速度相对较慢,对计算资源的要求较高;

GAN:
①能生成高质量的图像,保真度较好;
②在某些任务上(如图像到图像翻译)表现优秀;
③缺点:训练过程可能不稳定,生成的图像多样性不足。

DDPM和VAE的区别:

①DDPM的编码器(前向扩散过程)是固定的,而VAE的编码器是可学习的;
②DDPM的扩散过程中输入维度是不变的,而VAE编码得到的bottleneck特征比输入维度小很多;
③DDPM需要经过很多步才能得到中间特征(高斯噪声),因此存在time embedding,而且多个Unet网络是共享参数的,VAE则不存在这一点。

4、ControlNet

论文:https://arxiv.org/abs/2302.05543

代码:GitHub - lllyasviel/ControlNet: Let us control diffusion models!

解读:万字长文解读Stable Diffusion的核心插件—ControlNet_stable diffusion controlnet-CSDN博客

        ControlNet在大型预训练扩散模型(Stable Diffusion)的基础上实现了更多的输入条件,如边缘映射、分割映射和关键点等图片加上文字作为Prompt生成新的图片,同时也是stable-diffusion-webui的重要插件。ControlNet因为使用了冻结参数的Stable Diffusion和零卷积,使得即使使用个人电脑在小的数据集上fine-tuning效果也不会下降,从而实现了以端到端方式学习特定任务的条件目的。

创新点:

1、使用Stable Diffusion并冻结其参数,同时copy一份SDEncoder的副本,这个副本的参数是可训练的。这样做的好处有两个:

  • 制作这样的副本而不是直接训练原始权重的目的是为了避免在数据集很小时的过拟合,同时保持了从数十亿张图像中学习到的大模型质量。
  • 由于原始的权值被锁定了,所以不需要对原始的编码器进行梯度计算来进行训练。这可以加快训练速度;因为不用计算原始模型上参数的梯度,所以节省了GPU内存。

2、零卷积 :即初始权重和bias都是零的卷积。在副本中每层增加一个零卷积与原始网络的对应层相连。在第一步训练中,神经网络块的可训练副本和锁定副本的所有输入和输出都是一致的,就好像ControlNet不存在一样。换句话说,在任何优化之前,ControlNet都不会对深度神经特征造成任何影响,任何进一步的优化都会使模型性能提升,并且训练速度很快。

网络结构:

        使用Stable Diffusion作为backbone,编码器和解码器都包含12个Blocks,完整模型包含25个Blocks。在25个Blocks中,8 个Blocks是下采样或上采样卷积层,而其他17个Blocks是主块,每个Block包含 4 个resnet和2个ViT。每个 ViT 都包含多个交叉注意力和自注意力。例如在(a)中,SD编码器Block A包含4个resnet和2个ViT,“×3”表示该Block重复3次。文本Prompt使用CLIP文本进行编码,扩散时间步长使用位置编码的时间编码器进行编码。 

        ControlNet结构作用于UNet的每个Encoder Block(b)。使用ControlNet创建12个Encoder Blocks和1个Stable Diffusion Middle Block的可训练副本。12个Encoder Blocks有4种分辨率(64×64、32×32、16×16、8×8),每一个ControlNet Block复制3次。输出加入到Unet的12个跳跃连接和1个Middle Block。由于稳定扩散是典型的Unet结构,因此这种 ControlNet 架构也可能适用于其他模型。

训练时参数调整:

only_mid_control:默认为False,设置为True时,将训练以下结构。

当计算能力有限并想要加快训练速度时,或者想要促进“全局”上下文学习时,这会很有帮助。

sd_locked:默认为True,设置为False时,将训练以下结构。

        这将解锁SD中的某些层,对它们进行整体训练。如果数据集不够好,可能会降低SD模型的性能。但是当使用具有某些特定风格的图像,或者使用特殊数据集进行训练时(例如包含X射线的医疗数据集或包含大量Google地图的地理数据集),此选项也非常有用。可以将其理解为同时训练ControlNet和类似DreamBooth的东西。此外,如果解锁一些原始层,可能需要比较低的学习率,例如 2e-6。

突然收敛现象与梯度累计:

        因为ControlNet使用了零卷积,所以SD始终能够预测有意义的图像。在某些迭代中,模型“突然”能够适应某些训练条件,如上图所示,在大约3k到7k步时获得一个基本可用的模型(继续训练将对其进行改进,但第一次“突然收敛”后的模型基本可以正常工作)。

        3k到7k步的跨度并不是很大,此时应该考虑更大的batch size而不是更多的training steps。如果可以在batch size=4的情况下观察到3k步的“突然收敛”,那么与其使用300k步进行训练,不如使用100×梯度累积重新训练100×batch size的3k步。由于“突然收敛”总是会在某个点发生,因此获得更好的收敛更为重要。

        因为“突然收敛”总是会发生,假设发生在3k步,而现有的资源可以优化90k步,那么现在有两个选择:

  1. 训练 3k 步,突然收敛,然后继续训练87k步。
  2. 30x梯度积累(30xbatch size),训练3k步(实际计算90k步),然后突然收敛。

在作者的实验中,方案二通常比方案一更好。然而,在实际情况下,也许可能需要自己平衡“突然收敛”前后的步骤来找到平衡,“突然收敛”后的训练也很重要。

        但通常情况下,如果batch size已经大于256,那么进一步扩大就没有什么意义了。在这种情况下,更好的想法是训练更多步骤。作者尝试了一些“常见”的batch size:64、96、128等(通过梯度累积),似乎已经可以很好地解决许多复杂的情况了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值