LDM:High-Resolution Image Synthesis with Latent Diffusion Models

news2025/1/22 20:59:23

LDM: High-Resolution Image Synthesis with Latent Diffusion Models

TL; DR:关键的技术点有两个。一是通过感知压缩将 Diffusion 从像素空间的转换到隐空间来做,降低训练/采样的算力成本,提高生成质量。二是通过交叉注意力,将各种条件(如文本、图片、表征等)加入到 UNet 的生成过程中,实现高效的可控生成。

本篇提出了大名鼎鼎的 LDM(以及 Stable Diffusion)。在这之前的扩散模型,都是做在像素空间上的,现如今图片的像素数动辄上百万,而且扩散模型的训练需要多步去噪,在像素空间进行训练成本太高。借鉴 AE、VAE、VQGAN 这一类图像压缩表征的方法,LDM 提出先将图片压缩为隐空间的特征图,然后在隐空间中进行去噪训练,之后再将去噪结果解码到像素空间,完成图像生成。详细介绍的文章已经很多了,这里简要讲笔者认为的两个关键技术点。分别是 VAE 感知压缩和交叉注意力条件机制。

VAE感知压缩

感知压缩是 LDM 最关键的一个点,其名称中的 latent,正是隐空间的意思。在已有的方法中,AE、VAE、VQVAE、VQGAN 都可以作为图像压缩表征与重建的方法。这些方法在之前的文章中都已经介绍过了。简单来说,AE 就是经典的自编码器,输入图片,压缩后重构出原图;VAE 将中间的隐层特征约束为高斯分布,方便直接采样生成;VQVAE 引入了离散的向量表征 codebook,并通过额外训练一个自回归模型在隐空间采样后解码为真实图片;VQGAN 在 VQVAE 的基础上添加了感知损失和对抗损失来避免仅使用 L2 重构损失造成的图片模糊。

LDM 中的压缩感知模型采用了 VQGAN 中的感知损失和对抗损失来优化解码质量。为了避免隐层特征图的方差太大,LDM 试验了两种正则化方法:KL-reg 和 VQ-reg。KL-reg 将隐层特征约束为一个高斯分布,这就完全等价于 vae 了,其编码器的输出会被视作高斯分布的均值和方差,然后从该分布中随机一个 latent 出来,送到解码器中,重构原始图像。可以在 diffusers相关实现 得到验证。这也是目前 Stable Diffusion 最常用的正则化方式。VQ-reg 则在解码器中融合进了一个向量化层,相当于是 VQGAN。

在这里插入图片描述

交叉注意力条件机制

在各种生成模型成熟之后,可控生成都是必须要思考的一个问题,因为只有可控的生成才有现实意义。LDM 提出使用交叉注意力机制,将条件注入到 UNet 的去噪过程中,来实现可控生成。

对于每一种条件 y y y,先使用不同的编码器 τ θ \tau_\theta τθ 进行预处理,将其转换为一个隐层表示 τ θ ( y ) ∈ R M × d τ \tau_\theta(y)\in\mathbb{R}^{M\times d_\tau} τθ(y)RM×dτ ,然后通过交叉注意力层 (cross-attention layer) 映射到 UNet 的中间层中:
Attention ( Q , K , V ) = softmax ( Q K T d ) ⋅ V \text{Attention}(Q,K,V)=\text{softmax}(\frac{QK^T}{\sqrt{d}})\cdot V Attention(Q,K,V)=softmax(d QKT)V
其中:
Q = W Q ⋅ ϕ ( z t ) ,    K = W K ⋅ τ θ ( y ) ,    V = W V ⋅ τ θ ( y ) Q=W_Q\cdot\phi(z_t),\ \ K=W_K\cdot\tau_\theta(y),\ \ V=W_V\cdot\tau_\theta(y) Q=WQϕ(zt),  K=WKτθ(y),  V=WVτθ(y)
ϕ ( z t ) \phi(z_t) ϕ(zt) 是 UNet 的中间层表征,这里要看清楚谁和谁乘,如何交叉注意。

总结

Stable Diffusion 的影响力不用多说,本文主要提了 LDM 技术上的两个关键点。其中 VAE 感知压缩要首先深刻理解一系列自编码压缩方法(之前的文章都有介绍),然后搞懂 KL-reg 和 VQ-reg 两种正则化方式实际上相当于什么方法,以及为什么要加正则。交叉注意力的条件生成机制也是目前比较常用的,理解好交叉注意力机制本身是如何操作的即可,别的就是如何将不同的条件形式进行高效编码。

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

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

相关文章

统计平台项目总体架构设计方案

1 总体规划 1.1 设计原则 按照本项目的建设目标,结合本项目具有涉及范围广、建设规模大、数据构成复杂等特点,在设计阶段需遵循一些重要原则,以保障后续建设的顺利衔接和有效执行。 1、规范性 系统设计开发遵循通用的国际规范及各系统间接口标准,保障中台基础信息数据库…

0205-2-数据链路层

第 3 章 数据链路层 使用点对点信道的数据链路层 数据链路和帧 数据链路层使用的信道主要有以下两种类型: 点对点信道。这种信道使用一对一的点对点通信方式。广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多…

JAVA并发编程之ConcurrentHashMap详解

ConcurrentHashMap 一、ConcurrentHashMap写入数据流程 一般在项目中使用ConcurrentHashMap时,都是作为JVM缓存使用的。 ConcurrentHashMap是线程安全的。如果你项目涉及到了多个线程都会操作key-value结构时,别用HashMap,一定要上Concurr…

