【笔记】扩散模型(九):Imagen 理论与实现

论文链接:Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding

非官方实现:lucidrains/imagen-pytorch

Imagen 是 Google Research 的文生图工作,这个工作并没有沿用 Stable Diffusion 的架构,而是级联了一系列普通的 DDPM 模型。其主要的贡献有以下几个方面:

  1. 使用比较大的文本模型进行文本嵌入,可以获得比使用 CLIP 更好的文本理解能力;
  2. 在采样阶段引入了一种动态阈值的方法,可以利用更高的 guidance scale 来生成更真实、细节更丰富的图像(这里的阈值是控制 x \mathbf{x} x 的范围);
  3. 改良了 UNet,提出 Efficient UNet,使模型更简单、收敛更快、内存消耗更少。

该模型的架构如下图所示,可以看到使用了一个条件生成的 diffusion 模型以及两个超分辨率模型,每个模型都以文本模型的 embedding 作为条件,先生成一个 64 分辨率的图像,然后逐步超分辨率到 1024 大小。

Imagen 模型结构

Imagen

预训练文本模型

现在的文生图模型主流使用的文本嵌入方法是使用 CLIP 文本编码器,在直观上感觉是比较合理的,因为 CLIP 的文本特征和图像特征共享同一个空间,用来控制图像的生成过程是比较合理的。不过 CLIP 的缺点是对文本的表达能力比较有限,处理复杂文本比较困难。

这里选择的不是使用 CLIP,而是使用规模比较大、且在大规模文本语料上训练的文本模型,具体来说使用的模型有 BERT、T5 和 CLIP。经过实验(具体结果可以看原论文 Figure 4 的 a 和 b,以及 Figure A.5),主要有以下发现:

  • 缩放文本编码器对提升生成质量的作用很明显;
  • 相比增大 UNet 的尺寸,增大文本编码器的尺寸更重要;
  • 相比于 CLIP,人类更偏好 T5-XXL 的结果。

高 Guidance Scale 的改善

提高 classifier-free guidance 的 guidance scale 可以提升文本-图像的匹配程度,但是会破坏图像的质量。这个现象是因为高 guidance scale 会导致训练阶段和测试阶段出现 mismatch。具体来说,在训练时,所有的 x \mathbf{x} x 都分布在 [ − 1 , 1 ] [-1,1] [1,1] 的范围里,然而当使用比较大的 guidance scale 时,得到的 x \mathbf{x} x 会超出这个范围。这样会导致 x \mathbf{x} x 落在已经学习过的范围以外,为了解决这个问题,作者研究了静态阈值(static thresholding)和动态阈值(dynamic thresholding)两种方案,具体算法如下图所示:

静态阈值和动态阈值算法

静态阈值

这种方法就是在预测噪声后,先计算出 x 0 \mathbf{x}_0 x0,然后将其取值范围直接裁剪到 [ − 1 , 1 ] [-1,1] [1,1] 之间,然后再进行去噪。这种方法已经很多方法都使用了,例如 openai/guided-diffusion 中的这段代码就是为了进行这种处理:

def process_xstart(x):if denoised_fn is not None:x = denoised_fn(x)if clip_denoised:return x.clamp(-1, 1) # 裁剪到 [-1,1]return xif self.model_mean_type == ModelMeanType.EPSILON:pred_xstart = process_xstart(self._predict_xstart_from_eps(x_t=x, t=t, eps=model_output) # 得到 x_0)
model_mean, _, _ = self.q_posterior_mean_variance(x_start=pred_xstart, x_t=x, t=t
)

动态阈值

这个方法不是很好理解,我们可以从一个例子出发,我们平时进行 classifier-free guidance 时使用的 guidance scale 通常都是 7.5,那么一个原本分布在 [ − 1 , 1 ] [-1,1] [1,1] 之间的变量乘以这个系数之后就会变到 [ − 7.5 , 7.5 ] [-7.5,7.5] [7.5,7.5] 的范围内。如果某处的几个数分别是 { 0.2 , 0.4 , 0.6 , 0.8 } \{0.2, 0.4, 0.6, 0.8\} {0.2,0.4,0.6,0.8},乘以 7.5 后就变成了 { 1.5 , 3.0 , 4.5 , 6.0 } \{1.5,3.0,4.5,6.0\} {1.5,3.0,4.5,6.0}。如果此时直接将这些数裁剪到 [ − 1 , 1 ] [-1,1] [1,1],那么所有的数都会变成 1,原本这些数之间是有比较大的差别的,裁剪后都变成了相同的数,这样很明显是不合理的,动态阈值就是为了寻找一个比较合理的裁剪范围。

