Home - SunXiaoXiang/Diffusers GitHub Wiki

  1. 扩散模型的原理 扩散模型是一类生成模型(生成模型:给定一批训练数据X,假设其服从某种复杂的真实分布p(x),则给定的训练数据可视为从该分布中采样的观测样本x,其作用就是估计训练数据的真实分布。)
  2. DDPM(Denoising Diffusion Probabilistic Model)的扩散过程 前向过程(数据噪声化):在每个时间步�t,给上一个时间步�−1t−1的数据��−1xt−1​添加高斯噪声,生成带有噪声的数据��xt​,噪声的方差由��βt​确定,均值由��βt​和当前时刻“带噪”的数据分布确定。 反向过程(数据去噪化):从采样自高斯噪声�∼�(0,�)x∼N(0,I)的随机噪声中恢复出原始数据�0x0​,通过由一系列用神经网络参数化的高斯分布组成的马尔可夫链进行数据去噪。 优化目标:要求反向过程中预测的噪声分布与前向过程中施加的噪声分布之间的“距离”最小。
  3. 扩散模型的应用
  • 计算机视觉:图像分割与目标检测、图像超分辨率(串联多个扩散模型)、图像修复、图像翻译和图像编辑。
  • 时序数据预测:TimeGrad模型,使用RNN处理历史数据并保存到隐空间,对数据添加噪声实现扩散过程,处理数千维度德多元数据完成预测。
  • 自然语言:使用Diffusion-LM可以应用在语句生成、语言翻译、问答对话、搜索补全、情感分析、文章续写等任务中。
  • 基于文本的多模态:文本生成图像(DALLE-2、Imagen、Stable Diffusion)、文本生成视频(Make-A-Video、ControlNet Video)、文本生成3D(DiffRF)
  • AI基础科学:SMCDiff(支架蛋白质生成)、CDVAE(扩散晶体变分自编码器模型)

Diffusers 介绍

pip install -qq -U diffusers datasets transformers accelerate ftfy pyarrow https://huggingface.co/settings/tokens 创建具有写权限的访问令牌 登陆huggingface cli from huggingface_hub import notebook_login notebook_login() Diffusers 的核心 API 被分为三个主要部分:

  1. 管道: 从高层出发设计的多种类函数,旨在以易部署的方式,能够做到快速通过主流预训练好的扩散模型来生成样本。
  2. 模型: 训练新的扩散模型时用到的主流网络架构,e.g. UNet.
  3. 管理器 (or 调度器): 在 推理 中使用多种不同的技巧来从噪声中生成图像,同时也可以生成在 训练 中所需的带噪图像。 训练一个扩散模型的流程看起来像是这样:
  4. 从训练集中加载一些图像
  5. 加入噪声,从不同程度上
  6. 把带了不同版本噪声的数据送进模型
  7. 评估模型在对这些数据做增强去噪时的表现
  8. 使用这个信息来更新模型权重,然后重复此步骤

创建训练循环

在这个样例中我们使用学习率为 0.0004 的 AdamW 优化器。 对于每一批的数据,我们要

  • 随机取样几个迭代周期
  • 根据预设为数据加入噪声
  • 把带噪数据送入模型
  • 使用 MSE 作为损失函数来比较目标结果与模型预测结果(在这里是加入噪声的场景)
  • 通过loss.backward ()optimizer.step ()来更新模型参数

损坏过程

一个简单的方法来控制损坏的程度。那么,如果我们要引入一个参数来控制输入的“噪声量”,那么我们会这么做:

noise = torch.rand_like(x)

noisy_x = (1-amount)*x + amount*noise

如果 amount = 0,则返回输入而不做任何更改。如果 amount = 1,我们将得到一个纯粹的噪声。通过这种方式将输入与噪声混合,我们将输出保持在相同的范围(0 to 1)。

我们可以很容易地实现这一点(但是要注意tensor的shape,以防被广播(broadcasting)机制不正确的影响到

UNet的架构。最初被发明用于医学图像中的分割任务,UNet由一个“压缩路径”和一个“扩展路径”组成。“压缩路径”会使通过该路径的数据被压缩,而通过“扩展路径”会将数据扩展回原始维度(类似于自动编码器)。模型中的残差连接也允许信息和梯度在不同层级之间流动。

训练模型

那么,模型到底应该做什么呢?同样,对这个问题有各种不同的看法,但对于这个演示,让我们选择一个简单的框架:给定一个损坏的输入noisy_x,模型应该输出它对原本x的最佳猜测。我们将通过均方误差将预测与真实值进行比较。

我们现在可以尝试训练网络了。

  • 获取一批数据
  • 添加随机噪声
  • 将数据输入模型
  • 将模型预测与干净图像进行比较,以计算loss
  • 更新模型的参数。

你可以自由进行修改来尝试获得更好的结果!

UNet

diffusers中的UNet2DModel模型比上述基本UNet模型有许多改进:

  • GroupNorm层对每个blocks的输入进行了组标准化(group normalization)
  • Dropout层能使训练更平滑
  • 每个块有多个resnet层(如果layers_per_block未设置为1)
  • 注意机制(通常仅用于输入分辨率较低的blocks)
  • timestep的调节。
  • 具有可学习参数的下采样和上采样块