【AIGC】Stable Diffusion的建模思想、训练预测方式快速


在这篇博客中,将会用机器学习入门级描述,来介绍Stable Diffusion的关键原理。目前,网络上的使用教程非常多,本篇中不会介绍如何部署、使用或者微调SD模型。也会尽量精简语言,无公式推导,旨在理解思想。让有机器学习基础的朋友,可以快速了解SD模型的重要部分。如有理解错误,请不吝指正。

大纲
关键概念
模型结构及关键组件
训练和预测方式
关键概念
名词解释
Stable Diffusion
之所以叫Stable,是因为金主公司叫StabilityAI。

其基础模型是Latent Diffusion Model(LDM),也是本文主要介绍的部分。

模型任务
text-2-img:输入文本描述、输出图像
img-2-img:输入图片及其他文本描述,输出图像
总的来说,不论是输入是文字还是图片,都可以称为是“condition”,用于指引图像生成的“方向”。因此,SD模型的任务,可以统称为是cond-2-img任务。

模型结构与关键组件
模型结构
LDM论文结构图,初看时会有点懵,但稍微理解后还是非常清晰准确的。先初步介绍几个大的模块。建议把这张图截图固定在屏幕上,再继续浏览下面的内容。

整体输入输出
上图中最左侧的x xx和x ~ \widetilde{x} 
x
 是模型的输入与输出,形如[ W , H , C ] [W, H, C][W,H,C]的三维张量,代表一张图像的宽、高和通道数。

需要注意,这里的输入x xx,并不是模型img-2-img中的输入图像,而是模型训练时的原始图像输入。img-2-img的输入图像,是上图中最右侧的Conditioning模块中的images。

像素空间与隐空间
所谓空间,可以理解为数据的表示形式,通常有着不同的坐标轴。

像素空间(Pixel Space),上图左侧,红框部分。通常是人眼可以识别的图像内容。
隐空间(Latent Space),上图中央,绿框部分。通常是人眼无法识别的内容,但包含的信息量与像素空间相近。
像素空间到隐空间

输入的图像x xx,经过Encoder(图中蓝色的E \mathcal{E}E),转换为另一种shape的张量z zz,即称为隐空间。

从压缩角度理解:图像经过转换后,产生的新张量是人眼无法识别的。但其包含的信息量相差不大,数据尺寸却大幅缩小,因此可以看做是一种图像数据压缩方式。

隐空间到像素空间

经过模型处理后的隐向量输出z zz(特指绿框左下角的z zz),经过Decoder(图中蓝色的D \mathcal{D}D),转换回像素空间。

隐空间Diffusion操作
对应图中绿色Latent Space框的上半部分,包括以下三步:

图像经过Encoder压缩后,得到隐向量表示z = E ( x ) z=\mathcal{E}(x)z=E(x)隐向量
从1~1000的均匀分布中,随机采样一个整数T TT,称为扩散步数
对向量z zz加T TT次高斯噪声,满足分布N ( 0 , β t ) N(0, \beta_t)N(0,β 
t

 ),得到z T z_Tz 
T

 向量
在这个操作中,有一些有趣的特性:

噪声收敛

加噪声次数足够多时,理论上会得到一组符合高斯分布的噪声。利用这个特性,在预测阶段我们就不需要执行Diffusion操作,只需要采样一组高斯分布的噪声,即代表了z T z_Tz 
T

 。

高斯噪声可加性

当我们需要得到任意时刻的z T z_Tz 
T

 时,可以直接从z 0 z_0z 
0

 以及一系列β t \beta_tβ 
t

 计算得到,只需要采样一次噪声。这部分的具体公式推导,可以参考由浅入深了解Diffusion Model - 知乎 (zhihu.com)。

隐空间Denoising操作
对应图中绿色框的下半部分,包括以下步骤:

输入z t , t , c o n d z_t,t,condz 
t

 ,t,cond给U-Net结构,预测出一个噪声ϵ θ ( z t , t , c o n d ) \epsilon_{\theta}(z_t,t,cond)ϵ 
θ

 (z 
t

 ,t,cond),shape与z t z_tz 
t

 一致
使z t − 1 = z t − ϵ θ ( z t , t , c o n d ) z_{t-1} = z_t - \epsilon_{\theta}(z_t,t,cond)z 
t−1

 =z 
t

 −ϵ 
θ

 (z 
t

 ,t,cond),重复上一步骤,直至获得z 0 z_0z 