这里的做法是寻找一个 x 0 \mathbf{x}_0 x0 的 p-分位数 s s s,也就是找到大多数的数字落在什么范围内,然后先裁剪到 [ − s , s ] [-s,s] [s,s] 范围内,再全部除以 s s s 以缩放到 [ − 1 , 1 ] [-1,1] [1,1] 的范围内。实验发现这种方法能比较好地改善图像的质量,这部分的代码如下所示(摘自非官方实现):

if pred_objective == 'noise':x_start = noise_scheduler.predict_start_from_noise(x, t=t, noise=pred)
elif pred_objective == 'x_start':x_start = pred
elif pred_objective == 'v':x_start = noise_scheduler.predict_start_from_v(x, t=t, v=pred)if dynamic_threshold: # 动态阈值# 找到 p-分位数s = torch.quantile(rearrange(x_start, 'b ... -> b (...)').abs(),self.dynamic_thresholding_percentile,dim = -1)s.clamp_(min=1.)s = right_pad_dims_to(x_start, s)# 进行归一化x_start = x_start.clamp(-s, s) / s
else: # 静态阈值,直接截断x_start.clamp_(-1., 1.)
mean_and_variance = noise_scheduler.q_posterior(x_start=x_start, x_t=x, t=t, t_next=t_next)

级联扩散模型

为了生成高分辨率图像,模型级联了三个扩散模型,一个用来生成低分辨率图像,两个用来将低分辨率图像逐步超分到高分辨率。在训练阶段,作者发现使用带有噪声条件增强的超分模型可以生成更高质量的模型。具体来说,每次生成噪声时,还从 [ 0 , 1 ] [0,1] [0,1] 范围内随机采样一个 aug level,然后基于这个 level 进行增强。在预测噪声时,不仅输入带噪声的图像、低分辨率图像、时间步,还输入一个 aug level。在推理阶段,使用一系列 aug level 进行增强,然后分别进行推理,从中选取一个最佳样本,这样可以提升采样效果。具体的算法如下所示:

超分模型的训练和采样过程

总结

除了上述的一些贡献,Imagen 还做了一些工程上的改进,例如使用了不同的 text condition 注入方式,以及对基础的 UNet 模型进行了改进,提出了 Efficient UNet 模型等。相比同期的其他方法,Imagen 应该是为数不多可以直接生成 1024 分辨率图像的 diffusion 模型,虽然和主流的 Stable Diffusion 架构不同,但其中的一些改进思路还是值得学习一下的。

本文原文以 CC BY-NC-SA 4.0 许可协议发布于 笔记|扩散模型(九):Imagen 理论与实现,转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VScode建立Java项目

学了半天,项目、包是咋创建的都不知道😭😭😭,补习一下✏️✏️✏️ 打开命令面板,“查看”里打开,或者CtrlShiftP。 选择创建Java项目,现在没有用框架,只是普通学习&…

C语言变量与强制类型转换深度解析

在上一篇文章中,小编对数据类型进行了详细的讲解与剖析,所以本篇文章小编要带大家理解变量和强制类型转。还是老规矩,来波鸡汤,学习一定不能着急,无法一下就学明白的知识我们需要给他时间,一定不要在一个知…

国内短剧源码短剧系统搭建小程序部署H5、APP打造短剧平台

​在当今的互联网时代,短剧作为一种新兴的娱乐形式,受到了越来越多用户的喜爱。为了提供更好的用户体验和满足用户需求,一个好的短剧系统需要具备多元化的功能和优质的界面设计。 本文将介绍国内短剧源码短剧系统搭建小程序部署H5、APP所需的…

Synchronized 的几种用法解析

背景介绍 说到并发编程,总绕不开线程安全的问题。 实际上,在多线程环境中,难免会出现多个线程对一个对象的实例变量进行同时访问和操作,如果编程处理不当,会产生脏读现象。 线程安全问题 我们先来看一个简单的线程…

rhce作业4

问题: 1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器,对主dns服务器进行数据备份。 配置: 主服务器配置 安装 关闭防火墙 主配置文件定义正反向解析域 正向解析资源记录文件 反向解析记录文件 重启…

在数据抓取的时候,短效IP比长效IP有哪些优势?

在数据抓取领域,代理IP的选择对于任务的成功率和效率至关重要。短效IP和长效IP各有其特点和适用场景,但在数据抓取过程中,短效IP因其独特的优势而受到青睐。本文将和大家一起探讨短效IP在数据抓取中相比长效IP的优势。 短效IP的定义与特点 …