【Java多线程】线程中几个常见的属性以及状态

目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活 Thread的几个常见属性 1、Id ID 是线程的唯一标识,由系统自动分配,不同线程不会重复。 2、Name名称 用户定义的名称。该名称在各种…

Shellcode免杀对抗(Python)

Shellcode Python免杀,绕过360安全卫士、火绒安全、Defender Python基于cs/msf的上线 cs 执行代码2种可供选择 执行代码 1: rwxpage ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40) ctypes.windll.kernel32.RtlMoveMemory…

线程安全性的原理分析学习

初步认识Volatile 一段代码引发的思考 下面这段代码,演示了一个使用volatile以及没使用volatile这个关键字,对于变量更新的影响 package com.sp.demo;/*** author : lssffy* Description :* date : 2024/2/16 18:42*/ public class VolatileDemo {publi…

阿里云香港轻量应用服务器是什么线路?cn2?

阿里云香港轻量应用服务器是什么线路?不是cn2。 阿里云香港轻量服务器是cn2吗?香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器,通过mtr traceroute测试了一下,最后一跳是202.97开头的ip,1…

C++学习Day06之继承基本语法

目录 一、程序及输出1.1 没有继承1.2 使用继承 二、分析与总结 一、程序及输出 想象在移动端看资讯,顶部、底部、左侧和中间内容,左侧滑动栏有新闻、体育…,点击不同的新闻,中间内容呈现不同主题的文字叙述,在代码里该…

vivado RAM HDL Coding Techniques

Vivado synthesis可以解释各种RAM编码风格,并将它们映射到分布式RAM中或块RAM。此操作执行以下操作: •无需手动实例化RAM基元 •节省时间 •保持HDL源代码的可移植性和可扩展性从编码示例下载编码示例文件。 在分布式RAM和专用RAM之间的选择块存储器…

在外包干了两年的点点点,人快废了。。。

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 简单的说下,我大学的一个同学,毕业后我自己去了自研的公司,他…

Java面向对象案例之设计用户去ATM机存款取款(三)

需求及思路分析 业务代码需求: 某公司要开发“银行管理系统”,请使用面向对象的思想,设计银行的储户信息,描述存款、取款业务。 储户类的思路分析: 属性:用户姓名、密码、身份证号、账号、帐户余额 方法&a…

对前端限流操作(Redis版本)4种算法

固定时间窗口算法 固定时间窗口算法也可以叫做简单计数算法。网上有很多都将计数算法单独抽离出来。但是笔者认为计数算法是一种思想,而固定时间窗口算法是他的一种实现包括下面滑动时间窗口算法也是计数算法的一种实现。因为计数如果不和时间进行绑定的话那么失去…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(3)数据准备和数据预处理

项目开始,首先要进行数据准备和数据预处理。 数据准备的核心是找到这些数据,观察数据的问题。 数据预处理就是去掉脏数据。 缺失值的处理,格式转换等。 延伸学习: 在人工智能(AI)的众多工作流程中&#…

2024.02.18作业

1. 使用fgets统计给定文件的行数 #include <stdio.h> #include <stdlib.h> #include <string.h>int main(int argc, char const *argv[]) {if (argc ! 2){puts("input file error");puts("usage:./a.out filename");return -1;}FILE* f…

单片机学习笔记---AD/DA工作原理(含运算放大器的工作原理)

目录 AD/DA介绍 硬件电路模型 硬件电路 运算放大器 DA原理 T型电阻网络DA转换器 PWM型DA转换器 AD原理 逐次逼近型AD转换器 AD/DA性能指标 XPT2046 XPT2046时序 AD/DA介绍 AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟…

【MySQL】学习多表查询和笛卡尔积

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-N8PeTKG6uLu4bJuM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

JMeter接口测试数据分离驱动应用

步骤&#xff1a; 创建csv文件&#xff0c;编写接口测试用例 新建线程组——创建循环控制器&#xff08;循环次数填用例总数&#xff09; 创建CSV数据文件设置&#xff0c;设置参数。&#xff08;注意&#xff1a;是否允许带引号&#xff1f;&#xff1a;一定要设置为true&a…

10M上下文,仅靠提示就掌握一门语言,Google Gemini 1.5被OpenAI抢头条是真冤

这两天&#xff0c;几乎整个AI圈的目光都被OpenAI发布Sora模型的新闻吸引了去。其实还有件事也值得关注&#xff0c;那就是Google继上周官宣Gemini 1.0 Ultra 后&#xff0c;火速推出下一代人工智能模型Gemini 1.5。 公司首席执行官 Sundar Pichai携首席科学家Jeff Dean等众高…

Python输出改变字体颜色方法(附颜色大全)

一、使用示例 print("\033[31m红色字体\033[0m") print("\033[32m绿色字体\033[0m") print("\033[33m黄色字体\033[0m") print("\033[34m蓝色字体\033[0m") print("\033[35m紫色字体\033[0m") print("\033[36m青色字体…

驶向未来:3D可视化模型重塑我们的道路认知

在科技的浪潮中&#xff0c;每一个革新都是对人类未来生活的深度洞察。而今&#xff0c;当可视化这一技术走进我们的视野&#xff0c;它不仅是一场视觉盛宴&#xff0c;更是一次对未来出行方式的全新探索。 一、从平面到立体&#xff0c;解锁道路新视角 你是否曾站在十字路口&…