本文主要是介绍ddpm和ddim小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前面分析了DDPM和DDIM,但是仍然感觉对其理解不是和透彻,最近又学习了下,简单记录一下进一步的理解。为了方便理解,这里直接以两个像素的灰度图像为例。前面讲过无论是DDPM还是DDIM,他们的训练过程都是一样的,都遵循下面的这个公式:
x t = α t ˉ x 0 + 1 − α t ˉ ϵ x_t = \sqrt{\bar{\alpha_t}}x_0+\sqrt{1-\bar{\alpha_t}}\epsilon xt=αtˉx0+1−αtˉϵ
但是在采样的时候有些不同,DDPM是遵循马尔科夫性质的,DDIM是直接一步到位。因此DDIM的采样过程要远远快于DDPM,而DDPM的多样性要好于DDIM。
我们先以采样为例,假设采样的两像素都服从正态分布(为什么是假设为高斯分布而不是均值分布或者其他的分布呢?因为我们再扩散模型采样的时候就是直接从高斯随机噪声中采样得到的,这些噪声点就是服从高斯分布的,所以这里直接以高斯分布举例子。其实我觉得换成其他的分布也可以,只不过正态分布式在自然界中是最常见的,DDPM采样的核心其实就是通过不断堆叠多个的正态分布来模拟原始数据集的一个复杂分布情况,原始数据集的分布会有很多种情况,可能服从正态分布,也可能服从均值分布,泊松分布,瑞丽分布等等,采样过程其实就是在模拟这个过程),如下图所示的概率密度图,越亮的地方表示该像素被选取到的概率是越大的,也就是对分别对应这个两个分布对应的 μ \mu μ处,两个分布的 σ \sigma σ分别对应这图中发亮的地方的半径, σ \sigma σ越大,表示椭圆的半径越大,反之越小,如果两个像素的高斯分布的 σ \sigma σ一样,那么这个椭圆就变成了圆。
有了上面的密度图假设,我们现在来随机取一个点,假设取值对应这坐标上的(0.5,0.5),有了这个点,我们就能得到一个两像素的图,像素值分别为0.5,0.5。同理我们可以设想一下,把这两像素的图扩展到(100,100,3),每个像素均服从正态分布,那么上面的二维概率密度图是不是可以扩展到了 100 × 100 × 3 = 30000 100 \times100 \times 3=30000 100×100×3=30000维度,这个维度我们可能无法想想,但是道理同二维一样的,我们随机从30000维空间中选取一个点,是不是就确定了一张图像。
现在我们假设一下,有一个两像素的数据集,很多张图像,几千万张,上亿张图像,这个数据集一定有一个分布,但是这个分布我不知道,我现在需要通过扩散模型来学习这个分布。训练的时候就是从这个数据集里面选取图像加高斯噪声,假设1000步,每张图像都加了1000步的高斯噪声之后,我们可以再统计下加完噪声的这个噪声数据集的分布情况,你会意外的发现,这个噪声数据集竟然服从正态分布。其实这一点一比较好理解,我们刚才说了,DDPM 采样的时候其实就是通过不断的堆叠不同正态分布来模拟原始的数据分布的,那么训练的时候是在不断地加噪声,每次加的噪声都是分布一样的,那么最终生成的噪声数据分布肯定是跟你加的这个噪声分布一致呀。采样的时候就是根据这个噪声数据集,每次采样的时候都会调整正态分布的情况,最终学习到原始数据集的分布。DDPM是逐步调整吗,DDIM是一步到位,在看下这两个采样公式:
DDPM:
x t − 1 = 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ θ ( x t , t ) ) + σ t z \mathbf{x}_{t-1}=\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta\left(\mathbf{x}_t, t\right)\right)+\sigma_t \mathbf{z} xt−1=αt1(xt−1−αˉt1−αtϵθ(xt,t))+σtz
可见DDPM只能一步一步来。
DDIM:
x s = α ˉ s ( x k − 1 − α ˉ k ϵ θ ( x k ) α k ‾ ) + 1 − α ˉ s − σ 2 ϵ θ ( x k ) + σ ϵ x_s=\sqrt{\bar{\alpha}_s}\left(\frac{x_k-\sqrt{1-\bar{\alpha}_k} \epsilon_\theta\left(x_k\right)}{\sqrt{\overline{\alpha_k}}}\right)+\sqrt{1-\bar{\alpha}_s-\sigma^2} \epsilon_\theta\left(x_k\right)+\sigma \epsilon xs=αˉs(αkxk−1−αˉkϵθ(xk))+1−αˉs−σ2ϵθ(xk)+σϵ
DDIM可以直接从第k步跳到s步,实现了采样的加速。
这篇关于ddpm和ddim小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!