B2C分销管理系统(源码+文档+部署+讲解)

本文将深入解析“B2C分销管理系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 "B2C分销管理系统"是一款集产品管理、客户服务、运营监控和财务管理于一体的综合性分销管理平台。系统功能全面覆盖套餐管理、SI…

【前端基础】CSS基础

目标:掌握 CSS 属性基本写法,能够使用文字相关属性美化文章页。 01-CSS初体验 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 文档的呈现(美化内容&#…

CertiK发现三星区块链密钥库的高风险漏洞,第3次获得致谢

2024年11月5日,CertiK因发现三星手机区块链密钥库(Blockchain Keystore)的一个高风险漏洞,第3次获得三星的认可与致谢。三星Keystore通过移动硬件安全技术,为私钥的存储与签名过程提供坚固的防护。该漏洞得到及时修复&…

阿里云docker安装禅道记录

docker network ls docker network create -d bridge cl_network sudo docker run --name zentao --restart always -p 9982:80 --networkcl_network -v /data/zentao:/data -e MYSQL_INTERNALtrue -d hub.zentao.net/app/zentao:18.5 升级禅道 推荐用按照此文档升级&a…

DFA算法实现敏感词过滤

DFA算法实现敏感词过滤 需求:检测一段文本中是否含有敏感词。 比如检测一段文本中是否含有:“滚蛋”,“滚蛋吧你”,“有病”, 可使用的方法有: 遍历敏感词,判断文本中是否含有这个敏感词。 …

远程控制项目第四天 功能实现

发送屏幕内容 代码详解 1. 创建 CImage 对象并获取屏幕内容 首先,我们创建一个 CImage 对象,用于接收屏幕上的内容。要获取屏幕内容,我们需要先获取当前设备上下文(DC)。调用 ::GetDC(NULL) 函数,参数 NU…

多分类logistic回归分析案例教程

因变量为无序多分类变量,比如研究成人早餐选择的相关因素,早餐种类包括谷物类、燕麦类、复合类,此时因变量有三种结局,而且三种早餐是平等的没有顺序或等级属性,此类回归问题,可以使用多分类Logistic回归进…

工业相机常用功能之白平衡及C++代码分享

目录 1、白平衡的概念解析 2、相机白平衡参数及操作 2.1 相机白平衡参数 2.2 自动白平衡操作 2.3 手动白平衡操作流程 3、C++ 代码从XML读取参数及设置相机参数 3.1 读取XML 3.2 C++代码,从XML读取参数 3.3 给相机设置参数 1、白平衡的概念解析 白平衡(White Balance)…

越权访问漏洞

V2Board Admin.php 越权访问漏洞 ## 漏洞描述 V2board面板 Admin.php 存在越权访问漏洞,由于部分鉴权代码于v1.6.1版本进行了修改,鉴权方式变为从Redis中获取缓存判定是否存在可以调用… V2Board Admin.php 越权访问漏洞 漏洞描述 V2board面板 Admin.ph…

[C++ 核心编程]笔记 4.4.2 类做友元

4.4.2 类做友元 关键步骤: 在另一个类中使用 friend class 类名 拓展: 在类外写成员函数(已在类内声明, 实现可以写在外面): //类外写成员函数 Building::Building() {m_SittingRoom "客厅";m_BedRoom "卧室"; }GoodGay::GoodGay() {//创建建筑物对象…

W外链如何设置活码功能?

根据搜索结果,W外链平台的活码功能允许用户创建动态二维码,这些二维码背后可以链接到不同的目标链接或页面,并且可以根据预设条件自动更新跳转链接。以下是W外链平台活码功能的一些关键特点和使用步骤 : 1.活码的特点&#xff1a…

【论文复现】基于图卷积网络的轻量化推荐模型

本文所涉及所有资源均在这里可获取。 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。 📗本文收录于论文复现系列,大家有兴趣的可以看一看…

QT 实现绘制汽车仪表盘

1.界面实现效果 以下是具体的项目需要用到的效果展示,通常需要使用QPainter类来绘制各种图形和文本,包括一个圆形的仪表盘、刻度、指针和数字。 2.简介 分为以下几个部分,首先设置抗锯齿 painter.setRenderHint(QPainter::Antialiasing)。 QPainter p(this);p.setRender…

2020年美国总统大选数据分析与模型预测

数据集取自:2020年🇺🇸🇺🇸美国大选数据集 - Heywhale.com 前言 对2020年美国总统大选数据的深入分析,提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理&#xff0…