Antkillerfarm Hacking V7.0

Flow-based Model, Diffusion Model, Autoregressive Model

2023-01-17

Flow-based Model

Flow-based Model是GAN和VAE之外的另一大类生成模型方法。

从表面来看,Flow-based Model和VAE非常类似,无非把Encoder和Decoder换成了Flow和它的Inverse,但是实际上两者不仅数学原理不同,具体的训练方法也有极大差异。上图说是照骗也不为过。

以下内容主要参考了李宏毅老师的课件:

http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2019/Lecture/FLOW%20(v7).pdf

还有以下笔记:

http://www.seeprettyface.com/pdf/Note_Flow.pdf

Flow-based Model的训练过程是用图片x通过网络\(f(x)\)生成随机数z。由于这个经过巧妙构造的\(f(x)\)具有可直接得到的可逆函数\(f^{-1}(z)\),所以在推理阶段,无需任何额外处理,即可直接由\(f^{-1}(z)\),从随机数z得到图片x。

随机数z可以是任意分布,但通常为了理论推导的简单,而使用正态分布,即所谓的Normalizing Flow。

Flow-based Model的理论不算复杂,难点主要在于如何构造可逆的函数G。目前已经有了一些成熟的构造方法,但相对于网络结构的千变万化,构造方法的种类就少的太多了。主流的大概也就是NICE、RealNVP和GLOW。

最初的NICE实现了从A分布到高斯分布的可逆求解;后来RealNVP实现了从A分布到条件非高斯分布的可逆求解;而最新的GLOW,实现了从A分布到B分布的可逆求解,其中B分布可以是与A分布同样复杂的分布,这意味着给定两堆图片,GLOW能够实现这两堆图片间的任意转换。

我们以NICE为例,介绍一下Flow-based Model的基本套路。

首先,\(G^{-1}\)必须是存在的且能被算出,这意味着G的输入和输出的维度必须是一致的并且G的行列式不能为0。因此,z和x的形状必须完全一致。

作为一个生成模型自然希望自己产生的数据的概率越高越好。因此这里的优化目标就是:

\[G^*=\arg \max_{G} \sum_{i=1}^m\log p_{G}(x^i)\]

这里不加证明的给出结论:

\[\log p_{G}(x^i)=\log \pi(G^{-1}(x^i))+\log |det(J_{G^{-1}})|\]

这里的第一项实际上就是\(\log \pi(z^i)\)。显然,当z为0时,正态分布的概率最大。

然而这会导致\(det(J_{G^{-1}})=0\),也就是第二项为\(-\infty\)。

所以z必须在两项之间平衡,才能得到最大值。这个平衡点就是我们的优化目标。

NICE采用了一种称为耦合层(Coupling Layer)的设计,如下图所示:

z和x都会被拆分成两个部分,分别是前1~d维和后d+1~D维。

z的1~d维直接复制(copy)给x的1~d维;z的d+1~D维分别通过F和H两个神经网络,通过仿射计算(affine)传递给x。

由于F和H的结果仅仅是系数,求偏导数的时候,会被当成常数,所以对于从\(G^{-1}\)构建G没有什么影响。

如果一层变换的表现力不足的话,我们也可以多做几层变换。需要注意的是,z的1~d维直接复制(copy)给x的1~d维的方式中的copy操作,对于生成模型的表现力会有影响。(总不可能生成图片的一部分还是随机噪声吧。)所以多层变换的话,需要使用交错的方式,组合copy操作和affine操作。

Masked Autoregressive Flow

Inverse Autoregressive Flow

参考:

https://zhuanlan.zhihu.com/p/44304684

Normalizing Flow小结

https://www.jianshu.com/p/66393cebe8ba

标准化流(Normalizing Flow)教程(一)

https://www.jianshu.com/p/db72c38233f3

标准化流(Normalizing Flow)(二):现代标准化流技术

https://mp.weixin.qq.com/s/oUQuHvy0lYco4HsocqvH3Q

Normalizing Flows入门(上)

https://mp.weixin.qq.com/s/XtlK3m-EHgFRKrtcwJHZCw

Normalizing Flows入门(中)

https://mp.weixin.qq.com/s/TRgTFBz_NmBJygQjOYwdqw

GAN/VAE地位难保?Flow在零样本识别任务上大显身手

https://mp.weixin.qq.com/s/xMO9jhzQH6P5NEA_D-uyIA

这个模型的脑补能力比GAN更强,ETH提出新型超分辨率模型SRFlow

https://zhuanlan.zhihu.com/p/351479696

基于流的生成模型-Flow based generative models

https://mp.weixin.qq.com/s/KrvW16GAxSGAPOCYYKbGUg

生成模型:标准化流(Normalized Flow)

https://lilianweng.github.io/posts/2018-10-13-flow-models/

Flow-based Deep Generative Models

Diffusion Model

Diffusion Model也是一类生成模型方法。

Diffusion Model主要通过采样的方法,不断逼近模型的数据分布,从而生成数据。基本原理和VAE一样仍然是Markov Chain Monte Carlo。

以下以Stable Diffusion模型为例,介绍一下Diffusion Model的套路。

我们首先来看一下Stable Diffusion的流水线:

