Diffusion
Diffusion
Diffusion 和Stable Diffusion的数学和工作原理详细解释
Diffusion
噪声的添加过程中,每一步都要保持尽量相同的噪声扩散幅度。图片前期的分布非常均匀,添加一些噪声便可以将原始分布改变,但到后期,需要添加更多的噪声,方可保证噪声扩散幅度相同(有趣的比喻,水中加糖,为了使糖的甜味增长相同,后期需要加更多的糖)。
定义一个每一时刻的\(\beta_t\)作为权重项,论文中从0.0001到0.02。\(\alpha_t = 1 - \beta_t\)。(不懂物理学和信息论的就不用管为啥,当它是个权重就行),根据马尔科夫链*的性质,\(x_t\)时刻的图片与\(x_{t - 1}\)时刻最相关。所以有如下定义:
\(\epsilon_t \sim \mathcal{N}(0, I)\),由于\(\beta\)越来越大,所以\(\alpha\)会越来越小,上述公式符合时刻越往后,添加的噪声值越大。然而从\(x_0\)逐渐递归计算得到\(x_T\)的过程十分慢,所以通过推导使得通过\(x_0\)直接得到任一时刻的\(x_t\)。向前推导得到:
假如能够知道 t 时刻添加的噪声 和 t 时刻产生的图片,就可以反算出 t0 时刻的原图。
通过正向过程可以收集(t时刻图像、t时刻添加噪声)这样的训练数据,以此训练神经网络,对的使得网络能够输入加噪图像,输出加的噪声。
模型实现
正常加噪训练:
加噪声细节:
初始化参数计算alpha
设置最大时间步为T=1000
betas = [0.0001, 0.0001, 0.0001, 0.0002, 0.0002, ..., 0.02]共计1000个
alphas = 1 - betas
sqrt_alphas_bar = sqrt(累积乘alphas: [0.0001, 0.0001*0.0001, 0.0001*0.0001*0.0002, ...])
sqrt_one_minus_alphas_bar = sqrt(1-累积乘alphas: [0.0001, 0.0001*0.0001, 0.0001*0.0001*0.0002, ...])
也就对应了计算好每个时间步的 \(\sqrt{\overline{\alpha}_t}\) 和 \(\sqrt{1 - \overline{\alpha}_t}\),随着时间步的增加,beta增大,alpha减小,原图占比较小,噪声占比增加。
其中\(\overline{\alpha}_t = \alpha_t\alpha_{t - 1}\ldots\alpha_1\)。综上所述,任一时刻的分布都可以通过\(x_0\)得到。\(\epsilon_t\)是噪声,仍服从高斯分布。Diffusion的核心便是利用马尔科夫正向过程可以一步到位。
Stable Diffusion
隐空间
通过提前训练自编码器,得到编码器和解码器。

训练时输入图片先经过编码器得到隐空间表示再加噪。
推理时最终结果经过解码器得到图像。

条件
隐空间图片加上噪声之后除了和编码后的时间步送入U-Net预测噪声外,还可和文本描述一起送入。

浙公网安备 33010602011771号