目前来说效果比较好的影像生成模型, 就算不是Stable Diffusion, 套路也和其相似. 而Stable Diffusion就是目前最好的影像生成模型.
How it works
目前最好的影像生成模型, 其内部基本上由三个元件组成. 第一个元件是Text Encoder, 它能把输入的文字叙述变成对应的向量; 接下来是一个Generation Model, 现如今大家使用的都是Diffusion Model, 当然使用其他模型也是可以的. 该Generation Module能够接收一个输入的杂讯和输入的文字的encoder, 然后产生一个中间产物, 这个中间产物可以是人能看的懂的, 只是比较小比较模糊的图片, 当然也可以是人完全看不懂的东西, 这个中间产物是图片被压缩以后的结果. 接下来直接套一个Decoder, 这个Decoder的作用就是将图片的压缩版本还原为原本的图片. 通常3个Module是分开训练的, 然后再组合起来.
今天我们看到的比较好的影像生成模型都是差不多的套路, 例如Stable Diffusion. 可以看到, 首先是一个Encoder可以处理输入的东西, 只是它输入的不止有文字, 还有别的可能的输入. 然后还需要一个生成的模型, Stable Diffusion内部使用的就是Diffusion Module, 接着需要一个Decoder将Diffusion Module生成出来的产物也就是图片压缩后的版本还原为原来的图片.
对于DALL-E系列, 也是同样的套路. 我们需要一个文字的Encoder先对文字进行理解, 然后需要一个生成的模型. 其实在DALL-E中, 它尝试了两个生成的模型, 可以用Autoregressive, 由于我们这里暂时生产的只是图片的压缩版本, 计算量并不算太大, 所以用Autoregressive也是一个合适的选择, 当然也可以用另一个生成模型Diffusion Module. 最后再用decoder还原为原来的图片.
Google也有一个影像生成的模型叫做Imagen, 输入一段文字叙述然后产生一张图片. 首先现需要一个Text Encoder, 然后通过影像生成模型生成图片压缩版本, 这里Google Imagen生成的就是人能看得懂的64x64的图片, 最后再生成1024x1024的大图
Framework Component
Text Encoder
首先要介绍的Component是Text Encoder. 我们可以使用GPT作为Encoder, 也可以使用更古早的Bert. 下面的实验数据表明, Text Encoder的选择对结果的影响是非常大的, 该数据来自Google Imagen的Paper, 它们使用的是一个叫T5的Encoder, 并且对不同大小的T5进行试验. 该试验将FID和CLIP作为指标, FID越小代表图片生成效果越好, 而CLIP Score则是值越大越好, 即越往右下角代表模型效果越好. 从结果可以看出, 随着用的Text Encoder越来越大, 图片生成的品质是越来越高的. 所以Text Encoder对结果影响是很大的, 一个好的Text Encoder, 能帮助它去处理影像跟文字成对的资料里面没有看过的新的词汇. 相对而言, Diffusion Module模型的大小就没那么重要了, U-Net size就是指Diffusion Module中Noise Predictor的大小, 该Paper中尝试用了不同大小的U-Net size, 发现增大Diffusion Module大小对结果帮助是非常有限的. 总之, Text Encoder对于今天模型能够有这么好的表现是非常重要的.
FID
Frechet Inception Distance
今天我们在做影像生成模型的时候, 其中一个难题就是我们该如何评价一个影像生成图像做的好与不好. 因为当我们给出一段文字的时候, 根本就没有标准答案, 或者与标准答案不同, 我们也不能断定它是错误的. 所以我们需要一个特别的方法来评价影像生成模型的好坏, 其中一个我们现如今很常用的就是FID.
FID就是要求我们有一个提前训练好的CNN Modle, 一个影像分类的Modle, 我们把机器生成的图片和真实的图片通通输入到CNN之中, 得到latent representation. 然后我们将真实的图片和生成的图片标注出来. 如果两组representation越接近, 就代表生成的影像和真实的影像越接近, 如果离得很远, 就代表两组图像非常不像.
那如何计算两组representation之间的距离呢? FID这边用的是一个比较粗糙但是有用的方法, 就是假设两组representation都是Gaussion Distribution, 然后计算两个Gaussion Distribution之间的distance, 这里算的是叫做Frechet distance. 这个计算方法虽然比较粗糙, 但是结果是比较好的, 跟人类的评估结果比较一致. 所以FID到今天仍然是一个非常常用的做法, 并且我们希望FID是越小越好. 需要注意的是, 我们需要sample出比较多的image才能计算FID.
CLIP
Contrastive Language-Image Pre-Training
CLIP是用400 million image-text pairs训练出的一个模型, 这个模型中有一个Image Encoder和一个Text Encoder, 两个Encoder分别读取一张图片和一段文字作为输入各产生一个vector. 如果这段文字和这张图片是相关的或是成对的, 这两个vector就应该是越近越好, 否则应该是越远越好. 如果CLIP高, 则说明模型生成的图和文字是对应关系的.
Decoder
Decoder在训练的时候一般就不需要影像跟文字成对的资料, 我们可以单凭大量的影像资料就可以把Decoder训练出来.
Decoder如何训练呢? 如果现在我们的中间产物是一张小图, 那我们就可以把手上的影像拿出来, 先做down sampling变成小图, 这样就有成对的资料, 然后就可以训练Decoder把小图变成大图. Imagen模型就是用这样的做法.
如果我们的中间产物不是小图, 而是某种Latent Representation, 此时我们应该训练一个Auto-Encoder, 它有一个Encoder, 输入一张图片, 输出Latent Representation, 然后通过Decoder还原为原来的图片, 我们要使得输入跟输出越接近越好. 训练完之后, 我们将Decoder拆出来用, 这样的Decoder就可以输入一个Latent Representation然后还原为一张图片. 像Stable Diffusion 和 DALL-E用的就是这样的方法.
Generation Model
Generation Model的作用就是输入文字的representation, 然后产生中间产物.
此前我们已经了解了Diffusion Model的概念, 在此处唯一不一样的的地方就是我们的Noise需要加在中间产物上, 或者说Latent Representation上. 假设我们现在是将Latent Representation作为中间产物, 我们先拿一个Encoder出来, 输入一张图片, 然后产生Latent Representation. 接着我们sample出一个杂讯, 该杂讯的dimention和latent representation的dimension是一样的, 然后将其加到Latent Representation上, 以此类推, 直到最后, 我们的Latent Representation变成纯粹杂讯的样子.
接下来就是训练一个Noise Predictor, 这跟我们一般的Diffusion Model是一模一样的, 加入杂讯后的representation, step id和文字的latent representation vector作为输入, 然后预测生成Noise
在生图的时候, 我们首先有一个纯粹从Normal Distribution中sample出来的latent representation, 大小跟小图一致, 然后将其和文字的vector输入到Denoise Module中, 滤去部分杂讯, 反复进行, 在一定次数的decoder之后我们将生成的latent representation输入到Decoder中即可.
参考:
[1] Jonathan Ho and Ajay Jain and Pieter Abbeel. Denoising Diffusion Probabilistic Models.
[2] https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php
标签:diffusion,Diffusion,Decoder,Encoder,Stable,生成,影像,图片 From: https://www.cnblogs.com/ygtrece/p/17869664.html