全网最全Stable Diffusion原理快速上手,模型结构、关键组件、训练预测方式!!!!

手把手教你入门绘图超强的AI绘画程序,用户只需要输入一段图片的文字描述,即可生成精美的绘画。给大家带来了全新保姆级教程资料包(文末可获取)

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

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

大纲

  1. 关键概念
  2. 模型结构及关键组件
  3. 训练和预测方式

关键概念

名词解释

Stable Diffusion
之所以叫Stable,是因为金主公司叫StabilityAI。

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

模型任务

  1. text-2-img:输入文本描述、输出图像
  2. img-2-img:输入图片及其他文本描述,输出图像

总的来说,不论是输入是文字还是图片,都可以称为是“condition”,用于指引图像生成的“方向”。因此,SD模型的任务,可以统称为是cond-2-img任务。
在这里插入图片描述

模型结构与关键组件

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

整体输入输出
上图中最左侧的x xx和x ~ \widetilde{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框的上半部分,包括以下三步:

  1. 图像经过Encoder压缩后,得到隐向量表示z = E ( x ) z=\mathcal{E}(x)z=E(x)隐向量
  2. 从1~1000的均匀分布中,随机采样一个整数T TT,称为扩散步数
  3. 对向量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 0 以及一系列β t \beta_tβ

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

条件Conditioning

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

  1. 这些“附加信息”会通过对应的编码器τ θ \tau_\thetaτ θ ,转换成向量表示
  2. 转换后的向量,会输入给U-Net,作为其中Attention模块的K、V输入,辅助噪声的预测

在这个模块中,有几个有趣的问题:

为什么需要Conditioning

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

关键组件

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

原理

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

特点

  1. 网络计算复杂度比较低
  2. Encoder和Decoder可以分开使用
  3. 无监督训练,不需要标注输入的label
  4. 有了噪声扰动之后,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 、当前的时间戳t tt,文本等Conditioning的张量表示E EE,输出是z t中的噪声预测。

模型结构

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

降采样层

  1. 时间戳t tt转换为向量形式。用的是“Attention is All you
    Need”论文的Transformer方法,通过sin和cos函数再经过两个Linear进行变换
  2. 初始化输入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
  3. 重复以下步骤(a~c)多次,将输入尺寸降至目标尺寸(如上图的4 × 4 4\times44×4)
  4. 重复以下两步多次,训练多个ResBlock和SpatialTransformer层,输入值X XX的尺寸不变
  5. 输入上一层的输出X XX和时间戳向量,给ResBlock
  6. ResBlock的输出,与E EE一起输入给SpatialTransformer,在这里考虑到text等信息 重复多次3~4步,
  7. 通过卷积或Avg-Pooling进行降采样,缩小X XX的尺寸
    在这里插入图片描述
    在这里插入图片描述

中间层

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

上采样层

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

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

输出

即噪声的预测值,尺寸保持与输入zt 一致。

训练方式

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

  1. 输入一张图片x xx,以及它的文本描述等Conditioning,一个随机的整数T TT步
  2. 经过Encoder压缩、Diffusion加噪声,得到z T 隐向量
  3. 结合Conditioning,使用U-Net,进行T TT次去噪,得到预测值z 0 向量
  4. 使用Decoder还原回x ~ ,计算x 与x ~ 之间的差距(KL散度),得到模型更新的loss

模型预测方式

  1. 随机一个高斯噪声,作为z T 向量
  2. 输入text等Conditioning,使用U-Net进行指定次数T TT的去噪操作
  3. 使用Decoder还原回x ~ ,得到图像输出

训练、预测过程,在论文中的伪代码为下图所示。
在这里插入图片描述

AI绘画所有方向的学习路线思维导图

这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。如果下面这个学习路线能帮助大家将AI利用到自身工作上去,那么我的使命也就完成了:
在这里插入图片描述

👉stable diffusion新手0基础入门PDF👈

在这里插入图片描述

👉AI绘画必备工具👈

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
在这里插入图片描述

👉AI绘画基础+速成+进阶使用教程👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

👉12000+AI关键词大合集👈

在这里插入图片描述

这份完整版的AI绘画资料我已经打包好,戳下方蓝色字体,即可免费领取!

CSDN大礼包:《全套AI绘画基础学习资源包》免费分享

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

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

相关文章

运动耳机怎么选?2024年运动耳机推荐,运动蓝牙耳机排行榜10强

​在现代生活中,音乐和运动已经成为很多人生活不可分割的一部分。运动耳机在这样的背景下变得越来越受欢迎,它们不仅可以在运动时提供音乐的陪伴,还能增加运动时的乐趣和动力。但是,面对市面上众多不同类型的运动耳机,…

Fiddler 一个好用的监控http和https的工具

最近使用了一个好用的工具Fiddler, 可以监控客户端到服务器端的 HTTP 和 HTTPS 协议请求。 Fiddler 是一个强大的 Web 调试工具,它通过以代理服务器的方式工作,可以捕获和分析客户端与服务器之间的 HTTP 和 HTTPS 通信。可以针对特定的http请…

哈希-力扣454.四数相加Ⅱ

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 [1…

MicroPython的文件系统操作

本文介绍了MicroPython如何提供并使用设备上的文件系统&#xff0c;以及如何使用Python标准的I/O方法进行持久存储。MicroPython会自动创建默认配置并侦测主文件系统&#xff0c;同时支持修改分区、文件系统类型或自定义块设备。 文件系统通常由设备上的内部闪存支持&#xff…

面试 React 框架八股文十问十答第二期

面试 React 框架八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;redux 的工作流程&…

golang中gorm使用

前言 记录下go语言操作mysql数据库&#xff0c;选用gorm&#xff0c;gorm是一个流行的对象关系映射&#xff08;ORM&#xff09;库&#xff0c;用于简化与数据库的交互。 接入步骤 安装gorm&#xff1a;首先&#xff0c;你需要使用Go模块来安装gorm。在终端中运行以下命令&…

【Linux】nmap命令:扫描网络中的主机和端口

目录 1.扫描特定IP地址的所有端口&#xff1a; 2.扫描特定IP地址的特定端口&#xff1a; 3.扫描一个IP地址范围的端口&#xff1a; 4.扫描特定端口范围&#xff1a; 5.扫描并显示所有端口的详细信息&#xff1a; 6.扫描并输出XML格式的结果&#xff1a; 7.使用“ping…

Doris 案例篇——长安汽车基于 Doris 的车联网数据分析平台建设实践

Doris 案例篇——长安汽车基于 Doris 的车联网数据分析平台建设实践 随着消费者更安全、更舒适、更便捷的驾驶体验需求不断增长,汽车智能化已成必然趋势。长安汽车智能化研究院作为长安汽车集团有限责任公司旗下的研发机构,专注于汽车智能化技术的创新与研究。为满足各业务部…

数据结构第十一弹---堆

堆 1、堆的概念及结构2、堆的性质3、堆的调整算法3.1、向下调整算法3.2、向上调整算法 4、堆的实现4.1、头文件包含和结构定义4.2、初始化4.3、销毁4.4、插入数据4.5、删除数据 删除堆顶4.6、获取堆顶元素4.7、获取有效数据个数4.8、判断是否为空 5、代码汇总5.1、Heap.h5.2、H…

好用的设备租赁管理软件有哪些?

“我们公司是做设备租赁的&#xff0c;想找一款适合设备租赁的库存管理软件&#xff0c;最好有库存管理&#xff0c;客户信息&#xff0c;设备外调管理&#xff0c;租赁天数管理&#xff0c;设备的借出与归还信息管理与查询。” 总结一下—— 库存管理客户信息管理设备租赁管…

阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期

前言 Certbot是一款免费且开源的自动化安全证书管理工具&#xff0c;由电子前沿基金会&#xff08;EFF&#xff09;开发和维护&#xff0c;是在Linux、Apache和Nginx服务器上配置和管理SSL/TLS证书的一种机制。Certbot可以自动完成域名的认证并安装证书。 一、 安装软件 1.1…

38.深入MySQL

深入MySQL 索引 索引是关系型数据库中用来提升查询性能最为重要的手段。关系型数据库中的索引就像一本书的目录&#xff0c;我们可以想象一下&#xff0c;如果要从一本书中找出某个知识点&#xff0c;但是这本书没有目录&#xff0c;这将是意见多么可怕的事情&#xff01;我们…

JVM如何执行synchronized修饰的方法

首先市面上关于synchronized的资料已经很多了&#xff0c;但是大家对于底层的原理实现可能没有什么概念&#xff0c;大多都是死记硬背&#xff0c;所以我想通过实战的方式给大家带来一些不一样的体验。具体体现在哪些方面呢&#xff1f; 更系统。市面上目前虽然资料众多&#x…

【OpenCV学习笔记02】- 图像入门

内容 这里介绍了图像处理的入门操作&#xff0c;&#xff0c;你将学习如何读取图像&#xff0c;如何显示图像以及如何将其保存回去你将学习以下功能&#xff1a;cv.imread()&#xff0c;cv.imshow()&#xff0c;cv.imwrite() 简单使用OpenCV 读取图像 使用cv.imread()函数读…

【程序员干货】开发常用免费接口

全国快递物流地图轨迹查询&#xff1a;【H5物流轨迹、单号识别】通过物流单号和收寄件地址&#xff0c;自动评估物流时效&#xff0c;并在地图中展示包裹运输轨迹。包括顺丰、圆通、申通等主流快递公司。自动识别快递公司及单号&#xff0c;实时查询&#xff0c;稳定高效&#…

WPF 入门教程DispatcherTimer计时器

https://www.zhihu.com/tardis/bd/art/430630047?source_id1001 在 WinForms 中&#xff0c;有一个名为 Timer 的控件&#xff0c;它可以在给定的时间间隔内重复执行一个操作。WPF 也有这种可能性&#xff0c;但我们有DispatcherTimer控件&#xff0c;而不是不可见的控件。它几…

15-链表-环形链表 II

这是链表的第15题&#xff0c;力扣链接。 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链…

中科驭数诚邀您参加第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛(上海站)

低时延技术是证券基金期货领域业务系统的核心技术&#xff0c;是打造极速交易系统领先优势的关键&#xff0c;也是证券基金行业关注的前沿技术热点。 继去年圆满举办首届证券基金行业先进计算技术大会之后&#xff0c;在中国计算机学会集成电路设计专委、先进计算产业联盟、证…

在macos上查看当前进程的栈信息

概述 在调试程序时&#xff0c;如cpu莫名的高或低&#xff0c;一个常用的方式就是打印当前进行的调用栈&#xff0c;然后确认各线程的执行函数是否有异常。 在linux系统中可以使用pstack命令&#xff0c;直接打印各线程的栈信息&#xff0c;可惜在macos上没有该命令。一种解决…

25 心形按钮

效果演示 实现了一个心形的心形图案&#xff0c;当用户点击图案时&#xff0c;图案会旋转并缩小&#xff0c;同时背景颜色会变成白色。 Code <div class"love"><input id"switch" type"checkbox"><label class"love-heart&…