深度学习(生成式模型)——ADM:Diffusion Models Beat GANs on Image Synthesis

本文主要是介绍深度学习(生成式模型)——ADM:Diffusion Models Beat GANs on Image Synthesis,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 基础模型结构
    • UNet结构
    • Timestep Embedding
      • 关于为什么需要timestep embedding
    • global attention layer
  • 如何提升diffusion model生成图像的质量
  • Classifier guidance
  • 实验结果

前言

在前几篇博文中,我们已经介绍了DDPM、DDIM、Classifier guidance等相关的扩散模型基础,从本节博客开始,将介绍一些经典偏应用类的文章。

《Diffusion Models Beat GANs on Image Synthesis》是openAI在2020年发表的一篇文章。文章从模型结构入手,通过扩大模型容量,在图像生成任务上击败了当时的SOTA Big GAN。

此外还提出了Classifier guidance,用于控制扩散模型生成指定类型的图像,具体推导流程可以查阅前文。

本节博客将重点总结模型结构,相应的代码可在此处查阅。

基础模型结构

Unet结构+timestep embedding+global attention layer是扩散模型常用的backbone。本节将对上述三个结构做个简单介绍。

UNet结构

UNet结构由encoder和decoder两个神经网络组成。如下图所示,encoder对图像进行downsample,deocder对图像进行upsample,encoder和decoder之间存在skip connection。encoder和decoder均由residual layers堆叠而成。
在这里插入图片描述

Timestep Embedding

在扩散模型中,通常需要进行 T T T次迭代。类似于位置编码,扩散模型的每次迭代都有一个timestep embedding,用于告知模型目前是第几次迭代,其形式通常为一个常数vector,不同迭代次数的timestep embedding通常不桶。添加timestep embedding的方式有很多,可以通过concat的方式嵌入到每一个residual layers中,也可以通过add的方式嵌入到每一个residual layers的输出中。

如下代码所示,在ADM中,timestep embedding在经过一层learning层处理后,通过add的方式嵌入到每个residual layers中。
在这里插入图片描述

关于为什么需要timestep embedding

扩散模型每轮迭代的输入图像所属的输入分布类型是不一致的,针对不同的输入分布,扩散模型的输出分布也会不同。但是模型要意识到当前图像处于哪种输入分布是件很难的事情,当两个输入分布近似时,模型的输出可能也会近似,这将很大程度影响生成图像的质量。例如生成一双手,在迭代初期,模型的输出应该是手指的轮廓等粗粒度信息,而迭代后期,模型的输出应该是手指指甲的光泽度的细粒度信息,如果迭代前后期的输入分布近似,那么在迭代的后期模型将无法输出指甲光泽度等细粒度的信息,生成的图像将不够逼真。

而timestep embedding的引入相当于把不同步骤的输入分布做了个区分。模型在学习的过程中,这种强烈的信号是不会被忽视的,输出分布的形式大概率会与timestep embedding强烈关联。当timestep取值较小时,模型输出的将是一些粗粒度信息,而随着timestep的取值逐渐变大,模型的输出也会逐渐变细。

global attention layer

global attention layer在ADM中其实就是self attention。假设第N层有 T T T个大小为 H ∗ C H*C HCfeature map,将一个feature map看成一个token,则对应的矩阵大小为 ( H ∗ C ) ∗ T (H*C)*T (HC)T,在该矩阵上使用self attention,具体的代码如下:
在这里插入图片描述

如何提升diffusion model生成图像的质量

在上一节中,我们已经总结了ADM的基础模型结构,在本节中,我们将总结论文中提到能有效提升diffusion model生成图像质量的方法。

论文在五个方面进行了消融实验
在这里插入图片描述
在128*128分辨率的imagenet图像上训练,batch size设置为256,采样时的迭代轮数为250,对应的结果如下:
在这里插入图片描述
可以看到单独加深网络、或添加更多的self attention head、或在更多层使用self attention、或使用big gan的残差模块都可以提升diffusion model生成图像的质量。

此外,作者探究了local attention和global attention对性能提升的影响。不论是local attention还是global attention,都是使用self attention作为注意力策略,但是进行注意力计算的feature map的个数不同。例如某一层共有256个特征图,特征图分辨率为4*4=16,将一个特征图看成一个token,则该层的特征图可转换为16*256大小的矩阵,global attention将在16*256大小的矩阵上进行self attention计算,而local attention则可将16*256大小的矩阵划分为4个4*256大小的矩阵,接着分别在4*256大小的矩阵上进行self attention操作。

作者探究了单独添加更多的global attention head,或者使用local attention head对生成图像质量的影响,最终发现两者均可以提升生成图像的质量,结果如下:
在这里插入图片描述

Classifier guidance

Classifier guidance用于控制扩散模型生成指定类型的图像,具体推导流程可以查阅前文

实验结果

ADM模型最终采取的配置为

For the rest of the architecture, we use 128 base channels, 2 residual blocks per resolution, multi-resolution attention, and BigGAN up/downsampling, and we train the models for 700K iterations.We opt to use 64 channels per head as our default.

实验结果
在这里插入图片描述

这篇关于深度学习(生成式模型)——ADM:Diffusion Models Beat GANs on Image Synthesis的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/481620

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”