Stable Diffusion模型基础

一、数学基础

1. 正态分布标准化

对于一个服从高斯分布的随机变量x\sim N(\mu ,\sigma ^2),计算其均值\mu和标准差\sigma。“标准正态分布”,就是取\mu=0\sigma ^2=1正态分布给出的,其概率密度函数为:

f(x)=\frac{1}{\sqrt{2 \pi}} e^{\frac{-x^{2}}{2}}

对于任意一个正太分布的概率密度函数积分:

\begin{aligned} \int f(x) \mathrm{d} x & =\int \frac{1}{\sqrt{2 \pi \sigma^{2}}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}} \mathrm{~d} x \\ & =\int \frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^{2}} \mathrm{~d} x \\ & =\int \frac{1}{\sqrt{2 \pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^{2}} \mathrm{~d}\left(\frac{x-\mu}{\sigma}\right) \end{aligned}

z=\frac{x-\mu }{\sigma },上边公式就变成了:

\int \frac{1}{\sqrt{2 \pi}} e^{-\frac{z^{2}}{2}} \mathrm{~d} z

可以得到新的随机变量z=\frac{x-\mu }{\sigma },符合标准正太分布。

所以对于一个服从高斯分布的随机变量x\sim N(\mu ,\sigma ^2),取z=\frac{x-\mu }{\sigma }即可将其转化为标准正态分布z\sim N(0 ,1)

2. 参数重整化

若希望从高斯分布N(\mu ,\sigma ^2)中采样,可以先从标准分布 N(0,1)采样出z,再得到\sigma *z+\mu,这就是我们想要采样的结果。这样做的好处是将随机性转移到了z这个常量上,而\sigma\mu则当作仿射变换网络的一部分。

二、DDPM模型

1. 模型总览

DDPM(Denoising Diffusion Probalistic Models)是一种用于图片生成的扩散模型。如下图所示,DDPM模型主要分为两个过程:forward加噪过程(从右往左)和reverse去噪过程(从左往右)。

加噪过程:向数据集的真实图片中逐步加入高斯噪声,加噪过程满足一定的数学规律,不进行模型学习。

去噪过程:对加了噪声的图片逐步去噪,从而还原出真实图片,去噪过程则采用神经网络来学习。

2. 扩散过程(加噪)

2.1 定义

  • T :总步数

  • x_0,x_1,...,x_T:每一步产生的图片,其中x_0是原始图片,x_T是纯高斯噪声

  • \epsilon \sim N(0,I):为每一步添加的高斯噪声

  • q(x_t | x_{t-1}):指通过向图像x_{t-1}中添加高斯噪声,得到x_t

根据上面的流程图,有x_t=x_{t-1}+\epsilon=x_0+\epsilon_0+\epsilon_1+...+\epsilon,根据公式,为了得到x_t,需要sample好多次噪声,可以使用重参数进行简化。

2.2 重参数

在由x_{t-1}加噪至x_t的过程中,噪声的标准差/方差是以一个在区间(0,1内的固定值\beta_{T}来确定的,均值是以固定值\beta_{T}和当前时刻的图片数据x_{t-1}来确定的,加噪过程可以写成公式:

\begin{array}{c} q\left(\mathbf{x}_{t} \mid \mathbf{x}_{t-1}\right)=\mathcal{N}\left(\mathbf{x}_{t} ; \sqrt{1-\beta_{t}} \mathbf{x}_{t-1}, \beta_{t} \mathbf{I}\right) \\ \\ q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_{0}\right)=\prod_{t=1}^{T} q\left(\mathbf{x}_{t} \mid \mathbf{x}_{t-1}\right) \end{array}

上式意思是:由x_{t-1}得到x_t的过程q(x_t | x_{t-1}),满足分布\mathcal{N}\left(\mathbf{x}_{t} ; \sqrt{1-\beta_{t}} \mathbf{x}_{t-1}, \beta_{t} \mathbf{I}\right)。(这个分布是指以\sqrt{1-\beta_{t}} \mathbf{x}_{t-1}为均值,\beta_{t} \mathbf{I}为方差的高斯分布)。因此我们看到这个噪声只由\beta_{t}x_{t-1}来确定,是一个固定值而不是一个可学习过程。因此,只要我们有了x_0,并且提前确定每一步的固定值\beta_{1},...,\beta_{T},我们就可以推出任意一步的加噪数据x_{1},...,x_{T}。这里加噪过程是一个马尔科夫链过程。

借助参数重整化\sigma *z+\mu可以写成:

\mathbf{x}_{t}=\sqrt{1-\beta_{t}} \mathbf{x}_{t-1}+\sqrt{\beta_{t}} \epsilon

其中\epsilon \sim \mathcal{N}(\mathbf{0}, \mathbf{I}),是从标准高斯分布中采样的噪声。

2.3 任意时刻数据x_t的计算

在逐步加噪的过程中,我们其实并不需要一步一步地从x_0,x_1,...去迭代得到x_t。事实上,我们可以直接从x_0和固定值\left\{\beta_{T} \in(0,1)\right\}_{t=1}^{T}序列直接计算得到。

  • \bar{\alpha}_{1},\bar{\alpha}_{2},...,\bar{\alpha}_{T}:一系列常数,类似于超参数,随着T的增加越来越小

  • \beta_{1},\beta_{2},...,\beta_{T}:一系列常数,是我们直接设定的超参数,随着T的增加越来越大

定义\alpha_{t}=1-\beta_{t}, \quad \bar{\alpha}_{t}=\prod_{i=1}^{T} \alpha_{i},根据上面的重参数得到的递推公式,得到:

\begin{aligned} \mathbf{x}_{t}=\sqrt{\alpha}_{t} \mathbf{x}_{t-1}+\sqrt{1-\alpha}_{t} \epsilon \\ =\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon \end{aligned}

现在,只需要sample一次噪声,就可以直接从x_0得到x_t了。

  1. 逆扩散过程

由于加噪过程只是按照设定好的超参数进行前向加噪,本身不经过模型,但去噪过程是真正训练并使用模型的过程。定义p_\theta (x_{t-1}|x_{t})表示去噪过程,其中\theta表示模型参数。

如上图所示,从第T个timestep开始,模型的输入为x_t与当前timestept。模型中蕴含一个噪声预测器(UNet),它会根据当前的输入预测出噪声。然后,将当前图片减去预测出来的噪声,就可以得到去噪后的图片。重复这个过程,直到还原出原始图片x_0为止。可以看到,每一步的预测需要前一步的图片信息和timestep,timestep的表达类似于位置编码,需要告诉模型,现在进行的是哪一步去噪。

  1. 训练与推理步骤

DDPM的训练流程如下图左边部分,推理流程如下图右边部分:

4.1 训练流程

由加噪过程可知:

  • 在第t个时刻的输入图片可以表示为:\mathbf{x}_{t}=\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon

  • 噪声真值表示为:在第t个时刻sample出来的噪声\epsilon \sim \mathcal{N}(\mathbf{0}, \mathbf{I})

  • 预测出来的噪声表示为:\epsilon_\theta (\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon, t),其中\theta为模型参数,表示预测出的噪声和模型相关。

  • loss:loss = \epsilon - \epsilon_\theta (\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon, t),只需要最小化该loss即可。

由于不管对任何输入数据,不管对它的任何一步,模型在每一步做的都是去预测一个来自高斯分布的噪声。因此,整个训练过程可以设置为:

  • 从训练数据中,抽样出一条x_0(即x_0\sim q(x_0))

  • 随机抽样出一个timestep。(即t \sim Uniform(1,...,T)

  • 随机抽样出一个噪声。(即\epsilon \sim \mathcal{N}(\mathbf{0}, \mathbf{I})

  • 计算:loss = \epsilon - \epsilon_\theta (\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon, t)

  • 计算梯度,更新模型,重复上面过程,直至收敛。

4.2 推理流程

推理流程需要串行执行,我们从最后一个时刻(T)开始,传入一个纯噪声(或者是一张加了噪声的图片),逐步去噪。根据 \mathbf{x}_{t}=\sqrt{\bar{\alpha}_{t}} \mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}} \epsilon,我们可以进一步推出x_tx_{t-1}的关系(上图的前半部分)。而图中\sigma_t z一项,则不是直接推导而来的,是我们为了增加推理中的随机性,而额外增添的一项。可以类比于GPT中为了增加回答的多样性,不是选择概率最大的那个token,而是在topN中再引入方法进行随机选择。

三、SD模型

SD是一个基于latent的扩散模型 ,它在UNet中引入text condition来实现基于文本生成图像。基于latent的扩散模型的优势在于计算效率更高效,因为图像的latent空间要比图像pixel空间要小,这也是SD的核心优势。

1. 结构介绍

整体输入输出:

上图中最左侧的x\tilde{x}是模型的输入输出,比如 [W,H,C] 的三维张量,代表图片的宽、高和通道数。这里的 x 是模型训练的原始图片输入,推理时使用的是最右侧的 Images 模块。

像素空间与隐空间:

  • 像素空间(Pixel Space),上图左侧,红框部分。通常是人眼可以识别的图像内容。

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

  • 像素 -> 隐空间:经过Encoder,转化为张量z,即称为隐空间。

  • 隐空间 -> 像素空间:经过Decoder,转换回像素空间。

Diffusion Process:

对隐向量添加噪声,按照DDPM模型的流程,采样一组高斯分布噪声,通过公式推导,得到 z_T 向量。

Denoising Process:

Conditioning:

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

  • 这些“附加信息”会通过对应的编码器 ,转换成向量表示\tau_\theta

  • 转换后的向量,会输入给U-Net,作为其中Attention模块的K、V输入,辅助噪声的预测。

2. 主要部分

2.1 VAE

作用就是将原始图片转换到隐空间,经过处理再转换回来,使用的就是VAE的Encoder和Decoder。这个模块是预训练好的,固定住参数。

原理:

  1. 原始张量输入,经过非常简单的网络结构,转换成较小的张量

  2. 在Latent张量上,加一点点噪声扰动

  3. 用对称的简单网络结构,还原回原始大小

  4. 对比输入前后的张量是否相似

特点:

  1. 网络计算复杂度比较低

  2. Encoder和Decoder可以分开使用

  3. 无监督训练,不需要标注输入的label

  4. 有了噪声扰动之后,Latent Space的距离具有实际物理含义,可以实现例如“(满杯水+空杯子)/ 2 = 半杯水”的操作

2.2 CLIP

文本信息转化为向量,此模块是预训练好的,固定住参数。

训练方式:

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

2.3 U-Net

作为核心组件,U-Net是模型训练过程中,唯一需要参数更新的部分。在这个结构中,输入是带有噪声的隐向量z_t、当前的时间戳t,文本等Conditioning的张量表示E,输出是z_t中的噪声预测。

UNet是一个语义分割模型,其主要执行过程与其它语义分割模型类似,首先利用卷积进行下采样,然后提取出一层又一层的特征,利用这一层又一层的特征,其再进行上采样,最后得出一个每个像素点对应其种类的图像。Unet中网络层越深得到的特征图,有着更大的视野域,浅层卷积关注纹理特征,深层网络关注本质的那种特征,所以深层浅层特征都是有格子的意义的;另外一点是通过反卷积得到的更大的尺寸的特征图的边缘,是缺少信息的,毕竟每一次下采样提炼特征的同时,也必然会损失一些边缘特征,而失去的特征并不能从上采样中找回,因此通过特征的拼接,来实现边缘特征的一个找回。

模型结构:

U-Net大致上可以分为三块:降采样层、中间层、上采样层。

参考文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352