0

 隐向量
使用Decoder得到输出图像,x ~ = D ( z 0 ) \widetilde{x} = \mathcal{D}(z_0) 
x
 =D(z 
0

 )
条件Conditioning
对应图中最右边灰白色框,输入类型包括text、images等。在Conditioning模块中,会执行以下步骤:

这些“附加信息”会通过对应的编码器τ θ \tau_\thetaτ 
θ

 ,转换成向量表示
转换后的向量,会输入给U-Net,作为其中Attention模块的K、V输入,辅助噪声的预测
在这个模块中,有几个有趣的问题:

为什么需要Conditioning

由于“噪声收敛”特性,当噪声加得比较多时,z T z_Tz 
T

 已经趋近于一个“纯噪声”了,但训练过程需要比对输入图像x xx和输出图像x ~ \widetilde{x} 
x
 的相似度。如何从一个“纯噪声”,还原回与输入图像相似的图像,就必须要给模型提供额外的信息指引,这就是Conditioning的作用。

关键组件
VAE(Variational Auto Encoders)
在LDM中,如何将原始图片“压缩”转换至隐空间,经过处理再转换回来,即使用VAE的Encoder和Decoder。这个模块是预训练好的,在LDM训练时固定住参数。

原理

原始张量输入,经过非常简单的网络结构,转换成较小的张量
在Latent张量上,加一点点噪声扰动
用对称的简单网络结构,还原回原始大小
对比输入前后的张量是否相似
特点

网络计算复杂度比较低
Encoder和Decoder可以分开使用
无监督训练,不需要标注输入的label
有了噪声扰动之后,Latent Space的距离具有实际物理含义,可以实现例如“(满杯水+空杯子)/ 2 = 半杯水”的操作


CLIP
文本信息如何转换成张量,靠的是CLIP模块。这个模块是预训练好的,在LDM训练时固定住参数。

训练方式

图像以及它的描述文本,经过各自的Encoder转换为向量表示,希望转换后的向量距离相近。经过训练后,文本描述可以映射到向量空间的一个点,其代表的物理含义与原始图像相近。

假设无预训练

开个脑洞,假如没有这个模块,直接将文本token化后,去Embedding Table中查表作为文本张量,理论上也是可以训练的,只不过收敛速度会慢很多。

因此,这里使用一个预训练text-2-embedding模块,主要目的是加速训练。CLIP的训练数据集,也选择了和LDM的数据集的同一个(LAION-5B的子集),语义更一致。

模型标识解释

我们经常会看到类似“ViT-L/14”的模型名,表示一种CLIP的结构。具体的,ViT表示Vision Transformer,L表示Large(此外还有Base、Huge),14表示训练时把图像划分成14*14个子图序列输入给Transformer。

U-Net
作为LDM的核心组件,U-Net是模型训练过程中,唯一需要参数更新的部分。在这个结构中,输入是带有噪声的隐向量z t z_tz 
t

 、当前的时间戳t tt,文本等Conditioning的张量表示E EE,输出是z t z_tz 
t

 中的噪声预测。

模型任务

U-Net的任务,就是从z t z_tz 
t

 中预测出噪声部分ϵ t \epsilon_tϵ 
t

 ,从而得到降低噪声后的z t − 1 = z t − ϵ t z_{t-1}=z_t - \epsilon_tz 
t−1

 =z 
t

 −ϵ 
t

 ,直到获得z 0 z_0z 
0

 。下图是一个可视化示意图,实际上,我们去噪的z t z_tz 
t

 是隐向量空间的数据,人眼无法识别。

模型结构

U-Net大致上可以分为三块:降采样层、中间层、上采样层。之所以叫U-Net,是因为它的模型结构类似字母U。

降采样层

时间戳t tt转换为向量形式。用的是“Attention is All you Need”论文的Transformer方法,通过sin和cos函数再经过两个Linear进行变换
初始化输入X = c o n v ( c o n c a t ( z t , E ) ) X = conv(concat(z_t, E))X=conv(concat(z 
t

 ,E)),其中c o n v convconv是卷积,E EE是Conditioning
重复以下步骤(a~c)多次,将输入尺寸降至目标尺寸(如上图的4 × 4 4\times44×4)
重复以下两步多次,训练多个ResBlock和SpatialTransformer层,输入值X XX的尺寸不变
输入上一层的输出X XX和时间戳向量,给ResBlock
ResBlock的输出,与E EE一起输入给SpatialTransformer,在这里考虑到text等信息
重复多次3~4步,
通过卷积或Avg-Pooling进行降采样,缩小X XX的尺寸