1.输入是一段文字,或者是一段文字+一张背景图片,输出是一张生成的图片。

2.Text Encoder用于NLP。

3.Image Decoder用于生成图片。

4.上述这些部分都是很常规的,中间的Image Information Creator才是Stable Diffusion的关键。

如上图所示,Image Information Creator的输入是一个随机的噪声,而输出是一个information tensor。无论是噪声,还是information tensor都属于Information World,而最后生成的图片属于Visual World。

早期的原始Diffusion Model并没有这种World的划分,而是直接由噪声得到图片,所以很不Stable。

从上图可以看出:Diffusion Model由于天生就是渐变的迭代过程,因此在流程的可控性上很有优势。

当时间宽裕时可以通过高轮次的迭代获得高质量的合成样本,同时较低轮次的快速合成也可以得到没有明显瑕疵的合成样本。(仍以上图为例,实际上Step 4的图片就已经相当OK了。)而高低轮次迭代之间完全不需要重新训练模型,只用手动调整一些轮次相关的参数。

因此,很自然的又有了Cascaded Diffusion Models。

论文:

《Cascaded Diffusion Models for High Fidelity Image Generation》

回到Stable Diffusion本身,我们先看一下没有两种World划分的Diffusion Model是怎么训练的。

首先我们生成一堆的随机噪声,然后随机选择其中一种噪声,添加到图片上。这样就得到了一组数据集:

我们的目标就是训练一个噪声预测模型。

用预测的噪声和原始生成的噪声做对比,计算loss。

推理的时候,首先生成一组噪声图片,放入Noise Predictor,生成预测的噪声。然后用噪声图片-预测的噪声就得到了生成的图片。这个去噪过程,也可以进行多个Step。显然Step越多,图片质量越高。

多个Step其实也是一种变相的加深网络方法。

使用两种World划分的Stable Diffusion,还要再复杂一些,但也不多了。

Image Decoder部分使用传统的AutoEncoder进行训练。

这样Diffusion过程就可以在Information World中进行了。

参考:

https://jalammar.github.io/illustrated-stable-diffusion/

The Illustrated Stable Diffusion

https://lilianweng.github.io/lil-log/2021/07/11/diffusion-models.html

What are Diffusion Models?

https://zhuanlan.zhihu.com/p/366004028

另辟蹊径—Denoising Diffusion Probabilistic一种从噪音中剥离出图像/音频的模型

https://zhuanlan.zhihu.com/p/384144179

Denoising Diffusion Probabilistic Model(DDPM)

https://zhuanlan.zhihu.com/p/377603135

Diffusion Probabilistic Model

https://yang-song.github.io/blog/2021/score/

Generative Modeling by Estimating Gradients of the Data Distribution

https://www.zhihu.com/question/536012286

diffusion model最近在图像生成领域大红大紫,如何看待它的风头开始超过GAN?

https://www.zhihu.com/question/558475081

AI绘画过去也一直有研究,为什么会在最近几个月突然爆发?

https://mp.weixin.qq.com/s/G50p0SDQLSghTnMAOK6BMA

Diffusion Model

https://zhuanlan.zhihu.com/p/549623622

Diffusion Models:生成扩散模型

https://www.zhihu.com/question/549222340

国内有没有类似于Disco Diffusion的AI绘画工具?

https://zhuanlan.zhihu.com/p/617905470

Stable Diffussion显存不够用的拯救者插件

https://www.zhihu.com/question/577079491

stable diffusion的技术原理是什么?

https://zhuanlan.zhihu.com/p/617134893

文生图模型之Stable Diffusion

Autoregressive Model

AR vs AE的相关内容在《Attention(七)》中已有描述,这里不再赘述。

Autoregressive Model实际上是最古老的生成模型,比GAN/VAE/Flow/Diffusion都要古老。

这里以PixelCNN为例介绍一下AR Model的原理。

PixelCNN简单来说就是按照从左到右,从上到下的顺序依次生成图片。表面上和Diffusion Model差不多,也是若干step的生成过程。

但是有个问题就是中间步骤不能省略。比如一张28x28的图片,如果一次出1个点的话,一共就要28x28个step。少了其中的某一步,图片就不完整了。而且显然一次出1个点的模型一定和一次出2个点的模型是不一样的。

但Diffusion Model就无所谓了,少了某一步,无非少了一种Noise Predictor而已,不会对结果有什么根本性的影响。

PixelCNN训练和过程和Autoencoder差不多,也是最终生成的图片和训练图片做比较。但是为了表示没有偷看后面的数据,训练时需要用MASK遮住还未生成的那部分。

此外,PixelCNN还要给图片打分,用以表明生成的图片是那一类的。比如MNIST数据集的手写数字的10分类。

这样最终训练好之后,只要给出分类信息和seed,就可以生成图片了。

参考:

https://zhuanlan.zhihu.com/p/591881660

通俗形象地分析比较生成模型(GAN/VAE/Flow/Diffusion/AR)

https://mp.weixin.qq.com/s/YZcw5pnHzuACSvEmGZHnEQ

自回归模型:PixelCNN

https://www.microsoft.com/en-us/research/uploads/prod/2022/12/Generative-Models-for-TTS.pdf

Generative Models for TTS

Fork me on GitHub