Ho J., Jain A. and Abbeel P. Denoising diffusion probabilistic models. In Advances in Neural Information Processing Systems (NIPS), 2020.
[Page E. Approximating to the cumulative normal function and its inverse for use on a pocket calculator. Applied Statistics, vol. 26, pp. 75-76, 1977.]
Yerukala R., Boiroju N. K. Approximations to standard normal distribution function. Journal of Scientific and Engineering Research, vol. 6, pp. 515-518, 2015.
概
diffusion model和变分界的结合.
对抗鲁棒性上已经有多篇论文用DDPM生成的数据用于训练了, 可见其强大.
主要内容
Diffusion models
reverse process
从p ( x T ) = N ( x T ; 0 , I ) p ( x T ) = N ( x T ; 0 , I ) 出发:
p θ ( x 0 : T ) := p ( X T ) T ∏ t = 1 p θ ( x t − 1 | x t ) , p θ ( x t − 1 | x t ) := N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) , p θ ( x 0 : T ) := p ( X T ) ∏ t = 1 T p θ ( x t − 1 | x t ) , p θ ( x t − 1 | x t ) := N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) ,
注意这个过程我们拟合均值μ θ μ θ 和协方差矩阵Σ θ Σ θ .
这部分的过程逐步将噪声'恢复'为图片(信号)x 0 x 0 .
forward process
q ( x 1 : T | x 0 ) := T ∏ t = 1 q ( x t | x t − 1 ) , q ( x t | x t − 1 ) := N ( x t ; √ 1 − β t x t − 1 , β t I ) . q ( x 1 : T | x 0 ) := ∏ t = 1 T q ( x t | x t − 1 ) , q ( x t | x t − 1 ) := N ( x t ; 1 − β t x t − 1 , β t I ) .
其中β t β t 是可训练的参数或者人为给定的超参数.
这部分为将图片(信号)逐步添加噪声的过程.
变分界
对于参数θ θ , 很自然地我们希望通过最小化其负对数似然来优化:
E p d a t a ( x 0 ) [ − log p θ ( x 0 ) ] = E p d a t a ( x 0 ) [ − log ∫ p θ ( x 0 : T ) d x 0 : T ] = E p d a t a ( x 0 ) [ − log ∫ q ( x 1 : T | x 0 ) p θ ( x 0 : T ) q ( x 1 : T | x 0 ) d x 0 : T ] = E p d a t a ( x 0 ) [ − log E q ( x 1 : T | x 0 ) p θ ( x 0 : T ) q ( x 1 : T | x 0 ) ] ≤ − E p d a t a ( x 0 ) E q ( x 1 : T | x 0 ) [ log p θ ( x 0 : T ) q ( x 1 : T | x 0 ) ] = − E q [ log p θ ( x 0 : T ) q ( x 1 : T | x 0 ) ] = − E q [ log p ( x T ) + ∑ T t = 1 log p θ ( x t − 1 | x t ) q ( x t | x t − 1 ) ] = − E q [ log p ( x T ) + ∑ T t = 2 log p θ ( x t − 1 | x t ) q ( x t | x t − 1 ) + log p θ ( x 0 | x 1 ) q ( x 1 | x 0 ) ] = − E q [ log p ( x T ) + ∑ T t = 2 log p θ ( x t − 1 | x t ) q ( x t − 1 | x t , x 0 ) ⋅ q ( x t − 1 | x 0 ) q ( x t | x 0 ) + log p θ ( x 0 | x 1 ) q ( x 1 | x 0 ) ] = − E q [ log p ( x T ) q ( x T | x 0 ) + ∑ T t = 2 log p θ ( x t − 1 | x t ) q ( x t − 1 | x t , x 0 ) + log p θ ( x 0 | x 1 ) ] E p d a t a ( x 0 ) [ − log p θ ( x 0 ) ] = E p d a t a ( x 0 ) [ − log ∫ p θ ( x 0 : T ) d x 0 : T ] = E p d a t a ( x 0 ) [ − log ∫ q ( x 1 : T | x 0 ) p θ ( x 0 : T ) q ( x 1 : T | x 0 ) d x 0 : T ] = E p d a t a ( x 0 ) [ − log E q ( x 1 : T | x 0 ) p θ ( x 0 : T ) q ( x 1 : T | x 0 ) ] ≤ − E p d a t a ( x 0 ) E q ( x 1 : T | x 0 ) [ log p θ ( x 0 : T ) q ( x 1 : T | x 0 ) ] = − E q [ log p θ ( x 0 : T ) q ( x 1 : T | x 0 ) ] = − E q [ log p ( x T ) + ∑ t = 1 T log p θ ( x t − 1 | x t ) q ( x t | x t − 1 ) ] = − E q [ log p ( x T ) + ∑ t = 2 T log p θ ( x t − 1 | x t ) q ( x t | x t − 1 ) + log p θ ( x 0 | x 1 ) q ( x 1 | x 0 ) ] = − E q [ log p ( x T ) + ∑ t = 2 T log p θ ( x t − 1 | x t ) q ( x t − 1 | x t , x 0 ) ⋅ q ( x t − 1 | x 0 ) q ( x t | x 0 ) + log p θ ( x 0 | x 1 ) q ( x 1 | x 0 ) ] = − E q [ log p ( x T ) q ( x T | x 0 ) + ∑ t = 2 T log p θ ( x t − 1 | x t ) q ( x t − 1 | x t , x 0 ) + log p θ ( x 0 | x 1 ) ]
注: q = q ( x 1 : T | x 0 ) p d a t a ( x 0 ) q = q ( x 1 : T | x 0 ) p d a t a ( x 0 ) , 下面另q ( x 0 ) := p d a t a ( x 0 ) q ( x 0 ) := p d a t a ( x 0 ) .
又
E q [ log q ( x T | x 0 ) p ( x T ) ] = ∫ q ( x 0 , x T ) log q ( x T | x 0 ) p ( x T ) d x 0 d x T = ∫ q ( x 0 ) q ( x T | x 0 ) log q ( x T | x 0 ) p ( x T ) d x 0 d x T = ∫ q ( x 0 ) D K L ( q ( x T | x 0 ) ∥ p ( x T ) ) d x 0 = ∫ q ( x 0 : T ) D K L ( q ( x ′ T | x 0 ) ∥ p ( x ′ T ) ) d x 0 : T = E q [ D K L ( q ( x ′ T | x 0 ) ∥ p ( x ′ T ) ) ] . E q [ log q ( x T | x 0 ) p ( x T ) ] = ∫ q ( x 0 , x T ) log q ( x T | x 0 ) p ( x T ) d x 0 d x T = ∫ q ( x 0 ) q ( x T | x 0 ) log q ( x T | x 0 ) p ( x T ) d x 0 d x T = ∫ q ( x 0 ) D K L ( q ( x T | x 0 ) ‖ p ( x T ) ) d x 0 = ∫ q ( x 0 : T ) D K L ( q ( x T ′ | x 0 ) ‖ p ( x T ′ ) ) d x 0 : T = E q [ D K L ( q ( x T ′ | x 0 ) ‖ p ( x T ′ ) ) ] .
又
E q [ log q ( x t − 1 | x t , x 0 ) p θ ( x t − 1 | x t ) ] = ∫ q ( x 0 , x t − 1 , x t ) log q ( x t − 1 | x t , x 0 ) p θ ( x t − 1 | x t ) d x 0 d x t − 1 d x t = ∫ q ( x 0 , x t ) D K L ( q ( x t − 1 | x t , x 0 ) ∥ p θ ( x t − 1 | x t ) ) d x 0 d x t = E q [ D K L ( q ( x ′ t − 1 | x t , x 0 ) ∥ p θ ( x ′ t − 1 | x t ) ) ] . E q [ log q ( x t − 1 | x t , x 0 ) p θ ( x t − 1 | x t ) ] = ∫ q ( x 0 , x t − 1 , x t ) log q ( x t − 1 | x t , x 0 ) p θ ( x t − 1 | x t ) d x 0 d x t − 1 d x t = ∫ q ( x 0 , x t ) D K L ( q ( x t − 1 | x t , x 0 ) ‖ p θ ( x t − 1 | x t ) ) d x 0 d x t = E q [ D K L ( q ( x t − 1 ′ | x t , x 0 ) ‖ p θ ( x t − 1 ′ | x t ) ) ] .
故最后:
L := E q [ D K L ( q ( x ′ T | x 0 ) ∥ p ( x ′ T ) ) L T + T ∑ t = 2 D K L ( q ( x ′ t − 1 | x t , x 0 ) ∥ p θ ( x ′ t − 1 | x t ) ) L t − 1 − log p θ ( x 0 | x 1 ) L 0 . ] L := E q [ D K L ( q ( x T ′ | x 0 ) ‖ p ( x T ′ ) ) ⏟ L T + ∑ t = 2 T D K L ( q ( x t − 1 ′ | x t , x 0 ) ‖ p θ ( x t − 1 ′ | x t ) ) ⏟ L t − 1 − log p θ ( x 0 | x 1 ) ⏟ L 0 . ]
损失求解
因为无论forward, 还是 reverse process都是基于高斯分布的, 我们可以显示求解上面的各项损失:
首先, 对于forward process中的x t x t :
x t = √ 1 − β t x t − 1 + √ β t ϵ , ϵ ∼ N ( 0 , I ) = √ 1 − β t ( √ 1 − β t − 1 x t − 2 + √ β t − 1 ϵ ′ ) + √ β ϵ = √ 1 − β t √ 1 − β t − 1 x t − 2 + √ 1 − β t √ β t − 1 ϵ ′ + √ β ϵ = √ 1 − β t √ 1 − β t − 1 x t − 2 + √ 1 − ( 1 − β t ) ( 1 − β t − 1 ) ϵ = ⋯ = ( ∏ t s = 1 √ 1 − β s ) x 0 + √ 1 − ∏ t s = 1 ( 1 − β s ) ϵ , x t = 1 − β t x t − 1 + β t ϵ , ϵ ∼ N ( 0 , I ) = 1 − β t ( 1 − β t − 1 x t − 2 + β t − 1 ϵ ′ ) + β ϵ = 1 − β t 1 − β t − 1 x t − 2 + 1 − β t β t − 1 ϵ ′ + β ϵ = 1 − β t 1 − β t − 1 x t − 2 + 1 − ( 1 − β t ) ( 1 − β t − 1 ) ϵ = ⋯ = ( ∏ s = 1 t 1 − β s ) x 0 + 1 − ∏ s = 1 t ( 1 − β s ) ϵ ,
故
q ( x t | x 0 ) = N ( x t | √ ¯ α t x 0 , ( 1 − ¯ α t ) I ) , ¯ α t := t ∏ s = 1 α s , α s := 1 − β s . q ( x t | x 0 ) = N ( x t | α ¯ t x 0 , ( 1 − α ¯ t ) I ) , α ¯ t := ∏ s = 1 t α s , α s := 1 − β s .
对于后验分布q ( x t − 1 | x t , x 0 ) q ( x t − 1 | x t , x 0 ) , 我们有
q ( x t − 1 | x t , x 0 ) = q ( x t | x t − 1 ) q ( x t − 1 | x 0 ) q ( x t | x 0 ) ∝ q ( x t | x t − 1 ) q ( x t − 1 | x 0 ) ∝ exp { − 1 2 ( 1 − ¯ α t − 1 ) β t [ ( 1 − ¯ α t − 1 ) ∥ x t − √ 1 − β t x t − 1 ∥ 2 + β t ∥ x t − 1 − √ ¯ α t − 1 x 0 ∥ 2 ] } ∝ exp { − 1 2 ( 1 − ¯ α t − 1 ) β t [ ( 1 − ¯ α t ) ∥ x t − 1 ∥ 2 − 2 ( 1 − ¯ α t − 1 ) √ α t x T t x t − 1 − 2 √ ¯ α t − 1 β t ] } q ( x t − 1 | x t , x 0 ) = q ( x t | x t − 1 ) q ( x t − 1 | x 0 ) q ( x t | x 0 ) ∝ q ( x t | x t − 1 ) q ( x t − 1 | x 0 ) ∝ exp { − 1 2 ( 1 − α ¯ t − 1 ) β t [ ( 1 − α ¯ t − 1 ) ‖ x t − 1 − β t x t − 1 ‖ 2 + β t ‖ x t − 1 − α ¯ t − 1 x 0 ‖ 2 ] } ∝ exp { − 1 2 ( 1 − α ¯ t − 1 ) β t [ ( 1 − α ¯ t ) ‖ x t − 1 ‖ 2 − 2 ( 1 − α ¯ t − 1 ) α t x t T x t − 1 − 2 α ¯ t − 1 β t ] }
所以
q ( x t − 1 | x t , x 0 ) ∼ N ( x t − 1 | ~ u t ( x t , x 0 ) , ~ β t I ) , q ( x t − 1 | x t , x 0 ) ∼ N ( x t − 1 | u ~ t ( x t , x 0 ) , β ~ t I ) ,
其中
~ u t ( x t , x 0 ) := √ ¯ α t − 1 β t 1 − ¯ α t x 0 + √ α t ( 1 − ¯ α t − 1 ) 1 − ¯ α t x t , u ~ t ( x t , x 0 ) := α ¯ t − 1 β t 1 − α ¯ t x 0 + α t ( 1 − α ¯ t − 1 ) 1 − α ¯ t x t ,
~ β t = 1 − ¯ α t − 1 1 − ¯ α t β t . β ~ t = 1 − α ¯ t − 1 1 − α ¯ t β t .
L t L t
L T L T 与θ θ 无关, 舍去.
作者假设Σ θ ( x t , t ) = σ 2 t I Σ θ ( x t , t ) = σ t 2 I 为非训练的参数 , 其中
σ 2 t = β t | ~ β t , σ t 2 = β t | β ~ t ,
分别为x 0 ∼ N ( 0 , I ) x 0 ∼ N ( 0 , I ) 和x 0 x 0 为固定值时, 期望下KL散度的最优参数(作者说在实验中二者差不多).
故
L t = 1 2 σ 2 t ∥ μ θ ( x t , t ) − ~ u t ( x t , x 0 ) ∥ 2 + C , t = 1 , 2 , ⋯ , T − 1. L t = 1 2 σ t 2 ‖ μ θ ( x t , t ) − u ~ t ( x t , x 0 ) ‖ 2 + C , t = 1 , 2 , ⋯ , T − 1.
又
x t = √ ¯ α t x 0 + √ 1 − ¯ α t ϵ ⇒ x 0 = 1 √ ¯ α t x t − √ 1 − ¯ α t √ ¯ α t ϵ . x t = α ¯ t x 0 + 1 − α ¯ t ϵ ⇒ x 0 = 1 α ¯ t x t − 1 − α ¯ t α ¯ t ϵ .
所以
E q [ L t − 1 − C ] = E x 0 , ϵ { 1 2 σ 2 t ∥ μ θ ( x t , t ) − ~ u t ( x t , ( 1 √ ¯ α t x t − √ 1 − ¯ α t √ ¯ α t ϵ ) ) ∥ 2 } = E x 0 , ϵ { 1 2 σ 2 t ∥ μ θ ( x t , t ) − 1 √ α t ( x t − β t √ 1 − ¯ α t ϵ ) } E q [ L t − 1 − C ] = E x 0 , ϵ { 1 2 σ t 2 ‖ μ θ ( x t , t ) − u ~ t ( x t , ( 1 α ¯ t x t − 1 − α ¯ t α ¯ t ϵ ) ) ‖ 2 } = E x 0 , ϵ { 1 2 σ t 2 ‖ μ θ ( x t , t ) − 1 α t ( x t − β t 1 − α ¯ t ϵ ) }
注: 上式子中x t x t 由x 0 , ϵ x 0 , ϵ 决定, 实际上x t = x t ( x 0 , ϵ ) x t = x t ( x 0 , ϵ ) , 故期望实际上是对x t x t 求期望.
既然如此, 我们不妨直接参数化μ θ μ θ 为
μ θ ( x t , t ) := 1 √ α t ( x t − β t √ 1 − ¯ α t ϵ θ ( x t , t ) ) , μ θ ( x t , t ) := 1 α t ( x t − β t 1 − α ¯ t ϵ θ ( x t , t ) ) ,
即直接建模残差ϵ ϵ .
此时损失可简化为:
E x 0 , ϵ { β 2 t 2 σ 2 t α t ( 1 − ¯ α t ) ∥ ϵ θ ( √ ¯ α t x 0 + √ 1 − ¯ α t ϵ , t ) − ϵ ∥ 2 } E x 0 , ϵ { β t 2 2 σ t 2 α t ( 1 − α ¯ t ) ‖ ϵ θ ( α ¯ t x 0 + 1 − α ¯ t ϵ , t ) − ϵ ‖ 2 }
这个实际上时denoising score matching.
类似地, 从p θ ( x t − 1 | x t ) p θ ( x t − 1 | x t ) 采样则为:
x t − 1 = 1 √ α t ( x t − β t √ 1 − ¯ α t ϵ θ ( x t , t ) ) + σ t z , z ∼ N ( 0 , I ) , x t − 1 = 1 α t ( x t − β t 1 − α ¯ t ϵ θ ( x t , t ) ) + σ t z , z ∼ N ( 0 , I ) ,
这是Langevin dynamic的形式(步长和权重有点变化)
注: 这部分见here .
L 0 L 0
最后我们要处理L 0 L 0 , 这里作者假设x 0 | x 1 x 0 | x 1 满足一个离散分布, 首先图片取值于{ 0 , 1 , 2 , ⋯ , 255 } { 0 , 1 , 2 , ⋯ , 255 } , 并标准化至[ − 1 , 1 ] [ − 1 , 1 ] . 假设
p θ ( x 0 | x 1 ) = D ∏ i = 1 ∫ δ + ( x i 0 ) δ − ( x i 0 ) N ( x ; μ i θ ( x 1 , 1 ) , σ 2 1 ) d x , δ + ( x ) = { + ∞ if x = 1 , x + 1 255 if x < 1. δ − ( x ) { − ∞ if x = − 1 , x − 1 255 if x > − 1. p θ ( x 0 | x 1 ) = ∏ i = 1 D ∫ δ − ( x 0 i ) δ + ( x 0 i ) N ( x ; μ θ i ( x 1 , 1 ) , σ 1 2 ) d x , δ + ( x ) = { + ∞ if x = 1 , x + 1 255 if x < 1. δ − ( x ) { − ∞ if x = − 1 , x − 1 255 if x > − 1.
实际上就是将普通的正态分布划分为:
( − ∞ , − 1 + 1 / 255 ] , ( − 1 + 1 / 255 , − 1 + 3 / 255 ] , ⋯ , ( 1 − 3 / 255 , 1 − 1 / 255 ] , ( 1 − 1 / 255 , + ∞ ) ( − ∞ , − 1 + 1 / 255 ] , ( − 1 + 1 / 255 , − 1 + 3 / 255 ] , ⋯ , ( 1 − 3 / 255 , 1 − 1 / 255 ] , ( 1 − 1 / 255 , + ∞ )
各取值落在其中之一.
在实际代码编写中, 会遇到高斯函数密度函数估计的问题(直接求是做不到的), 作者选择用下列的估计方式:
Φ ( x ) ≈ 1 2 { 1 + tanh ( √ 2 / π ( 1 + 0.044715 x 2 ) ) } . Φ ( x ) ≈ 1 2 { 1 + tanh ( 2 / π ( 1 + 0.044715 x 2 ) ) } .
这样梯度也就能够回传了.
注: 该估计属于Page.
最后的算法
注: t = 1 t = 1 对应L 0 L 0 , t = 2 , ⋯ , T t = 2 , ⋯ , T 对应L 1 , ⋯ , L T − 1 L 1 , ⋯ , L T − 1 .
注: 对于L t L t 作者省略了开始的系数, 这反而是一种加权.
作者在实际中是采样损失用以训练的.
细节
注意到, 作者的ϵ θ ( ⋅ , t ) ϵ θ ( ⋅ , t ) 是有显示强调t t , 作者在实验中是通过attention中的位置编码实现的, 假设位置编码为P P :
t = Linear ( ACT ( Linear ( t ∗ P ) ) ) t = Linear ( ACT ( Linear ( t ∗ P ) ) ) , 即通过两层的MLP来转换得到time_steps;
作者用的是U-Net结构, 在每个residual 模块中:
x + = Linear ( ACT ( t ) ) . x + = Linear ( ACT ( t ) ) .
参数
值
T T
1000
β t β t
[ 0.0001 , 0.02 ] [ 0.0001 , 0.02 ] , 线性增长1 , 2 , ⋯ , T 1 , 2 , ⋯ , T .
backbone
U-Net
注: 作者在实现中还用到了EMA等技巧.
代码
原文代码
lucidrains-denoising-diffusion-pytorch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix