当前位置: 首页 > news >正文

【生成模型之二】diffusion model模型

【算法简历修改、职业规划、校招实习咨询请私信联系】

【Latent-Diffusion 代码】


生成模型分类概述

Diffusion Model,这一深度生成模型,源自物理学中的扩散现象,呈现出令人瞩目的创新性。与传统的生成模型,如VAE、GAN相比,**它通过模拟数据由随机噪声逐步扩散至目标数据的过程,实现数据生成。**在图像、文本和音频生成等多个领域,Diffusion Model均展现出了卓越的性能。

其算法原理深入浅出,将数据生成过程视为一个马尔可夫链。数据从目标状态出发,每一步都逐渐向随机噪声过渡,直至达到纯粹的噪声状态。随后,通过逆向过程,数据从纯噪声逐渐恢复至目标状态。这一复杂过程通过一系列的条件概率分布得以精确描述。

优化过程则是通过最小化真实数据与生成数据之间的差异,对模型进行训练。常用的损失函数包括MSE(均方误差)和BCE(二元交叉熵)。

import torch
import torch.nn as nn
import torch.optim as optim# 定义U-Net模型
class UNet(nn.Module):
# ...省略模型定义...# 定义Diffusion Model
class DiffusionModel(nn.Module):def __init__(self, unet):super(DiffusionModel, self).__init__()self.unet = unetdef forward(self, x_t, t):# x_t为当前时刻的数据,t为噪声水平# 利用U-Net预测噪声水平noise_pred = self.unet(x_t, t)# 根据预测的噪声水平生成数据x_t_minus_1 = x_t - noise_pred * torch.sqrt(1 - torch.exp(-2 * t))return x_t_minus_1# 初始化模型和优化器
unet = UNet()
model = DiffusionModel(unet)
# 训练过程
for epoch in range(num_epochs):for x_real in dataloader: # 从数据加载器中获取真实数据# 前向过程x_t = x_real # 从真实数据开始for t in torch.linspace(0, 1, num_steps):# 添加噪声noise = torch.randn_like(x_t) * torch.sqrt(1 - torch.exp(-2 * t))x_t = x_t + noise * torch.sqrt(torch.exp(-2 * t))# 计算预测噪声noise_pred = model(x_t, t)# 计算损失loss = nn.MSELoss()(noise_pred, noise)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()

1.DDPM(Denoising diffusion probabilistic model)

1.1潜在扩散模型(Latent diffusion model,LDM)

DDPM 模型在生成图像质量上效果已经非常好,但它也有个缺点, 那就是 x 0 x_{0} x0 的尺寸是和图片一致的, x 0 x_{0} x0 的元素和图片的像素是一一对应的, 所以称 DDPM 是像素(pixel)空间的生成模型。 我们知道一张图片的尺寸是3xHxW,如果想生成一张高尺寸的图像, 它的张量大小是非常大的,这就需要极大的显卡(硬件)资源,包括计算资源和显存资源。 同样的,它的训练成本也是高昂的。高昂的成本极大的限制了它在民用领用的发展。

论文 High-Resolution Image Synthesis with Latent Diffusion Models [1],针对这个问题做了一些改进, 主要的改进点有:(1)引入一个自编码器,先对原始对象进行压缩编码,编码后的向量再应用到扩散模型;(2)通过在 UNET 中加入 Attention 机制,处理条件变量;

1.1.1 潜在空间

针对 DDPM 消耗资源的问题,解决方法也简单。 引入一个自编码器,比如上一章介绍的变分编码器(VAE),先对原始图像进行压缩编码,得到图像的低维表示 z 0 z_{0} z0 ,然后 z 0 z_{0} z0 作为 DDPM 的输入,执行 DDPM 的算法过程,DDPM 生成的结果再经过解码器还原成图像。 由于 z 0 z_{0} z0 是压缩过的,其尺寸远远小于原始的图像,这样就能极大的减少 DDPM 资源的消耗。 压缩后 z 0 z_{0} z0 所在的数据空间称为潜在空间(latent space), 可以称为潜在数据。

这个自编码器(VAE)可以是提前预训练好的模型,在训练扩散模型时,自编码器的参数是冻住的, 如图 7.1.2 所示。通过使用预训练的编码器 ,我们可以将全尺寸图像编码为低维潜在空间数据(压缩数据)。通过使用预训练的解码器 ,我们可以将潜在空间数据解码回图像。