中间层

很简单,ResBlock + SpatialTransformer + ResBlock,输入X XX尺寸不变。

上采样层

大部分步骤与降采样层一致,只有以下两点不同

输入X XX需要拼上对应降采样层的输出,称为skip connection,对应U-Net结构图中横向的箭头
把降采样步骤,换成使用卷积或插值(interpolate)方式来上采样,使得X XX的尺寸增大
输出

上采样层的输出,会经过normalization + SiLU + conv,得到U-Net的最终输出,即噪声的预测值,尺寸保持与输入z t z_tz 
t

 一致。

训练方式
模型更新方式
LDM模型需要训练的部分,只有U-Net的参数。训练的方式,可以简单总结为:

输入一张图片x xx,以及它的文本描述等Conditioning,一个随机的整数T TT步
经过Encoder压缩、Diffusion加噪声,得到z T z_Tz 
T

 隐向量
结合Conditioning,使用U-Net,进行T TT次去噪,得到预测值z 0 z_0z 
0

 向量
使用Decoder还原回x ~ \widetilde{x} 
x
 ,计算x xx与x ~ \widetilde{x} 
x
 之间的差距(KL散度),得到模型更新的loss
模型预测方式
随机一个高斯噪声,作为z T z_Tz 
T

 向量
输入text等Conditioning,使用U-Net进行指定次数T TT的去噪操作
使用Decoder还原回x ~ \widetilde{x} 
x
 ,得到图像输出
训练、预测过程,在论文中的伪代码为下图所示。


展望
下一篇文章,将会讨论以下几个更深入的内容:

ControlNet、LoRA等插件的实现
各种Conditioning Context是如何转换为张量的
训练的数据集情况
参考
The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time. (jalammar.github.io)

【原创】万字长文讲解Stable Diffusion的AI绘画基本技术原理 - 知乎 (zhihu.com)

Diffusion Models:生成扩散模型 (yinglinzheng.netlify.app)

由浅入深了解Diffusion Model - 知乎 (zhihu.com)

How does Stable Diffusion work? - Stable Diffusion Art (stable-diffusion-art.com)

[2006.11239] Denoising Diffusion Probabilistic Models (arxiv.org)

CompVis/latent-diffusion: High-Resolution Image Synthesis with Latent Diffusion Models (github.com)

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

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

相关文章

JVM-虚拟机栈概述

背景:由于跨平台的设计,java指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器。 栈是运行时单位,而堆是存储的单位。即:栈解决程序运行的问题,即程序如何执行,或者说如何…

JavaWeb——013SpringBootWeb综合案例(事务管理、AOP)

事务&AOP 目录 事务&AOP1. 事务管理1.1 事务回顾1.2 Spring事务管理1.2.1 案例1.2.2 原因分析1.2.3 Transactional注解 1.3 事务进阶1.3.1 rollbackFor1.3.3 propagation1.3.3.1 介绍1.3.3.2 案例 2. AOP基础2.1 AOP概述2.2 AOP快速入门2.3 AOP核心概念 3. AOP进阶3.1 …

ai直播数字人:AI大模型应用开发的神奇世界

当AI技术的发展走向一个新的高峰,AI直播数字人逐渐成为人们关注的焦点。这种全新的数字人形态,通过大模型应用开发,带来了一个神奇世界。 在这个神奇世界里,AI直播数字人可以展现出与真实人类相媲美的外貌和声音。通过先进的图像…

方法中单独使用return关键字

