![]()
 
    
    
    ©PaperWeekly 原创 · 作者 | 
     苏剑林 
    
    
    
    
   相信很多读者都听说过甚至读过克莱因的《高观点下的初等数学》[1] 这套书,顾名思义,这是在学到了更深入、更完备的数学知识后,从更高的视角重新审视过往学过的初等数学,以得到更全面的认知,甚至达到温故而知新的效果。类似的书籍还有很多,比如《重温微积分》[2]、《复分析:可视化方法》[3] 等。 
 
   回到扩散模型,目前我们已经通过三篇文章从不同视角去解读了DDPM,那么它是否也存在一个更高的理解视角,让我们能从中得到新的收获呢?当然有,《Denoising Diffusion Implicit Models》[4] 介绍的 DDIM 模型就是经典的案例,本文一起来欣赏它。
 
   
 
   
 
   ![]()
 
    
    
   在《生成扩散模型漫谈:DDPM = 贝叶斯 + 去噪》中,我们提到过该文章所介绍的推导跟 DDIM 紧密相关。具体来说,文章的推导路线可以简单归纳如下:
 
   
 
   ![]()
 
    
     
     这个过程是一步步递进的。然而,我们发现最终结果有着两个特点: 
     
     
     
     
     也就是说,尽管整个过程是以  
        为出发点一步步往前推的,但是从结果上来看,压根儿就没  
        的事。那么,我们大胆地“异想天开”一下: 
     
     
     高观点1: 
     既然结果跟  
        无关,可不可以干脆“过河拆桥”,将  
        从整个推导过程中去掉? 
     
     
    
   
 
   
 
   ![]()
 
    
    
    
    
    
    没有给定  
       怎么能得到  
      ?这其实是思维过于定式了,理论上在没有给定  
       的情况下, 
       的解空间更大,某种意义上来说是更加容易推导,此时它只需要满足边际分布条件: 
    
    
    
    我们用待定系数法来求解这个方程。在上一篇文章中,所解出的  
       是一个正态分布,所以这一次我们可以更一般地设: 
    
    
    
    其中  
       都是待定系数,而为了不重新训练模型,我们不改变  
       和  
      ,于是我们可以列出: 
    
    
    
    
    
    可以看到有三个未知数,但只有两个方程,这就是为什么说没有给定  
       时解空间反而更大了。将  
       视为可变参数,可以解出: 
    
    
    
    
    
    方便起见,我们约定  
     
      
    。 
    特别地,这个结果并不需要限 
    定 
      
       
    , 
    不过为了简化参数设置,同时也为了跟以往的结果对齐,这里还是约定  
     
      
    。 
    
   
 
   
 
   ![]()
 
    
    
    
    现在我们在只给定  
       的情况下,通过待定系数法求解了  
       的一簇解,它带有一个自由参数  
      。用《生成扩散模型漫谈:DDPM = 拆楼 + 建楼》中的“拆楼-建楼”类比来说,就是我们知道楼会被拆成什么样【 
      、 
      】,但是不知道每一步怎么拆【 
      】,然后希望能够从中学会每一步怎么建【 
      】。当然,如果我们想看看每一步怎么拆的话,也可以反过来用贝叶斯公式: 
    
    
    
    接下来的事情,就跟上一篇文章一模一样了:我们最终想要  
       而不是  
      ,所以我们希望用: 
    
    
    
    来估计  
      ,由于没有改动  
      ,所以训练所用的目标函数依然 
    是 
      
       
    ( 
    除去权重系数),也就是说训练过程没有改变,我们可以用回 DDPM 训练好的模型。而用  
       
        
         
          
           
            
             
            
            
             
            
           
          
          
           
          
          
           
            
           
           
            
           
          
          
           
          
         
        
       替换掉式(7)中的  
       
        
         
          
           
            
           
           
            
           
          
         
        
      后,得到: 
    
    
    
    这就求出了生成过程所需要的  
       
        
         
          
           
          
          
           
          
          
           
            
           
           
            
             
            
            
             
            
            
             
            
           
          
          
           
          
          
           
            
           
           
            
           
          
          
           
          
          
          
            , 
           
          
            其 
           
          
            中 
           
          
          
           
            
           
           
            
           
          
          
           
          
          
           
            
             
              
               
              
              
               
              
             
            
            
             
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
              
             
             
              
             
             
              
             
            
           
           
          
         
        
      。它的特点是训练过程没有变化(也就是说最终保存下来的模型没有变化),但生成过程却有一个可变动的参数  
       
        
         
          
           
            
           
           
            
           
          
         
        
      ,就是这个参数给 DDPM 带来了新鲜的结果。 
    
    
   
 
   ![]()
 
    
    
    
    原则上来说,我们对  
       
        
         
          
           
            
           
           
            
           
          
         
        
       没有过多的约束,但是不同  
       
        
         
          
           
            
           
           
            
           
          
         
        
       的采样过程会呈现出不同的特点,我们举几个例子进行分析。 
    
    
    
    
    这就是上一篇文章所推导的 DDPM。特别是,DDIM 论文中还对  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
          
          
           
            
             
              
               
                
               
               
                
               
              
             
             
              
               
              
              
               
              
              
               
              
             
            
            
             
              
             
             
              
             
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
            
           
           
          
         
        
       做了对比实验,其中  
       
        
         
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
         
        
      。 
    
    
    第二个例子就是取  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
            
           
           
            
           
          
         
        
      ,这也是前两篇文章所指出的  
       
        
         
          
           
            
           
           
            
           
          
         
        
       的两个选择之一,在此选择下式(10)未能做进一步的化简,但 DDIM 的实验结果显示此选择在 DDPM 的标准参数设置下表现还是很好的。 
    
    
    最特殊的一个例子是取  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
          
         
        
      ,此时从  
       
        
         
          
           
            
           
           
            
           
          
         
        
       到  
       
        
         
          
           
            
           
           
            
             
            
            
             
            
            
             
            
           
          
         
        
       是一个确定性变换: 
    
    
    
    这也是 DDIM 论文中特别关心的一个例子,准确来说,原论文的 DDIM 就是特指  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
          
         
        
       的情形,其中“I”的含义就是“Implicit”,意思这是一个隐式的概率模型,因为跟其他选择所不同的是,此时从给定的  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
          
         
        
       出发,得到的生成结果  
       
        
         
          
           
            
           
           
            
           
          
         
        
       是不带随机性的。后面我们将会看到,这在理论上和实用上都带来了一些好处。 
    
    
   
 
   ![]()
 
   
 
    
    
    值得指出的是,在这篇文章中我们没有以  
       
        
         
          
           
          
          
           
          
          
           
            
           
           
            
           
          
          
           
          
          
           
            
           
           
            
             
            
            
             
            
            
             
            
           
          
          
           
          
         
        
       为出发点,所以前面的所有结果实际上全都是以  
       
        
         
          
           
            
             
              
             
             
              
             
            
           
           
            
           
          
          
           
          
          
           
            
             
              
             
             
              
             
            
           
           
            
           
          
         
        
      相关记号给出的,而  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
            
           
           
            
           
          
         
        
       则是通过  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
            
             
              
               
              
              
               
              
             
            
            
             
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
              
             
             
              
             
             
              
             
            
           
           
          
         
        
       
     和  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
            
             
            
            
             
            
            
             
              
             
             
              
             
             
              
             
            
           
           
            
           
           
          
         
        
      派生出来的记号。从损失函数  
       
        
         
          
           
            
             
              
             
            
            
             
            
            
             
            
            
             
              
             
             
              
               
              
             
            
            
             
            
            
             
              
               
                
               
               
                
               
              
             
             
              
             
            
            
             
              
             
             
              
             
            
            
             
            
            
             
              
               
                
               
               
                
               
              
             
             
              
             
            
            
             
            
            
             
            
            
             
            
            
             
            
            
             
              
             
            
           
           
            
           
          
         
        
      可以看出,给定了各个  
        
         
          
           
            
             
              
               
              
              
               
              
             
            
            
             
            
           
          
         
       ,训练过程也就确定了。 
    
    
    
    高观点2:DDPM 的训练结果实质上包含了它的任意子序列参数的训练结果。 具体来说,设  
        
         
          
           
            
           
           
            
           
           
            
           
           
            
             
            
            
             
            
           
           
            
           
           
            
             
            
            
             
            
           
           
            
           
           
            
           
           
            
           
           
            
             
            
            
             
              
              
              
             
             
              
             
             
              
             
             
              
             
            
           
           
            
           
          
         
        是  
        
         
          
           
            
           
           
            
           
           
            
           
           
            
           
           
            
           
           
            
           
           
            
           
           
            
           
           
            
           
          
         
        的任意子序列,那么我们以  
        
         
          
           
            
             
              
               
              
              
               
              
             
            
            
             
              
               
              
              
               
              
             
            
           
           
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
              
               
              
              
               
              
             
            
           
           
            
           
           
            
           
           
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
              
              
              
             
             
              
             
             
              
             
             
              
             
            
           
          
         
        为参数训练一个扩散步数为  
        
         
          
           
            
            
            
           
           
            
           
           
            
           
           
            
           
          
         
        步的 DDPM,其目标函数实际上是原来以  
        
         
          
           
            
             
              
               
              
              
               
              
             
            
            
             
            
           
           
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
            
           
           
            
           
           
            
           
           
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
            
           
          
         
        的 T 步 DDPM 的目标函数的一个子集!所以在模型拟合能力足够好的情况下,它其实包含了任意子序列参数的训练结果。 
    
    
    那么反过来想,如果有一个训练好的 T 步 DDPM 模型,我们也可以将它当成是以  
       
        
         
          
           
            
             
              
             
             
              
             
            
           
           
            
             
              
             
             
              
             
            
           
          
          
           
          
          
           
            
             
              
             
             
              
             
            
           
           
            
             
              
             
             
              
             
            
           
          
          
           
          
          
           
          
          
           
          
          
           
            
             
              
             
             
              
             
            
           
           
            
             
             
             
            
            
             
            
            
             
            
            
             
            
           
          
         
        
       为参数训练出来的  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       步模型,而既然是  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       步的模型,生成过程也就只需要  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       步了,根据式(10)有: 
    
    
    
    这就是加速采样的生成过程了,从原来的 T 步扩散生成变成了  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       步。要注意不能直接将式(10)的  
       
        
         
          
           
            
           
           
            
           
          
         
        
       换成  
       
        
         
          
           
            
           
           
            
             
              
             
             
              
             
            
           
          
         
        
      ,因为我们说过  
       
        
         
          
           
            
           
           
            
           
          
         
        
       是派生记号而已,它实际上等于  
       
        
         
          
           
            
             
              
               
              
              
               
              
             
            
            
             
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
              
             
             
              
             
             
              
             
            
           
           
          
         
        
      ,因此  
       
        
         
          
           
            
           
           
            
           
          
         
        
       要换成  
       
        
         
          
           
            
             
              
               
              
              
               
              
             
            
            
             
              
               
              
              
               
              
             
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
              
               
              
              
               
                
               
               
                
               
               
                
               
              
             
            
           
           
          
         
        
       才对。同理, 
       
        
         
          
           
            
             
              
             
             
              
             
            
           
           
            
             
              
             
             
              
             
            
           
          
         
        
       也不是直接取  
       
        
         
          
           
            
           
           
            
             
              
             
             
              
             
            
           
          
         
        
      ,而是在将其定义全部转化为  
       
        
         
          
           
            
             
            
            
             
            
           
          
          
           
          
          
           
            
             
            
            
             
            
           
          
         
        
       符号后,将 t 替换为  
       
        
         
          
           
            
           
           
            
           
          
         
        
      、 
       
        
         
          
           
          
          
           
          
          
           
          
         
        
       替换为  
       
        
         
          
           
            
           
           
            
             
            
            
             
            
            
             
            
           
          
         
        
      ,比如式(11)对应的  
       
        
         
          
           
            
             
              
             
             
              
             
            
           
           
            
             
              
             
             
              
             
            
           
          
         
        
       为: 
    
    
    
    可能读者又想问,我们为什么干脆不直接训练一个  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       步的扩散模型,而是要先训练  
       
        
         
          
           
          
          
           
          
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       步然后去做子序列采样?笔者认为可能有两方面的考虑:一方面从  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       步生成来说,训练更多步数的模型也许能增强泛化能力;另一方面,通过子序列  
       
        
         
          
           
          
         
        
       进行加速只是其中一种加速手段,训练更充分的 T 步允许我们尝试更多的其他加速手段,但并不会显著增加训练成本。 
     
    
   
 
   
 
   ![]()
 
   
 
    
    
    原论文对不同的噪声强度和扩散步数  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       做了组合对比,大致上的结果是“噪声越小,加速后的生成效果越好”,如下图: 
    
   
 
   ![]()
 
    
    ▲  
    DDIM 的实验结果,显示噪声越小,加速后的生成效果越好 
    
   
 
    
     
      
       
       笔者的参考实现如下:
 
       
         https://github.com/bojone/Keras-DDPM/blob/main/ddim.py 
        
       
      
     
    
    
    
    1. 可能跟直觉相反,生成过程中的  
       
        
         
          
           
            
           
           
            
           
          
         
        
       越小,最终生成图像的噪声和多样性反而相对来说越大; 
    
    
    2. 扩散步数  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       越少,生成的图片更加平滑,多样性也会有所降低; 
    
    
    3. 结合 1、2 两点得知,在扩散步数  
       
        
         
          
           
           
           
          
          
           
          
          
           
          
          
           
          
         
        
       减少时,可以适当缩小 $\sigma_t,以保持生成图片质量大致不变,这跟 DDIM 原论文的实验结论是一致的; 
    
    
    4. 在  
       
        
         
          
           
            
           
           
            
           
          
         
        
       较小时,相比可训练的 Embedding 层,用固定的 Sinusoidal 编码来表示 t 所生成图片的噪声要更小; 
    
    
    5. 在  
       
        
         
          
           
            
           
           
            
           
          
         
        
       较小时,原论文的 U-Net 架构(Github 中的 ddpm2.py [5])要比笔者自行构思的 U-Net 架构(Github 中的 ddpm.py [6])所生成图片的噪声要更小; 
    
    
    6. 但个人感觉,总体来说不带噪声的生成过程的生成效果不如带噪声的生成过程,不带噪声时生成效果受模型架构影响较大。 
    
    
    此外,对于  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
          
         
        
       时的 DDIM,它就是将任意正态噪声向量变换为图片的一个确定性变换,这已经跟 GAN 几乎一致了,所以跟 GAN 类似,我们可以对噪声向量进行插值,然后观察对应的生成效果。但要注意的是,DDPM 或 DDIM 对噪声分布都比较敏感,所以我们不能用线性插值而要用球面插值,因为由正态分布的叠加性,如果  
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
            
           
           
            
           
          
          
           
          
          
           
            
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
          
            , 
           
          
          
           
          
          
           
            
           
           
            
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
            
           
           
            
           
          
         
        
       一般就不服从  
       
        
         
          
           
            
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
         
        
      ,要改为: 
    
    
    
   
 
   ![]()
 
   ▲ DDIM随机向量的插值生成效果
 
    
    
    
   
 
    
    
    
    最后,我们来重点分析一下 
       
        
         
          
           
            
           
           
            
           
          
          
           
          
          
           
          
         
        
       的情形。此时(12)可以等价地改写成: 
    
    
    
    
    当 T 足够大,或者说  
       
        
         
          
           
            
           
           
            
           
          
         
        
       与  
       
        
         
          
           
            
           
           
            
             
            
            
             
            
            
             
            
           
          
         
        
       足够小时,我们可以将上式视为某个常微分方程的差分形式。特别地,引入虚拟的时间参数 s,我们得到: 
    
    
    
    不失一般性,假设  
       
        
         
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
         
        
      ,其中  
       
        
         
          
           
          
          
           
          
          
           
          
         
        
       对应  
       
        
         
          
           
          
          
           
          
          
           
          
         
        
      、 
       
        
         
          
           
          
          
           
          
          
           
          
         
        
       对应  
       
        
         
          
           
          
          
           
          
          
           
          
         
        
      。注意 DDIM 原论文直接用  
       
        
         
          
           
            
             
              
               
              
              
               
              
             
            
            
             
            
            
             
            
            
             
            
           
           
            
             
              
               
              
              
               
              
             
            
            
             
            
            
             
            
            
             
            
           
           
          
         
        
       作为虚拟时间参数,这原则上是不大适合的,因为它的范围是 
       
        
         
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
         
        
      ,无界的区间不利于数值求解。 
    
    
    那么现在我们要做的事情就是在给定  
       
        
         
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
            
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
         
        
       的情况下,去求解出  
       
        
         
          
           
          
          
           
          
          
           
          
          
           
          
         
        
      。而 DDPM 或者 DDIM 的迭代过程,对应于该常微分方程的欧拉方法  
    [7] 
    。众所周知欧拉法的效率相对来说是最慢的,如果要想加速求解,可以用 Heun 方法  
    [8] 
    、R-K 方法  
    [9] 
     等。也就是说,将生成过程等同于求解常微分方程后,可以借助常微分方程的数值解法,为生成过程的加速提供更丰富多样的手段。 
    
    
    
    
    事实上,由于每个  
       
        
         
          
           
            
           
           
            
           
          
         
        
       都很接近于 1,所以上述估计其实也是一个很好的近似。而我们说了本文的出发点是  
       
        
         
          
           
          
          
           
          
          
           
            
           
           
            
           
          
          
           
          
          
           
            
           
           
            
           
          
          
           
          
         
        
      ,所以应该以  
       
        
         
          
           
            
             
              
             
             
              
             
            
           
           
            
           
          
         
        
       为起点,根据上述近似,我们可以直接简单地取: 
    
   ![]()
 
    
    
    如果取  
       
        
         
          
           
          
          
           
          
          
           
          
          
           
            
           
          
          
           
          
         
        
       为参数,那么正好  
       
        
         
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
         
        
      ,此时  
       
        
         
          
           
            
             
            
            
             
            
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
            
           
           
            
             
            
            
             
            
            
             
              
             
             
              
             
            
           
          
         
        
      ,代入到式(17)化简得: 
    
    
    
    也可以取  
       
        
         
          
           
          
          
           
          
          
           
            
           
           
            
           
          
          
           
            
           
          
          
           
            
           
           
            
           
          
         
        
       为参数,此时也有  
       
        
         
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
          
         
        
      ,以及  
       
        
         
          
           
            
             
            
            
             
            
           
          
          
           
          
          
           
          
          
           
          
          
           
          
          
           
            
           
           
            
             
            
            
             
            
            
             
            
           
          
         
        
      ,代入到式(17)化简得: 
    
    
    
    
    
   
 
    
   
 
    
     
     本文接着上一篇 DDPM 的推导思路来介绍了 DDIM,它重新审视了 DDPM 的出发点,去掉了推导过程中的  
        
         
          
           
            
           
           
            
           
           
            
             
            
            
             
            
           
           
            
           
           
            
             
            
            
             
              
             
             
              
             
             
              
             
            
           
           
            
           
          
         
       ,从而获得了一簇更广泛的解和加速生成过程的思路,最后这簇新解还允许我们将生成过程跟常微分方程的求解联系起来,从而借助常微分方程的方法进一步对生成过程进行研究。 
     
    
    
    
   [1] https://book.douban.com/subject/3249247/
 
   [2] https://book.douban.com/subject/1239791/
 
   [3] https://book.douban.com/subject/3788399/
 
   [4] https://arxiv.org/abs/2010.02502
 
   [5] https://github.com/bojone/Keras-DDPM/blob/main/ddpm2.py
 
   [6] https://github.com/bojone/Keras-DDPM/blob/main/ddpm.py
 
   [7] https://en.wikipedia.org/wiki/Euler_method
 
   [8] https://en.wikipedia.org/wiki/Heun%27s_method
 
   [9] https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods
 
    
    
   ![]()
 
    
   ![]()
 
   
 
    
    
     
      
       
       
       
       
       
       
       
       如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
 
       
 
       总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 
 
       
 
       PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
 
       
 
       📝 稿件基本要求:
 
       • 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 
 
       • 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
 
       • PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
 
       
 
       📬 投稿通道:
 
       • 投稿邮箱:hr@paperweekly.site 
 
       • 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
 
       • 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
 
       
 
       ![]()
 
       △长按添加PaperWeekly小编
 
       
 
       
      
     
    
   
 
   
 
   🔍
 
   
 
   现在,在「知乎」也能找到我们了
 
   进入知乎首页搜索「PaperWeekly」
 
   点击「关注」订阅我们的专栏吧
 
    
    
    
    
   ![]()