【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)
相关文章:

【AIGC】Stable Diffusion的建模思想、训练预测方式快速
在这篇博客中,将会用机器学习入门级描述,来介绍Stable Diffusion的关键原理。目前,网络上的使用教程非常多,本篇中不会介绍如何部署、使用或者微调SD模型。也会尽量精简语言,无公式推导,旨在理解思想。让有…...

JVM(类加载机制)
类加载就是 .class 文件, 从文件(硬盘) 被加载到内存(元数据区)中的过程 类加载的过程 加载: 找 .class 文件的过程, 打开文件, 读文件, 把文件读到内存中 验证: 检查 .class 文件的格式是否正确 .class 是一个二进制文件, 其格式有严格的说明 准备: 给类对象分配内存空间 (先在…...

C++ 实战项目之 Boost 搜索引擎
项目地址:https://gitee.com/Vertas/boost-searcher-project 1. 项目背景 日常生活中我们使用过很多搜索引擎,比如百度,搜狗,360搜索等。我们今天是要实现一个像百度这样的搜索引擎嘛?那是不可能的,因为像…...

部署LVS+Keepalived高可用群集(抢占模式,非抢占模式,延迟模式)
目录 一、LVSKeepalived高可用群集 1、实验环境 2、 主和备keepalived的配置 2.1 yum安装ipvsadm和keepalived工具 2.2 添加ip_vs模块并开启ipvsadm 2.3 修改keepalived的配置文件 2.4 调整proc响应参数,关闭linux内核的重定向参数响应 2.5 将主服务器的kee…...

性别和年龄的视频实时监测项目
注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 性别和年龄检测 Python 项目 首先介绍性别和年龄检测的高级Python项目中使用的专业术语 什么是计算机视觉? 计算机视觉是使计算机能…...

【Spring面试题】
目录 前言 1.Spring框架中的单例bean是线程安全的吗? 2.什么是AOP? 3.你们项目中有没有使用到AOP? 4.Spring中的事务是如何实现的? 5.Spring中事务失效的场景有哪些? 6.Spring的bean的生命周期。 7.Spring中的循环引用 8.构造方法…...

打车代驾小程序开发 醉酒不用怕一键找代驾
近年来,随着我国私家车市场的不断扩大,驾驶员的安全驾驶意识不断提高,以及交通法规对酒后驾驶的严格把握,代驾市场的潜力也在迸发。代驾小程序开发平台成为了代驾人不可或缺的线上接单平台。那么代驾小程序开发需要实现哪些功能呢…...

蓝桥集训之统计子矩阵
统计子矩阵 核心思想:矩阵前缀和 双指针 用i和j双指针 遍历所有子矩阵的列用s和t双指针 遍历所有子矩阵的行求其子矩阵的和 若>k 将s向下移动 矩阵和必定减小(元素个数减少)直到满足<k 因为列一定 行数即为方案数(从t行往上数到s行 共t-s1个区间[t,t][t-1,t]…...

架构师十项全能 你会几个?
架构设计导论 架构师核心能力 架构设计原则 架构设计模式 架构设计核心维度 架构图绘制 企业架构设计 分布式架构理论 微服务架构设计 响应式架构设计 架构设计评估 单元化架构设计 服务网络架构设计 DDD领域驱动设计 技术选型 服务治理设计 安全架构设计 云架构设计 数据库架构…...

数据库(mysql)-新手笔记(主外键,视图)
主外键 主键(唯一性,非空性) 主键是数据库表中的一个或多个字段,其值唯一标识表中的每一行/记录。 唯一性: 主键字段中的每个值都必须是唯一的,不能有两个或更多的记录具有相同的主键值 非空性:主键字段不能包含NULL值。 外键(引用完整 …...

西门子PLC的交互界面怎样设计?
西门子PLC的交互界面设计集中于提供一个直观、多功能且用户友好的环境,旨在使工程师和技术人员能够有效地进行编程、监控和维护。下面是一些设计西门子PLC交互界面时的关键考虑因素: 1. **图形化编程环境**:设计时,重点在于提供直…...

备份 ChatGPT 的聊天纪录
备份 ChatGPT 的聊天纪录 ChatGPT 在前阵子发生了不少次对话纪录消失的情况,让许多用户觉得困扰不已,也担心自己想留存的聊天记录消失不见。 好消息是,OpenAI 在 2023 年 4 月 11 日推出了 ChatGPT 聊天记录备份功能,无论是免费…...

支持向量机 SVM | 线性可分:软间隔模型
目录 一. 软间隔模型1. 松弛因子的解释小节 2. SVM软间隔模型总结 线性可分SVM中,若想找到分类的超平面,数据必须是线性可分的;但在实际情况中,线性数据集存在少量的异常点,导致SVM无法对数据集线性划分 也就是说&…...

基于Java的生活废品回收系统(Vue.js+SpringBoot)
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案,旨在鼓…...

Linux:好用的Linux指令
进程的Linux指令 1.查看进程信息 ps ajx | head -1 && ps ajx | grep 进程名创建一个进程后输入上述代码,会打印进程信息,当我们在code.exe中写入打印pid,ppid,这里也和进程信息一致。 while :; do ps ajx | he…...

Python Tkinter GUI 基本概念
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝如果停止,就是低谷…...

Python实习生(自动化测试脚本开发) - 面经 - TCL新技术有限公司
JD: 招聘流程: 2024.1.3 Boss直聘 沟通 2024.1.4 约面 2024.1.6 上午面试 面试流程: 上来第一步,直接问Python基础语法,讲一下基础的数据类型 就记得元组和字典 分别具体说一下元组和字典 流程控制语句有哪些&…...

遥遥领先!基于transformer变体的时间序列预测新SOTA!
目前,以CNN、RNN和 Transformer 模型为代表的深度学习算法已经超越了传统机器学习算法,成为了时间序列预测领域一个新的研究趋向。这其中,基于Transformer架构的模型在时间序列预测中取得了丰硕的成果。 Transformer模型因其强大的序列建模能…...

Java实现从本地读取CSV文件数据
一、前言 最近项目中需要实现这样一个功能,就是从本地读取CSV文件,并以指定行作为标题行,指定行开始作为数据读取行,读取数据并返回给前端,下面具体说下是如何通过java实现。 二、如何实现? 1.引入相关mav…...

数据结构(一)——概述
一、绪论 1.1数据结构的基本概念 数据:用来描述客观事物的数、计算机中是字符及所有能输入并被程序识别和处理的符号的集合。 数据元素:数据的基本单位,一个数据元素可由若干数据项组成。 数据结构:指相互之间存在一种或多种特…...

昇腾芯片解析:华为自主研发的人工智能处理器全面分析
在当今科技发展的浪潮中,昇腾芯片作为一种新兴的处理器,正引起广泛的关注和讨论。升腾芯片究竟是由哪家公司生产的?这个问题一直困扰着许多人。下面小编将全面介绍、分析升腾芯片的生产商及各类参数、应用,以便读者对其有更全面的…...

新手做抖音小店怎么快速出体验分?教给大家一个方法!
大家好,我是电商糖果 新店怎么出体验分? 这是不是很多新店商家最苦恼事情? 因为没有体验分的店铺,平台不会给推流,开了精选联盟也没有办法带货。 总之就是运营的时候,比较受限。 那么抖音小店怎么快速出…...

Apollo决策规划 - EM planner
旨在对b站老王所讲的百度Apollo - EM planner算法做浓缩版总结 0 决策规划背景 基于图搜索 优点: 可以得到全局层面最优解,适用于比较低维数的规划问题 缺点: 规划问题维数较高时,面临指数爆炸问题 基于采样 优点:…...

Qt: 事件过滤器的更多用法
不懂事件循环怎么回事的可以看下面的文章 Qt事件循环完整流程 常规使用 定义一个窗口MainWindow ,之后在窗口里添加一个事件过滤函数eventFilter,将窗口的某一个或一些字控件安装上事件过滤器。 这种情况下MainWindow 就是pushButton11的时间过滤器&am…...

解决:ModuleNotFoundError: No module named ‘paddle‘
错误显示: 原因: 环境中没有‘paddle’的python模块,但是您在尝试导入 解决方法: 1.普通方式安装: pip install paddlepaddle #安装命令 2.镜像源安装 pip install paddlepaddle -i https://pypi.tuna.tsinghua.e…...

上海雷卯可以解决YPbPr/ YCbCr接口 ESD/EOS静电浪涌问题
YPbPr /YCbCr 接口传输的是视频信号,不传输音频信号。YPbPr 和 YCbCr 都是视频信号的颜色编码格式,多应用于机顶盒(Set-top box),TV电视,投影仪,游戏机和DVD播放器。 YPbPr:是一种模拟视频接口…...

【FPGA/IC】CRC电路的Verilog实现
前言 在通信过程中由于存在各种各样的干扰因素,可能会导致发送的信息与接收的信息不一致,比如发送数据为 1010_1010,传输过程中由于某些干扰,导致接收方接收的数据却成了0110_1010。为了保证数据传输的正确性,工程师们…...

go语言添加代理
LiteIDE 工具->管理 https://mirrors.aliyun.com/goproxy/或https://goproxy.cn,direct 命令行 go env -w GOPROXYhttps://goproxy.cn,direct...

kafka 可视化工具
kafka可视化工具 随着科技发展,中间件也百花齐放。平时我们用的redis,我就会通过redisInsight-v2 来查询数据,mysql就会使用goland-ide插件来查询,都挺方便。但是kafka可视化工具就找了半天,最后还是觉得redpandadata…...

安康杯安全知识竞赛上的讲话稿
各位领导、同志们: 经过近半个月时间的准备,南五十家子镇平泉首届安康杯安全生产知识竞赛初赛在今天圆满落下帏幕,经过紧张激烈的角逐, 代表队、 代表队和 代表队分别获得本次竞赛的第一、二、三名让我们以热烈的掌声表示祝…...