DDPM研究

 @halomaster 07 Sep 2022, 19:47 GMT【AI】 

我认为,在Stable Diffusion的两阶段训练过程中,第一个阶段训练AE,第二个阶段训练一个Diffusion模型; 可以这么理解,AE是空间表征,Diffusion是时间轴表征。 扩散模型的逐步扩散,本质就是把 一个图像的绘制过程在时间轴展开。 而,原有的AE部分,本质还是对图片空间表征的压缩。 1. Diffusion model的核心是通过逐步扩散的过程,把图片信息在时间轴展开。 2. 在AE或者ViT等空间表征模块里记录下Basis。 可以从压缩感知的角度理解,2=构建Basis基,1=重建信号。 或者说: 高斯分布 = 白纸 降一次噪 = 画一笔 扩散过程使得一个跳跃的过程,变成连续可学习的过程。 --------------------------------- [【Diffusion Model 直观理解 @ colab】](https://colab.research.google.com/drive/1VEaS04pFvKwlczjGiv_3VEOBGcGffgup?usp=sharing) ![article-Figure3-1-1536x762.png](https://s2.loli.net/2022/09/14/kIJr7OS96K3wvAf.png) ![stable_diffusion.png](https://s2.loli.net/2022/09/16/1NqMz8wlDergcWB.png) -------------------------------- **为什么潜扩散快速有效?** 由于潜在扩散模型的 U-Net 在低维空间上运行,因此与像素空间扩散模型相比,它大大降低了内存和计算需求。 例如,Stable Diffusion 中使用的自动编码器的缩减因子为 8。这意味着形状为 `(3, 512, 512)` 的图像在潜在空间中变为`(3, 64, 64)`,这需要`8 × 8 = 64 倍内存。 这就是为什么即使在 16GB Colab GPU 上也能如此快速地生成“512 × 512”图像的原因! -------------------------------- 调度器 - 调度程序是在推理和训练中使用扩散模型的算法。它们包括噪声时间表并定义特定于算法的扩散步骤。 - 调度器可以在推理中的扩散模型之间互换使用,以找到速度和生成质量之间的首选折衷。 - 调度程序在 numpy 中可用,但可以轻松转换为 PyTorch。 https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers -------------------------------- 关于`文本引导生成`的部分在GLIDE模型里面介绍的比较多。 stable diffusion 也是类似。 可以这么理解: - 训练的时候:文本张量(来自CLIP)叠加在图片的latent code上,实现一种 “水印”效果。模型就会学习到这个水印; - 推理的时候:文本张量(来自CLIP)引导注意力机制,把绘画的注意力(也就是降噪)放在“水印”指引的方向上。 -------------------------------- [【DDPM模型】](https://zhuanlan.zhihu.com/p/523960047) [【DDPM:Denoising Diffusion Probabiblistic Model 去噪扩散概率模型学习笔记】](https://zhuanlan.zhihu.com/p/502668154) [【What are Diffusion Models?】](https://lilianweng.github.io/posts/2021-07-11-diffusion-models/) 扩散过程 - 扩散过程是一个具有固定参数的马尔科夫链,在每一步都向数据中添加微小的高斯噪声,最终将原始数据逐渐转换为高斯分布。 反向过程 - 反向过程是具有可学习参数的马尔科夫链,是扩散过程的反过程,从高斯白噪声中恢复原始数据。 [【Generative Modeling by Estimating Gradients of the Data Distribution】](https://yang-song.net/blog/2021/score/) 朗之万动力学 ![下载.png](https://s2.loli.net/2022/09/08/4dFSRG9MrWcJkOw.png) ![image.png](https://s2.loli.net/2022/09/08/xOZr6wYHyL4IbB2.png) 扩散模型也是生成模型,扩散模型背后的直觉来源于物理学。在物理学中气体分子从高浓度区域扩散到低浓度区域,这与由于噪声的干扰而导致的信息丢失是相似的。所以通过引入噪声,然后尝试通过去噪来生成图像。在一段时间内通过多次迭代,模型每次在给定一些噪声输入的情况下学习生成新图像。

[1] @halomaster • 14 Sep 2022, 05:02 GMT 
[【简述马尔可夫链【通俗易懂】】](https://zhuanlan.zhihu.com/p/448575579)

[2] @halomaster • 14 Sep 2022, 05:03 GMT 
The future is independent of the past given the present 未来独立于过去,只基于当下。 这句人生哲理的话也代表了马尔科夫链的思想:过去所有的信息都已经被保存到了现在的状态,基于现在就可以预测未来。

[3] @halomaster • 14 Sep 2022, 05:04 GMT 
马尔科夫链为状态空间中经过从一个状态到另一个状态的转换的随机过程,该过程要求具备“无记忆性 ”,即下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。这种特定类型的“无记忆性 ”称作马尔可夫性质。

[4] @halomaster • 14 Sep 2022, 05:06 GMT 
状态转移矩阵有一个非常重要的特性,经过一定有限次数序列的转换,最终一定可以得到一个稳定的概率分布 ,且与初始状态概率分布无关。

[5] @halomaster • 14 Sep 2022, 05:07 GMT 
只有满足马尔科夫链的特性,才属于马尔科夫链过程。例如对于不放回的袋中取球问题:显然当前取球的概率,不仅和我最后一次取的球的颜色有关,也和我之前每一次取球的颜色有关,所以这个过程不是一个马尔科夫链过程。 如果是放回的袋中取球问题,这就建立了一个马尔科夫随机过程。

[6] @halomaster • 14 Sep 2022, 14:17 GMT 
目前业界出现的扩散模型变体层出不穷,但它们都有一个不变的核心:都是围绕随机噪声去除这个概念建立的。 扩散模型的本质,以及目前我们对扩散模型的理解,都与高斯噪声在训练和生成过程中所起的作用高度相关。我们可以将「扩散」理解为使用 Langevin 动力学围绕图像密度函数的随机移动,扩散的每一步都需要高斯噪声。扩散始于「高温」状态(即噪音很大的状态),然后逐渐降温到几乎没有噪音的「冷」状态。 而在一篇叫做“Cold Diffusion: Inverting Arbitrary Image Transforms Without Noise”的最新论文中,作者提出了一个疑问:制作扩散模型的变体,是不是非得使用高斯噪声不可?

[7] @halomaster • 14 Sep 2022, 14:28 GMT 
马里兰大学副教授 Tom Goldstein 解释,扩散模型的优点是它可以最小化凸回归损失,所以 OpenAI 在开发 DALLE 时直接抛弃了 GAN,而使用扩散模型来解决不稳定的鞍点问题(saddle point problem)。 而且,他认为,扩散模型的成功是新数学范式发挥其作用的一个例子,世界上所有的超参数调整都比不过几行深思熟虑的数学公式。 要说今天的文本生成图像领域已经由扩散模型统治或许还不够严谨,但 GAN 的一家独大的确已经成为历史。归根结底,谁的图像生成质量和稳定性更好,谁才在越来越卷的生成模型界成为宠儿。

[8] @halomaster • 14 Sep 2022, 14:37 GMT 
[【扩散模型背后数学太难了,啃不动?谷歌用统一视角讲明白了】](https://mp.weixin.qq.com/s/v14V_sMPhMVrtw2EKMISQQ)

[9] @halomaster • 15 Sep 2022, 05:10 GMT 
Classifier-Free方案,最早出自《Classifier-Free Diffusion Guidance》,后来的DALL·E 2、Imagen等吸引人眼球的模型基本上都是以它为基础做的,值得一提的是,该论文上个月才放到Arxiv上,但事实上去年已经中了NeurIPS 2021。应该说,Classifier-Free方案本身没什么理论上的技巧,它是条件扩散模型最朴素的方案,出现得晚只是因为重新训练扩散模型的成本较大吧,在数据和算力都比较充裕的前提下,Classifier-Free方案变现出了令人惊叹的细节控制能力。 作者:苏剑林 链接:https://zhuanlan.zhihu.com/p/564385053 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

[10] @halomaster • 18 Sep 2022, 14:59 GMT 
一个非常不错的视频:https://www.bilibili.com/video/BV1ve411M7xj?spm_id_from=333.999.0.0&vd_source=21404b521584761d805ea03813b36624

[11] @halomaster • 18 Sep 2022, 15:01 GMT 
资源列表: - Colab Notebook: https://colab.research.google.com/drive/1sjy9odlSSy0RBVgMTgP7s99NXsqglsUL?usp=sharing - DDPM: https://arxiv.org/pdf/2006.11239.pdf - DDPM改进版: https://arxiv.org/pdf/2105.05233.pdf - 超赞的扩散模型Github: https://github.com/heejkoo/Awesome-Diffusion-Models - Positional Embeddings: https://machinelearningmastery.com/a-gentle-introduction-to-positional-encoding-in-transformer-models-part-1/

[12] @halomaster • 18 Sep 2022, 15:29 GMT 
不用高斯噪音也可以训练扩散模型了: Cold Diffusion: Inverting Arbitrary Image Transforms Without Noise https://github.com/arpitbansal297/Cold-Diffusion-Models

[13] @halomaster • 18 Sep 2022, 15:41 GMT 
更多colab https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/annotated_diffusion.ipynb#scrollTo=3a159023

[14] @halomaster • 19 Sep 2022, 00:19 GMT 
[High-Resolution Image Synthesis with Latent Diffusion Models](https://arxiv.org/abs/2112.10752)

[15] @halomaster • 03 Oct 2022, 15:33 GMT 
[【vae和重参数化技巧】](https://zhuanlan.zhihu.com/p/570269617)

[16] @halomaster • 04 Oct 2022, 12:57 GMT 
[全网最简单的扩散模型DDPM教程](https://zhuanlan.zhihu.com/p/566618077)

[17] @halomaster • 04 Oct 2022, 14:14 GMT 
所谓重参数技巧,就是把参数重新整理以满足计算需求。 例如在DDPM里,为把采样带来的随机性剥离掉,以便实现模型的可导(可解析),就是用重参数技巧来处理,把 随机性做成一个外部输入的常量z~N,从而达到可导,进而可以反向传播梯度。

[18] @halomaster • 07 Oct 2022, 16:58 GMT 
包含了`引导扩散`的关键解释:https://zhuanlan.zhihu.com/p/505257039

[19] @halomaster • 11 Oct 2022, 00:28 GMT 
[DDIM](https://www.bilibili.com/video/BV1JY4y1N7dn/?spm_id_from=333.337.search-card.all.click&vd_source=21404b521584761d805ea03813b36624)

[20] @halomaster • 17 Oct 2022, 05:24 GMT 
总之,我们定义这么一个过程:给一张图片逐步加噪声直到变成纯粹的噪声,然后对噪声进行去噪得到真实的图片。所谓的扩散模型就是让神经网络学习这个去除噪声的方法。 所谓的加噪声,就是基于稍微干净的图片计算一个(多维)高斯分布(每个像素点都有一个高斯分布,`且均值就是这个像素点的值`,方差是预先定义的 ),然后从这个多维分布中抽样一个数据出来,这个数据就是加噪之后的结果。显然,如果方差非常非常小,那么每个抽样得到的像素点就和原本的像素点的值非常接近,也就是加了一个非常非常小的噪声。如果方差比较大,那么抽样结果就会和原本的结果差距较大。 去噪声也是同理,我们基于稍微噪声的图片 计算一个条件分布,我们希望从这个分布中抽样得到的是相比于 更加接近真实图片的稍微干净的图片。我们假设这样的条件分布是存在的,并且也是个高斯分布,那么我们只需要知道均值和方差就可以了。问题是这个均值和方差是无法直接计算的,所以用神经网络去学习近似这样一个高斯分布。

[21] @halomaster • 17 Oct 2022, 05:26 GMT 
https://zhuanlan.zhihu.com/p/572161541

[22] @halomaster • 18 Oct 2022, 06:49 GMT 
[High Quality Text to Image Generation using Stable Diffusion, GFPGAN,Real-ESR and Swin IR](https://github.com/HemantKArya/HqStableDiffusionColab)

[23] @halomaster • 18 Oct 2022, 18:31 GMT 
关于在潜在向量空间里做扩散这件事,原作者提到了三个压缩:感知压缩,语义压缩和空间压缩。笔者在这里简单提及一下。如果将图片理解为一个二维平面上的空间信号的话,图像的频率则可以理解为灰度信息(信号幅值)在空间中变化的情况。如果学过图像的傅立叶频谱图的应该可以理解图像里的高频信息往往对应着图像里的细节,边角等信息,但是在图像里很多的高频信息人类其实是难以感觉到的(这也是JPEG格式压缩的核心理念之一)。SD背后的主要架构非常类似于VQGAN,但注意类似却绝不等同。这也是本文的核心创新点。VQGAN可以理解为VQVAE+GAN+Perceptual-Loss。SD借鉴了VQGAN的思想,用编码器对输入图像进行了压缩实质上丢弃了一些不那么重要的高频信息,降低了扩散所需拟合的难度(之所以称为感知压缩主要来自于VQGAN训练时的感知损失保证了压缩过程中和重构后的感知信息的对齐)。而对于VQGAN里的解码器部分,其需要从潜在空间里提取出高维的语义特征来重构原图。所以解码器的训练目标是使得潜在空间向量集必须包含足够的语义信息以供重构,对应了原文里提到的语义压缩。最后提到空间压缩。原论文对比了VQGAN和DALL-E(架构相似)。我们可以通过下面两张图看到,VQGAN如果没有足够的空间压缩比例,则学习到的潜在空间向量无法获得足够的感受野(即VQGAN说的不够context-rich),生成的质量不够高。而反观Stable-Diffusion的方法压缩的比例只有四倍,不需要像VQGAN一样进行多次上采样。较小的空间压缩比例(保留了大量空间结构非常适配扩散模型里的U-NET架构)使得生成相较于之前的其他做法更加清晰,准确和富有细节。注意这里提到的U-NET架构,这也是区分SD里的架构和VQGAN的重要点。VQGAN或者DALL-E都使用了Transformer架构将潜在空间里的离散索引序列的建模问题转化为了一维的序列生成问题。而相较于此,U-NET的归纳偏置更好地捕捉了潜在向量间的关系,所以能够更好地生成。 https://zhuanlan.zhihu.com/p/572156692

1 of 1 pages  23 replies