这样在 DDPM 外层增加一个 VAE 后,DDPM 的扩散过程和降噪过程都是在潜空间(Latent Space)进行, 潜空间的尺寸远远小于像素空间,极大了降低了硬件资源的需求,同时也能加速整个过程。

正向扩散过程→给潜在数据增加噪声,逆向扩散过程→从潜在数据中消除噪声。 整个 DDPM 的过程都是在潜在空间执行的, 所以这个算法被称为潜在扩散模型(Latent diffusion model,LDM)。 增加一个自编码器并没有改变 DDPM 的算法过程,所以并不需要对 DDPM 算法代码做任何改动。

### 1.1.2条件处理

在 DDPM 的过程中,可以增加额外的指导信息,使其生成我们的想要的图像, 比如文本生成图像、图像生成图像等等。

用符号 y y y表示额外的条件数据,用 τ \tau τ表示 y y y的加工处理过程,它负责把 y y y加工成特征向量。 比如,如果 y y y是一段文本的 prompt, τ \tau τ就可以是一个 text-encoder, 论文中使用的预训练好的 CLIP 模型中的 text-encoder。 之所以用 CLIP 模型的 text-encoder, 是因为 CLIP 模型本身就是一个文本图像的多模态模型, 它的 text-encoder 能更贴近图像的特征空间, 这里选用一个预训练好的 CLIP 模型即可。

通过在 UNET 网络中增加 Attention 机制把文本的嵌入向量加入到 UNET 网络中。加入不同的内容可以通过一个开关(switch)来控制, 如 图 7.1.4 所示。

1.1.3 训练过程

相比于 DDPM ,条件化的 LDM 目标函数稍微变化了一点,具体变化内容可以参考 图 7.1.5。

图 7.1.6 是 LDM 采样过程的图形化表示, 过程并不复杂,经过 DDPM 采样生成的 z 0 z_{0} z0需要用解码器D还原成图像。

2. 稳定扩散模型(Stable diffusion,SD)

LDM 本身是由 CompVis 提出并联合 Runway ML进行开发实现,后来 Stability AI 也参与进来并提供了一些资源, 联合搞了一个预训练的 LDM 模型,称为 Stable diffusion。 所以,Stable diffusion 是 LDM 的一个开源预训练模型,由于它的开源迅速火爆起来。 目前 Stable diffusion 已经占据了图像生成开源领域的主导地位。

diffusion model 原理解释

x T ( x 0 , ϵ ) = a t x 0 + 1 − a t ϵ x_{T}(x_{0}, \epsilon)=\sqrt{a_{t}} x_{0}+\sqrt{1-a_{t}}\epsilon xT(x0,ϵ)=at x0+1at ϵ,其中 ϵ \epsilon ϵ是噪声, 符合 0 均值, 1 方差的正态分布

一文读懂扩散模型(Diffusion Models)

http://www.lryc.cn/news/471271.html

相关文章:

  • 记录 Maven 版本覆盖 Bug 的解决过程
  • 【K8S系列】Kubernetes Service 基础知识 详细介绍
  • python在物联网领域的数据应用分析与实战!
  • 目标跟踪算法-卡尔曼滤波详解
  • SpringBoot后端开发常用工具详细介绍——application多环境配置与切换
  • php反序列化漏洞典型例题
  • 浅析Android View绘制过程中的Surface
  • 基于卷积神经网络的大豆种子缺陷识别系统,resnet50,mobilenet模型【pytorch框架+python源码】
  • HarmonyOS项目开发一多简介
  • C++基础三
  • 利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析
  • Linux系统操作篇 one -文件指令及文件知识铺垫
  • 隨筆20241028 ISR 的收缩与扩展及其机制解析
  • linux-字符串相关命令
  • ES6 函数的扩展
  • Mac 查看占用特定端口、终止占用端口的进程
  • C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询
  • RabbitMQ 安装(Windows版本)和使用
  • Apache paimon表管理
  • java 第19天
  • 什么是服务器?服务器与客户端的关系?本地方访问不了网址与服务器访问不了是什么意思?有何区别
  • Spring(1)—Spring 框架:Java 开发者的春天
  • MT1401-MT1410 码题集 (c 语言详解)
  • React基础语法
  • 《Kadane‘s Algorithm专题:最大和连续子数组》
  • Vue基础(5)
  • 面对复杂的软件需求:5大关键策略!
  • 使用Git进行版本控制的最佳实践
  • 【入门1】顺序结构 - B2025 输出字符菱形
  • C#DLL热加载|动态替换