本文正在参加「金石计划 . 分割6万现金大奖」


分散模型是一种生成模型,在曩昔的几年里忽然火了起来,这其间也是有必定原因的。

单看2020前后的几篇开创性的文章咱们就能够知道分散模型的功能了,比方在图画生成方面打败了GANs。最近,研究人员想必也都看到了OpenAI上个月发布的图画生成模型DALL-E 2中也是用到了分散模型。

Pytorch中如何使用扩散模型? 机器学习扩散模型简介

DALL-E 2运用同一个caption生成的不同的图片

鉴于最近分散模型的热度越来越高,许多机器学习从业者必定也想知道其内部原理,那今天这个文章,咱们将带大家一起研究分散模型的理论基础,然后演示如安在PyTorch中运用分散模型生成图画。

让咱们开端吧!!!

分散模型简介

分散模型是生成模型,这意味着分散模型能够生成和练习集相似的数据。从根本上讲的话,分散模型做的是经过接连增加高斯噪声破坏练习数据,然后反向的噪声处理,也便是经过消除噪声,学习如何去重建数据。练习之后,咱们只需求为其输入简略的随机采样的噪声,经过分散模型学习到的去噪进程,就能够生成数据了。

Pytorch中如何使用扩散模型? 机器学习扩散模型简介
Diffusion Models can be used to generate images from noise

具体来讲,一个分散模型是一个潜变量模型,是运用固定的马尔科夫链映射到潜在空间。该马尔科夫链逐步向数据增加噪声,去获得近似的后验散布q(x1:T∣x0)q(\mathbf x_{1:T} | \mathbf x_0),其间x1…xTx_1 \dots x_T都是和x0x_0同纬度的潜变量。在下图中咱们能够明晰地看到这条马尔科夫链是怎样在图画上工作的。

Pytorch中如何使用扩散模型? 机器学习扩散模型简介

终究,图画会被近似转化为纯高斯噪声,练习一个分散模型的 意图是学习 反向降噪进程,比方练习p(xt−1∣xt)p_\theta(x_{t-1}|x_t),反向经过这条链路,咱们能够获得新的数据。

Pytorch中如何使用扩散模型? 机器学习扩散模型简介

分散模型有何长处

和前边说到的一样,近几年分散模型开展如火如荼。遭到非平衡热力学的启示,分散模型现在获得了SOTA的图画质量,下边咱们就能够看几个比方:

Pytorch中如何使用扩散模型? 机器学习扩散模型简介

除了能生成高质量的图片之外,分散模型还有一些其他的长处,比方 不需求对立练习。我说对立练习难搞可不是空口无凭,所以如果存在非对立性的练习能获得差不多的作用和练习功率,最好仍是选择非对立性的办法。就练习功率来说,分散模型还具有可伸缩性和并行性的额定优点。

我说对立练习难搞可不是空口无凭,这句话能够参考GAN,由于GAN模型练习比较困难。

另外补充两个单词:

  • cutting-edge 抢先的,前沿的
  • well-documented 依据充分的,作恶多端

尽管分散模型看起来如同成果都是随便发生的,但其实是有许多慎重而有趣的数学选择和细节为这些成果提供了基础。并且在文献中不断涌现出更多好的作用,那接下来咱们就看一下支撑分散模型的数学原理。

深入研究分散模型

前边现已提到过了,一个分散模型是有两部分组成的:

  • 前向进程,或许称之为分散进程,在该进程中一个数据被逐步噪声化。
  • 反向进程,或称为反向分散进程,在这个进程中噪声从方针散布中逐步转换回样本的姿态。

当噪声水平足够低时,正向进程中的采样链转化能够设置为条件高斯。如果将这一特性和马尔可夫假定结合起来,就得到了正向进程的简略参数化:

q(x1:T∣x0):=∏t=1Tq(xt∣xt−1):=∏t=1TN(xt;1−txt−1,tI)q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right):=\prod_{t=1}^T q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right):=\prod_{t=1}^T \mathcal{N}\left(\mathbf{x}_t ; \sqrt{1-\beta_t} \mathbf{x}_{t-1}, \beta_t \mathbf{I}\right)

其间1…T\beta_1 \dots \beta_T是变量表,能够是固定值也能够是可学习参数。如果体现杰出,那当TT足够大的时候,xTx_T是近似于各向同性的高斯散布的。

Pytorch中如何使用扩散模型? 机器学习扩散模型简介

Given the Markov assumption, the joint distribution of the latent variables is the product of the Gaussian conditional chain transitions

分散模型的神奇之处在于其反向进程,在练习进程中学习如何逆置湖=分散进程,然后与生成新的数据。从纯高斯噪声p(xT):=N(xT,0,I)p(\mathbf{x} T):=\mathcal{N}(\mathbf{x} T, \mathbf{0}, \mathbf{I})开端,模型经过下面的公式去学习联合散布p(x0:T)p \theta(\mathbf{x} 0: T)

p(x0:T):=p(xT)∏t=1Tp(xt−1∣xt):=p(xT)∏t=1TN(xt−1;(xt,t),(xt,t))p_\theta\left(\mathbf{x}_{0: T}\right):=p\left(\mathbf{x}_T\right) \prod_{t=1}^T p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right):=p\left(\mathbf{x}_T\right) \prod_{t=1}^T \mathcal{N}\left(\mathbf{x}_{t-1} ; \boldsymbol{\mu}_\theta\left(\mathbf{x}_t, t\right), \boldsymbol{\Sigma}_\theta\left(\mathbf{x}_t, t\right)\right)