一、return关键字的单独使用 二、示例代码 public class ReturnDemo {public static void main(String[] args) {chu(10,0);chu(10,2);}public static void chu(int a,int b){if (b 0) {System.out.println("除法出错,除数不能为零");return;}System.ou…

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码:https://kafka.apache.org/downloads 快速开始:https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程:主线程只负责组织消息,如果是同步发送会阻塞,如果是异…

学习笔记:顺序表和链表(一、顺序表)

首先来个导言: 1.数组的优势:下标的随机访问,物理空间连续。数组指针用[ ]或者 * , 结构体指针用 - > 2.书写习惯 test.c写出主体框架 QelList.c写出结构体、头文件、函数声明 QelList.c写出函数的实现 3.挪动:如果从前…

Oracle数据库日志文件

导读 本文讲解Oracle数据库的日志文件 Oracle数据库日志文件是数据库管理中至关重要的组成部分,它们记录了数据库系统中发生的各种事务和操作,以确保数据的一致性、完整性和可恢复性。在Oracle数据库中,主要有三种类型的日志文件:…

2024年AIGC发展现状

AIGC的发展现状呈现出一种蓬勃发展的态势。随着技术的不断进步和应用场景的不断拓展,AIGC正在逐渐成为引领新一轮科技革命和产业变革的重要力量。 在应用层创新方面,AIGC产业发展已经确定了明确的方向。AIGC应用正在率先在B端办公和生产力场景中落地&am…

APEX开发过程中需要注意的小细节3

【问题记录】在编辑数据信息时发现辩护的数据无法保存,提示 “ORA-01799: 列不能外部联接到子查询” 仅展示的数据来自主表,这部分都是关联子表重点内容,编辑时无法保存 于是想将扩展表作为主表,在主表进行修改试试 新的报错&a…

C#实现归并排序算法

C#实现归并排序算法 以下是 C# 中的归并排序算法实现示例: using System;class MergeSortAlgorithm {// 合并两个子数组static void Merge(int[] arr, int left, int mid, int right){// 计算左子数组和右子数组的长度int n1 mid - left 1;int n2 right - mid;/…

C语言从入门到精通 第十二章(程序的编译及链接)

写在前面: 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注&#xf…

MySQL表列数和行大小限制详解

MySQL表列数和行大小限制详解 MySQL在表的列数和行大小方面有一些限制,本文将对这些限制进行详细解释。 列数限制 MySQL对每个表的列数有硬限制为4096列,但对于给定的表,实际的最大列数可能会更少。确切的列限制取决于几个因素&#xff1a…

使用Python的Scrapeasy几行代码内快速抓取任何网站的信息

前言 在浏览网页时,经常会遇到喜欢的视频、音频和图片,希望将它们保存下来。通常的做法是使用浏览器的书签功能或者网站提供的收藏功能。但是,如果网站上的内容被删除,这些方式都会失效。比如在短视频网站中,如果我们…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比,实在是太短暂了,大约相当于几分钟和一年的关系。人类已经走过的路,相比今后要走的漫漫长路,只能算是刚刚起步。如果跳出一个个具体事件,站在历史的高度去看,我们会发现…

支小蜜校园防欺凌系统听到声音之后会自动识别吗

在校园安全领域,特别是在预防和应对欺凌问题上,校园防欺凌系统作为新兴的技术应用,正在受到越来越多的关注和探索。那么当这样的系统听到声音之后,它是否能够自动识别并作出相应反应呢?本文将围绕这一问题展开探讨。 …

Python通过SFTP实现网络设备配置备份

一、背景 为了防止网络设备意外损坏,导致配置文件无法恢复,可以通过将网络设备的配置文件备份到本地电脑上。 一般情况下,设备支持通过FTP、TFTP、FTPS、SFTP和SCP备份配置文件。其中使用FTP和TFTP备份配置文件比较简单,但是存在…

K线实战分析系列之十八:十字线——判断行情顶部的有效信号

K线实战分析系列之十八:十字线——判断行情顶部的有效信号 一、十字线二、十字线总结三、三种特殊十字线四、长腿十字线五、墓碑十字线六、蜻蜓十字线七、特殊十字线总结 一、十字线 重要的反转信号 幅度较大的下跌,出现一根十字线,正好是在…

编译内核错误 multiple definition of `yylloc‘

编译内核错误 # make ARCHarm CROSS_COMPILEarm-mix410-linux- uImageHOSTLD scripts/dtc/dtc /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss0x10): multiple definition of yylloc; scripts/dtc/dtc-lexer.lex.o:(.bss0x0): first defined here collect2: error: ld ret…

【Lazy ORM】 小工具 acw 本地客户端 你负责点击页面,他负责输出代码

介绍 wu-smart-acw-client 简称acw-client&#xff0c;是一个基于Lazy ORM定制的客户端代码生成小工具 Lazy ORM 小工具 acw 本地客户端 你负责点击页面&#xff0c;他负责输出代码安装 <dependency><groupId>top.wu2020</groupId><artifactId>wu-sma…

数据结构——lesson7二叉树 堆的介绍与实现

前言&#x1f49e;&#x1f49e; 啦啦啦~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于数据结构顺序表链表有疑问的都可以在上面数据结…