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主要通过采样的方法,不断逼近模型的数据分布,从而生成数据。基本原理和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
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
您的打赏,是对我的鼓励
请访问这里提交评论