其间高斯变缓的时刻参数是可学参数,留意由于这里反向分散进程咱们认为是符合马尔科夫假定的,所以高斯变缓的散布仅取决于上一步的散布情况(或许说下一步的散布情况,由你是怎样看模型方向决定的):

p(xt−1∣xt):=N(xt−1;(xt,t),(xt,t))p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right):=\mathcal{N}\left(\mathbf{x}_{t-1} ; \boldsymbol{\mu}_\theta\left(\mathbf{x}_t, t\right), \mathbf{\Sigma}_\theta\left(\mathbf{x}_t, t\right)\right)

Pytorch中如何使用扩散模型? 机器学习扩散模型简介

具体的数学推导我之前写过很多了,在这里就不重复造轮子了。感兴趣的能够看之前的文章:

  • 突然火起来的diffusion model是什么? – ()

  • 浅谈语义分割网络U-Net – ()

-【翻译】VAE+SDE 双视角解读分散模型原理 – ()

分散模型在PyTorch中如何运用

尽管分散模型不像其他机器学习中传统的办法和框架一样普及,可是现在也是有一些完成好的分散模型能够让咱们直接运用的。在Pytorch中运用分散模型最简略的办法便是运用denoising-diffusion-pytorch库,其间完成了一个和咱们上边介绍的一样的图画分散模型。

想用这个库,先要装置嘛,在终端输入:

pip install denoising_diffusion_pytorch

举个小比方

想练习一个模型并生成图画,咱们首先要导入必要的库。

import torch
from denoising_diffusion_pytorch import Unet, GaussianDiffusion

然后咱们界说好网络结构,在这个比方里咱们用的是U-Net,dim参数指的是在第一次下采样之前特征图的数量;dim_mults中存储的是接连下采样的乘数。

model = Unet(
    dim = 64,
    dim_mults = (1, 2, 4, 8)
)

现在咱们的U-Net网络结构现已界说好了,咱们需求界说分散模型自身了。咱们需求传入以下几个东西:

  1. 咱们刚才用那几个参数界说好的U-Net模型。

  2. 需求发生的图片的尺度。

  3. 分散模型需求分散的时刻步长。

  4. 是选择L1仍是L2归一化。

diffusion = GaussianDiffusion(
    model,
    image_size = 128,
    timesteps = 1000,   # number of steps
    loss_type = 'l1'    # L1 or L2
)

现在这样分散模型就算是界说好了。能够去练习了。咱们现在就搞几个随机数来练习一下,演示演示,然后再用常见的办法练习一下分散模型。

training_images = torch.randn(8, 3, 128, 128)
loss = diffusion(training_images)
loss.backward()

模型一旦练习好之后,咱们最后就能够直接运用diffusion.sample()生成图画,下边这段代码便是咱们生成四张图。由于咱们的练习数据便是随便搞得随机数嘛,所以生成的必定也只是随机噪声。

sampled_images = diffusion.sample(batch_size = 4)

Pytorch中如何使用扩散模型? 机器学习扩散模型简介

在自己的数据集上运转

上边咱们现已用随机数举比方了,denoising-diffusion-pytorch写都写了,必定是能够让你用自己的数据集来练习一个分散模型啊。你只需求简略地替换一下Trainer()中的'path/to/your/images'字符串,将其改为数据集的文件夹地址,然后将image_size改为适宜的图片大小即可。之后你只需求运转代码就能够练习模型了,采样生成图片和上一段讲的都是一样的。

留意, 想要用Trainer你有必要保证你运转代码的当地是支撑CUDA的。

from denoising_diffusion_pytorch import Unet, GaussianDiffusion, Trainer
model = Unet(
    dim = 64,
    dim_mults = (1, 2, 4, 8)
).cuda()
diffusion = GaussianDiffusion(
    model,
    image_size = 128,
    timesteps = 1000,   # number of steps
    loss_type = 'l1'    # L1 or L2
).cuda()
trainer = Trainer(
    diffusion,
    'path/to/your/images',
    train_batch_size = 32,
    train_lr = 2e-5,
    train_num_steps = 700000,         # total training steps
    gradient_accumulate_every = 2,    # gradient accumulation steps
    ema_decay = 0.995,                # exponential moving average decay
    amp = True                        # turn on mixed precision
)
trainer.train()

下边这个动图里你能够看到从多元噪声逐步去噪最后生成MNIST数据会集图画的一个接连的去噪进程。

Pytorch中如何使用扩散模型? 机器学习扩散模型简介

结语

分散模型是一种概念上简略而高雅的办法,能够处理数据生成的问题。分散模型现在现已能够在作用上获得SOTA,并且运用的对错对立性练习,因此该模型现在现已到了一个很高的高度。键入分散模型现在的地位,能够预期在未来几年还会有进一步的提高。尤其是咱们能够看到关于DALL-E 2这样的前沿模型来说,分散模型的功能至关重要。

参考资料

  1. Deep Unsupervised Learning using Nonequilibrium Thermodynamics

  2. Generative Modeling by Estimating Gradients of the Data Distribution

  3. Denoising Diffusion Probabilistic Models

  4. Improved Techniques for Training Score-Based Generative Models

  5. Improved Denoising Diffusion Probabilistic Models

  6. Diffusion Models Beat GANs on Image Synthesis

  7. GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models

  8. Hierarchical Text-Conditional Image Generation with CLIP Latents


原文链接:Introduction to Diffusion Models for Machine Learning (assemblyai.com)

Pytorch中如何使用扩散模型? 机器学习扩散模型简介