异步Stable Diffusion训练营笔记 - 第一周

Stable Diffusion(SD)的原理

模型:UNet

sd原理概括(非常浅浅地):输入有好多图片的数据集到模型里 => 模型学会了如何画一张新图 - 也就是输出 - 它即学会了数据集图片的大致轮廓,又学会了如何画很精致的details,甚至包括这两者之间的不特别detailed也不特别general的程度。

那如何让它学会呢?

一直一点点地给图片加噪 => 直到图片变成看起来乱七八糟几乎完全看不出来是什么东西的噪声图 => 用一个叫做sampling(采样)的方法一点点除躁 => 得到一个全新的图片。

为什么噪声图看起来明明几乎什么都不像了,模型还是能生成精致的新图呢?

注意这里是『几乎』什么都不像 - 模型还是知道它看起来像一个什么东西,并一点点生成一个『那个东西』的图片。

sd原理概括(浅浅地):输入图片数据集 => 一点一点加噪,输出一个与输入图片同大小的噪声图 => 一直这样直到得到高斯噪声(即一个乱七八糟几乎完全看不出来是什么东西的噪声图) => 再通过采样方法一点一点地除噪 => 输出一个新的图片

sd原理剖析(深一点儿):一直用downsampling block去downsample也就是卷积层,直到压缩成一个小的嵌入(embedding) => 用同样数量的upsampling block upsample回原来的图片大小 =>期间可以加入time embedding - 每一个timestep决定了我们要在这个timestep加多少噪声,这个time embedding可以直接加法加到upsampling block之前

UNet使用了residual blocks,图片的大小会被除以二

inference_steps越多,图片越detailed;但是太高的inference_steps可能会导致出现不想要的、看起来很奇怪的details

UNet使用了skip connection - 从downsample的block直接connect到对应的upsampled block。

SD的loss function是怎么运作的?

输入图片 => 把加噪过的图片输入到模型里 => 模型预测一个加入的噪声 => 和实际加入的噪声做对比 => 实际噪声和预测噪声就是loss。

采样方法(Sampling Method)

SD默认用的是DDPM - 它可以额外的预测除噪过程的方差,帮助除噪还原出精美的图片。

在采样过程中,有哪个方法可以帮助生成更精美的图片?

这个比较出乎意料 - 虽然是除噪,但是在采样(也就是除噪)过程中加入额外的noise,可以帮助生成更精美的图片。这个是可以防止出现有缺陷的,看起来有点随机的图出现。

一种更快的采样方法 - DDIM

DDIM为什么更快呢?因为它解决了两个问题 - 就是每个timestep依赖于之前的timestep(马克夫链)timestep太多。它用了skip connection,跳了一个timestep => 破坏了马克夫链 => 生成一张噪声图 => 对其除噪采样 => 让整个采样过程更确定,减少了随机性 => 加速了采样过程。但是DDIM并不是任何情况都比DDPM好,一般来说,< 500 steps DDIM胜过DDPM,不然则反之。

嵌入(Embedding)

嵌入的作用:它会尝试学习一个『意思』。比如context embedding会学习一个文字意思,就像给一张图写一个注释。

Embeddings是怎么运作的呢?

和噪声图一同加入模型,后面就是SD的原理部分了。有了多个嵌入,这些嵌入甚至可以学习到combined的『意思』

拓展 - 和SD相关的知识

VAE

VAE由什么部件组成呢?

两个,可以从VAE这个名字推出来:V = variational inference,AE = Autoencoder

什么是variational inference?

又是两个部件:KL-divergence和reconstruction loss。KL-divergence:VAE会尝试最小化KL-divergence - 即输出图看起来更像高斯噪声,与精致的图片相差很远;reconstruction loss:VAE同样也会尝试最小化这个loss - 就是要生成看起来要很精致的原图的质量相配

某测量输出图片质量的标准 - Frechet Inception Distance(FID)

FID是怎么运作的?

把输入图和输出图一并输入到一个Inception Network里 => Inception Network可以榨取输入图和输出图的表征 => 计算这两种图表征的均值和协方差 => 这两对均值和协方差就可以生成两个多元变量高斯分布 => 测量这两个分布之间的Frechet distance => 得到FID

小测验:FID值高好还是FID值低好呢?

低好。因为这证明Frechet distance低 => 输入图质量和输出图质量相近 => 如果输入图质量很精致,那么输出图也会很精致

Classifier Free Guidance (CFG)

什么是CFG?

早期的一些CV模型会用到Classifier Guidance(CG)名字上体现出了它是CFG的反面 - 就是不用CG。CG会去引导模型的生成,但是它需要一个人手标注的数据集,很麻烦;而且它需要额外再练一个模型让它变得有用,但在训练时它还会时不时地zero-out一些class embeddings,增加了训练的复杂性。它的局限性,也就导致了后面有一些研究者会倾向于CFG(但是并不是所有情况CFG都比CG好,把self-attention加入到SD的paper有提到过)。

CFG有什么好?

它有一些好处:比如不需要人手标注,减少了工作负担;有些guidance用classifier去预测很困难,那么CFG不预测就没有这个坏处;它还像一个好老师,不直接给正确答案 - 即标注,而是让模型自己去学习一个意思,不依赖于标注。

实战输出 - 赛博猫咪

模型:huggingface(hf)上的LottePeisch/SaturdayMorning

数据集:FanCaps网站上爬下来的一些宝可梦的动漫原图,大约两千张图

图片标注模型:hf上的Salesforce/blip-image-captioning-large

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值