从扩散模型开始的生成模型范式演变--SDE
SDE是在分数生成模型的基础上,将加噪过程扩展时连续、无限状态,使得扩散模型的正向、逆向过程通过SDE表示。在前文讲解DDPM后,本文主要讲解SDE扩散模型原理。本文内容主要来自B站Up主deep_thoughts分享视频Score Diffusion Model分数扩散模型理论与完整PyTorch代码详细解读,在其讲解的英文文稿上做了翻译和适当的个人理解调整,感兴趣读者可以将本文作为该视频的参考读物结合学习。
文章目录
- 分数匹配网络
- 何为分数
- 基于朗之万动力学采样
- 分数匹配
- 去噪分数匹配
- Noise Conditonal Score Networks
- NCSN定义
- 通过分数匹配学习NCSN
- 基于退火朗之万动力学进行NCSN推理
- Stochastic Differential Equations--SDEs
- SDE下的扰动数据
- 用于采样的逆SDE过程
- 去噪分数匹配估计逆SDE过程所需分数
- 分数网络设计建议
分数匹配网络
何为分数
假设我们的数据集由来自一个未知数据分布 p d a t a ( x ) p_{data}(x) pdata(x)的 N N N个独立同分布样本 { x i ∈ R D } i = 1 N \{x_i \in R^D\}^N_{i=1} {xi∈RD}i=1N组成。定义概率密度 p ( x ) p(x) p(x)的 s c o r e score score为 ∇ x log p ( x ) \nabla_x \log p(x) ∇xlogp(x),即一个概率密度的对数似然关于变量 x x x的梯度就是该概率密度的分数。分数网络 s θ : R D → R D s_{\theta}: R^D \to R^D sθ:RD→RD是一个用 θ \theta θ表示参数的神经网络,其被训练用于去近似 p d a t a ( x ) p_{data}(x) pdata(x)的分数。生成建模的目标是基于数据集训练可以生成符合真实数据分布 p d a t a ( x ) p_{data}(x) pdata(x)新样本的模型。分数生成建模框架有两个核心要素:分数匹配和朗之万动力学;分数匹配的作用就是训练一个分数网络可以预测出真实数据分布的分数,而朗之万动力学则可以基于分数采样出新样本。
基于朗之万动力学采样
朗之万动力学能仅使用概率密度 p ( x ) p(x) p(x)的分数函数 ∇ x log p ( x ) \nabla_x \log p(x) ∇xlogp(x)生成符合 p ( x ) p(x) p(x)的样本。给定一个固定步长 ϵ > 0 \epsilon > 0 ϵ>0,一个初始值 x ~ 0 ∼ π ( x ) \tilde{x}_0 \sim \pi(x) x~0∼π(x), π \pi π是一个先验分布,朗之万动力学基于以下公式递归采样:
x ~ t = x ~ t − 1 + ϵ 2 ∇ x log p ( x ~ t − 1 ) + ϵ z t , (1) \tilde{x}_t = \tilde{x}_{t-1} + \frac{\epsilon}{2}\nabla_x \log p(\tilde{x}_{t-1})+\sqrt{\epsilon}z_t,\tag1 x~t=x~t−1+2ϵ∇xlogp(x~t−1)+ϵzt,(1)
其中 z t ∼ N ( 0 , I ) z_t \sim N(0,I) zt∼N(0,I)。当 ϵ → 0 \epsilon \to 0 ϵ→0, T → ∞ T \to \infty T→∞, x ~ \tilde{x} x~的分布等价于 p ( x ) p(x) p(x),在一些正则条件下 x ~ T \tilde{x}_T x~T成为 p ( x ) p(x) p(x)的一个样本。当 ϵ > 0 \epsilon > 0 ϵ>0, T < ∞ T < \infty T<∞,需要通过Metropolis-Hastings更新去纠正公式(1)中的错误,但实际上该过程进本被忽略。在SDE工作中,当 ϵ \epsilon ϵ很小, T T T很大时,也假设公式(1)存在的问题可以被忽略,即基于公式(1)采样出的样本时符合 p ( x ) p(x) p(x)。
公式(1)仅需要 ∇ x log p ( x ) \nabla_x \log p(x) ∇xlogp(x)就能采样,因此为了获得 p d a t a ( x ) p_{data}(x) pdata(x)的样本,首先要训练一个分数网络 s θ ≈ ∇ x log p ( x ) s_{\theta} \approx \nabla_x \log p(x) sθ≈∇xlogp(x),然后基于朗之万动力学使用公式(1)生成新样本。这是分数生成建模框架的关键。
分数匹配
分数匹配初始被设计用于从一个未知数据分布的独立同分布样本中学习非归一化统计模型,在SDE中将其重新应用于分数估计。使用分数匹配,能直接训练一个分数网络 s θ s_{\theta} sθ去估计 ∇ x log p d a t a ( x ) \nabla_x \log p_{data}(x) ∇xlogpdata(x),而不需要训练一个模型去估计 p d a t a ( x ) p_{data}(x) pdata(x)。与电影的分数匹配使用方法不同,SDE中不使用一个能量模型的梯度作为分数网络,可以避免由于高阶梯度导致额外计算。优化目标是 1 2 E p d a t a [ ∣ ∣ s θ − ∇ x log p d a t a ( x ) ∣ ∣ 2 2 ] \frac{1}{2}E_{p_{data}}[||s_{\theta}-\nabla_x \log p_{data}(x)||^2_2] 21Epdata[∣∣sθ−∇xlogpdata(x)∣∣22],其与以下公式等价
E p d a t a [ t r ( ∇ x s θ ( x ) ) + 1 2 ∣ ∣ s θ ( x ) ∣ ∣ 2 2 ] (2) E_{p_{data}}[tr(\nabla_x s_{\theta}(x))+\frac{1}{2}||s_{\theta}(x)||^2_2]\tag2 Epdata[tr(∇xsθ(x))+21∣∣sθ(x)∣∣22](2)
其中 ∇ x s θ ( x ) \nabla_x s_{\theta}(x) ∇xsθ(x)表示 s θ ( x ) s_{\theta}(x) sθ(x)的雅可比行列式,但深度模型和高i为数据时会导致此雅可比行列式计算困难,在大范围分数匹配场景下的有两种绕过雅可比行列式计算的方法,常用的一种就是去噪分数匹配。
去噪分数匹配
去噪分数匹配是一种完全规避求解 t r ( ∇ x s θ ( x ) ) tr(\nabla_x s_{\theta}(x)) tr(∇xsθ(x))的分数匹配变体。去噪分数匹配先用一个预定义的噪声扰动数据点 x x x,得到扰动后的数据分数 q σ ( x ~ ∣ x ) q_{\sigma}(\tilde{x}|x) qσ(x~∣x);然后使用分数匹配去估计扰动后数据分布 q σ ( x ~ ) = Δ ∫ q σ ( x ~ ∣ x ) p d a t a ( x ) d x q_{\sigma}(\tilde{x}) \overset{\Delta}{=} \int q_{\sigma}(\tilde{x}|x) p_{data}(x) dx qσ(x~)=Δ∫qσ(x~∣x)pdata(x)dx的分数。优化目标等价于以下公式:
1 2 E q σ ( x ~ ∣ x ) p d a t a ( x ) [ ∣ ∣ s θ ( x ~ ) − ∇ x ~ log q σ ( x ~ ∣ x ) ∣ ∣ 2 2 ] , (3) \frac{1}{2}E_{q_{\sigma}(\tilde{x}|x)p_{data}(x)}[||s_{\theta}(\tilde{x})-\nabla_{\tilde{x}} \log q_{\sigma}(\tilde{x}|x)||^2_2],\tag3 21Eqσ(x~∣x)pdata(x)[∣∣sθ(x~)−∇x~logqσ(x~∣x)∣∣22],(3)
有理由相信基于上述优化目标训练后的最优模型 s θ ∗ ( x ) = ∇ x log p σ ( x ) s_{\theta^*}(x) = \nabla_x \log p_{\sigma}(x) sθ∗(x)=∇xlogpσ(x)。那么当噪声非常小,即 q σ ( x ) ≈ p d a t a ( x ) q_{\sigma}(x) \approx p_{data}(x) qσ(x)≈pdata(x)时,有 s θ ∗ ( x ) = ∇ x log p σ ( x ) ≈ ∇ x log p d a t a ( x ) s_{\theta^*}(x)=\nabla_x \log p_{\sigma}(x) \approx \nabla_x \log p_{data}(x) sθ∗(x)=∇xlogpσ(x)≈∇xlogpdata(x)
此处去噪分数匹配给数据加噪与下文中的NCSN中的添加噪声不同,其不是条件,而是为了规避计算雅可比行列式的一种手段。
Noise Conditonal Score Networks
去噪分数匹配存在一个问题,即在数据密度较低的区域分数估计不准确(如下图所示),进而后续的采样结果也不会准确。为了解决低密度分数估计不准的问题,引入了噪声条件分数网络,即NSCN。
NSCN是带条件的分数网络,条件就是噪声。在上图数据基础上加噪后(下图所示),整体数据密度变大,低密度区域变得很少,就不再存在分数估计不准的问题。
那么应该如何加噪呢?在上述去噪分数匹配中提到,当加入的噪声很小时,才能基于公式(3)训练得到目标分数网络,但是当噪声很小时,加噪后的数据密度增幅不大,就会存在分数估计不准的问题;当加入的噪声很大时,虽然分数估计变准,但是加噪后的数据与原始数据分布区别就会很大,就违背了去噪分数匹配中的假设。为了兼顾两边,应该使用不同量级的噪声进行加噪,然后使用同一个分数网络去估计不同噪声量级下的分数。当分数网络训练完毕后,首先生成噪声量级大下分布的样本,然后逐渐降低噪声量级,最终基于朗之万采样平滑地生成符合目标分数地样本。
NCSN定义
假设有一组正等比数列 { σ i } i = 1 L \{\sigma_i\}^L_{i=1} {σi}i=1L,满足 σ 1 σ 2 = ⋯ = σ L − 1 σ L > 1 \frac{\sigma_1}{\sigma_2}= \cdots = \frac{\sigma_{L-1}}{\sigma_L} > 1 σ2σ1=⋯=σLσL−1>1。 q σ ( x ) = Δ ∫ p d a r a ( t ) N ( x ∣ t , σ 2 I ) d t q_{\sigma}(x) \overset{\Delta}{=} \int p_{dara}(t) N(x|t,\sigma^2I)dt qσ(x)=Δ∫pdara(t)N(x∣t,σ2I)dt表示扰动后的数据分布。 σ i \sigma_i σi就表征不同的噪声等级, σ 1 \sigma_1 σ1足够大,使其能修复数据密度低导致的分数估计不准的问题; σ L \sigma_L σL足够小,可认为扰动后的数据分布等价于原始数据分布。目标是使用一个条件分数网络去同时估计所有不同噪声等级扰动分布的分数,即 ∀ σ ∈ { σ i } i = 1 L , s θ ( x , σ ) ≈ ∇ x q σ ( x ) \forall \sigma \in \{\sigma_i\}^L_{i=1},s_{\theta}(x,\sigma) \approx \nabla_xq_{\sigma}(x) ∀σ∈{σi}i=1L,sθ(x,σ)≈∇xqσ(x)。注意,当 x ∈ R D , s θ ( x , σ ) ∈ R D x\in R^D,s_{\theta}(x,\sigma) \in R^D x∈RD,sθ(x,σ)∈RD, s θ ( x , σ ) s_{\theta}(x,\sigma) sθ(x,σ)即为噪声条件分数网络,NCSN。
通过分数匹配学习NCSN
假设噪声扰动后的数据分布为 q σ ( x ~ ∣ x ) = N ( x ~ ∣ x , σ 2 I ) q_{\sigma}(\tilde{x}|x)=N(\tilde{x}|x,\sigma^2I) qσ(x~∣x)=N(x~∣x,σ2I),则该分布的分数函数为 ∇ x ~ log q σ ( x ~ ∣ x ) = − x ~ − x σ 2 \nabla_{\tilde{x}}\log q_{\sigma}(\tilde{x}|x)=-\frac{\tilde{x}-x}{\sigma^2} ∇x~logqσ(x~∣x)=−σ2x~−x。对于给定 σ \sigma σ,去噪分数匹配优化目标如下:
l ( θ ; σ ) = Δ 1 2 E p d a t a E x ~ ∼ N ( x , σ 2 I ) [ ∣ ∣ s θ ( x , σ ) + x ~ − x σ 2 ∣ ∣ 2 2 ] , (4) l(\theta;\sigma) \overset{\Delta}{=} \frac{1}{2}E_{p_{data}}E_{\tilde{x} \sim N(x,\sigma^2I)}[||s_{\theta}(x,\sigma)+\frac{\tilde{x}-x}{\sigma^2}||^2_2],\tag4 l(θ;σ)=Δ21EpdataEx~∼N(x,σ2I)[∣∣sθ(x,σ)+σ2x~−x∣∣22],(4)
利用公式(4)对多有噪声等级计算后取平均值得到最终目标
L ( θ ; { σ i } i = 1 L ) = Δ 1 L ∑ i = 1 L λ ( σ i ) l ( θ ; σ i ) , (5) L(\theta;\{\sigma_i\}^L_{i=1}) \overset{\Delta}{=} \frac{1}{L}\sum_{i=1}^L \lambda(\sigma_i)l(\theta;\sigma_i),\tag5 L(θ;{σi}i=1L)=ΔL1i=1∑Lλ(σi)l(θ;σi),(5)
其中 λ ( σ i ) > 0 \lambda(\sigma_i)>0 λ(σi)>0是一个基于 σ i \sigma_i σi的系数函数。假设 s θ ( x , σ ) s_{\theta}(x,\sigma) sθ(x,σ)有足够的能力,训练完成之后得到的最后分数网络对于所有噪声等级都有, s θ ∗ ( x , σ i ) = ∇ x log q σ i ( x ) s_{\theta^*}(x,\sigma_i)=\nabla_x \log q_{\sigma_i}(x) sθ∗(x,σi)=∇xlogqσi(x),因为公式(5)是 L L L个去噪分数匹配目标的组合。
公式(5)中不同噪声等级的 λ ( ⋅ ) \lambda(\cdot) λ(⋅)设置有很多方法。理想情况下,希望对于所有噪声等级的 λ ( σ i ) l ( θ ; σ i ) \lambda(\sigma_i)l(\theta;\sigma_i) λ(σi)l(θ;σi)能大致在相同的数量等级。从经验上观察得到当分数网络训练到最优时, ∣ ∣ s θ ( x , σ ) ∣ ∣ 2 ∝ 1 σ ||s_{\theta}(x,\sigma)||_2 \varpropto \frac{1}{\sigma} ∣∣sθ(x,σ)∣∣2∝σ1(分数网络的二阶范数正比于噪声的倒数),这促使将 λ \lambda λ设置为 λ ( σ ) = σ 2 \lambda(\sigma)=\sigma^2 λ(σ)=σ2。因为在这个设置下,有 λ ( σ ) l ( θ ; σ ) = σ 2 l ( θ ; σ ) = 1 2 E p d a t a E x ~ ∼ N ( x , σ 2 I ) [ ∣ ∣ σ s θ ( x , σ ) + x ~ − x σ ∣ ∣ 2 2 ] \lambda(\sigma)l(\theta;\sigma)=\sigma^2l(\theta;\sigma)=\frac{1}{2}E_{p_{data}}E_{\tilde{x} \sim N(x,\sigma^2I)}[||\sigma s_{\theta}(x,\sigma)+\frac{\tilde{x}-x}{\sigma}||^2_2] λ(σ)l(θ;σ)=σ2l(θ;σ)=21EpdataEx~∼N(x,σ2I)[∣∣σsθ(x,σ)+σx~−x∣∣22],因为 x ~ − x σ ∼ N ( 0 , I ) \frac{\tilde{x}-x}{\sigma} \sim N(0,I) σx~−x∼N(0,I)并且 ∣ ∣ σ s θ ( x , σ ) ∣ ∣ 2 ∝ 1 ||\sigma s_{\theta}(x,\sigma)||_2 \varpropto 1 ∣∣σsθ(x,σ)∣∣2∝1,可以看到 λ ( σ ) l ( θ ; σ ) \lambda(\sigma)l(\theta;\sigma) λ(σ)l(θ;σ)的量级与 σ \sigma σ无关,即所有噪声等级的数量级一致。
基于退火朗之万动力学进行NCSN推理
当NCSN s θ ( x , σ ) s_{\theta}(x,\sigma) sθ(x,σ)被训练后可使用退火朗之万进行采样,如下表所示。采样从一些固定先验分布初始化实例开始,如从均匀分布中初始化 x ~ 0 \tilde{x}_0 x~0;然后使用步长 α i \alpha_i αi进行朗之万动力学从分布 q σ 1 ( x ) q_{\sigma_1}(x) qσ1(x)中采样。在每个噪声等级下均采样 T T T次,当进入到下一个噪声等级时,用上一个噪声等级的最后一个采样样本作为作为当前噪声等级的起始样本,按此规律迭代采样下去。最后,使用朗之万动力学从 q σ L ( x ) q_{\sigma_L(x)} qσL(x)中采样,即当 σ L ≈ 0 \sigma_L \approx 0 σL≈0时, q σ L ( x ) q_{\sigma_L}(x) qσL(x)近似于 p d a t a ( x ) p_{data}(x) pdata(x)。
将 σ i \sigma_i σi设置为正比于 σ i 2 \sigma_i^2 σi2,动机是固定朗之万动力学中信噪比 α i s θ ( x , σ i ) 2 α i z \frac{\alpha_is_{\theta}(x,\sigma_i)}{2\sqrt{\alpha_i}z} 2αizαisθ(x,σi)的数量级。
为了证明退火朗之万动力学的有效性,通过一个小型实验进行验证,实验设置 { σ i } i = 1 L \{\sigma_i\}^L_{i=1} {σi}i=1L为等比数列, L = 10 , σ 1 = 10 , σ 10 = 0.1 L=10, \sigma_1=10,\sigma_{10}=0.1 L=10,σ1=10,σ10=0.1,训练时使用EMA更新参数更稳定。
Stochastic Differential Equations–SDEs
上述NCSN虽然在多个噪声等级下进行了训练,但本质还是有限步骤加噪,如果将噪声等级推过到有限步骤,或者连续情况,就能使用随机微分方程/SDE对分数生成模型建模进行统一表征。
SDE下的扰动数据
为了基于分数模型生成样本,需要使用一个扩散过程逐渐缓慢加噪将原始数据转换为一个随机噪声,然在逆扩散过程通过估计分布的分数进行样本采样。一个扩散过程是与布朗运行相似的随机过程。假设 { x ( t ) ∈ R d } t = 0 T \{x(t) \in R^d\}^T_{t=0} {x(t)∈Rd}t=0T是一个扩散过程,有连续的时间变量 t ∈ [ 0 , T ] t \in [0,T] t∈[0,T]引导,该扩散过程可以用一个SDE表达,用以下公式表示
d x = f ( x , t ) d t + g ( t ) d w , (6) dx=f(x,t)dt+g(t)dw,\tag6 dx=f(x,t)dt+g(t)dw,(6)
随机微分方程是指含有随机参数或随机过程或随机初始值或随机边界值的微分方程;公式(6)中的 w w w表示标准布朗运动,使得SDE成立;布朗运动具有增量独立性、增量服从高斯分布、轨迹连续。公式(6)中 f ( ⋅ , t ) : R d → R d f(\cdot,t):R^d \to R^d f(⋅,t):Rd→Rd称为SDE的漂移系数, g ( t ) ∈ R g(t) \in R g(t)∈R成为扩散系数。可以将 SDE 理解为常微分方程 (ODE) 的随机推广。后续使用 p t ( x ) p_t(x) pt(x)表示 x ( t ) x(t) x(t)的分布。
基于分数的生成建模中一般有两个边界,即 x ( 0 ) ∼ p 0 x(0) \sim p_0 x(0)∼p0是已有数据集中独立同分布样本组成的原始数据分布, x ( T ) ∼ p T x(T) \sim p_T x(T)∼pT是一个有解析解且易采样的先验分布。整个扩散过程应该足够大,使得在噪声扰动后, p T p_T pT不再依赖 p 0 p_0 p0。
用于采样的逆SDE过程
从一个先验分布 p T p_T pT中样本开始,将SDE过程逆向进行,能逐渐获得一个符合原始数据分布 p 0 p_0 p0的样本,此过程就是逆SDE采样。至关重要的是,逆过程是时间倒流的扩散过程。它由以下逆SDE 公式表达
d x = [ f ( x , t ) − g 2 ( t ) ∇ x log p t ( x ) ] d t + g ( t ) d w ˉ , (7) dx=[f(x,t)-g^2(t)\nabla_x \log p_t(x)]dt+g(t)d\bar{w},\tag7 dx=[f(x,t)−g2(t)∇xlogpt(x)]dt+g(t)dwˉ,(7)
其中 w ˉ \bar{w} wˉ是布朗运动的逆向过程, d t dt dt就表示逆时方向上的时间微分。一旦知道了正向SDE过程中漂移系数、扩散系数和时间区间 t ∈ [ 0 , T ] t \in [0,T] t∈[0,T]内数据分布 p t ( x ) p_t(x) pt(x)的分数,该逆向SDE过程就能计算。
基于SDE的正向过程和逆向过程如下图所示,其实与DDPM中加噪过程是一致的,只是加噪过程变成了连续过程,数据变化开始用微分 d x dx dx表示。
去噪分数匹配估计逆SDE过程所需分数
基于公式(7),需要使用依赖时间分数函数 ∇ x log p t ( x ) \nabla_x \log p_t(x) ∇xlogpt(x)去执行逆向SDE过程,然后可使用数值解法从先验分布 p T p_T pT样本迭代计算得到符合 p 0 p_0 p0的样本。故需要训练一个时间相关的分数模型 s θ ( x , t ) s_{\theta}(x,t) sθ(x,t)去近似分数函数 ∇ x log p t ( x ) \nabla_x \log p_t(x) ∇xlogpt(x)。基于去噪分数匹配中公式(3),可以推导出时间相关分数模型的优化目标,如下所示
m i n θ E t ∼ U ( 0 , T ) [ λ ( t ) E x ( 0 ) ∼ p 0 E x ( t ) ∼ p 0 t ( x ( t ) ∣ x ( 0 ) ) [ ∣ ∣ s θ ( x ( t ) , t ) − ∇ x ( t ) log p 0 t ( x ( t ) ∣ x ( 0 ) ) ∣ ∣ 2 2 ] ] , (8) \underset{\theta}{min}E_{t \sim \mathcal{U}(0,T)}[\lambda(t)E_{x(0) \sim p_0}E_{x(t) \sim p_{0t}(x(t)|x(0))}[||s_{\theta}(x(t),t)-\nabla_{x(t)} \log p_{0t}(x(t)|x(0))||^2_2]],\tag8 θminEt∼U(0,T)[λ(t)Ex(0)∼p0Ex(t)∼p0t(x(t)∣x(0))[∣∣sθ(x(t),t)−∇x(t)logp0t(x(t)∣x(0))∣∣22]],(8)
其中 U ( 0 , T ) \mathcal{U}(0,T) U(0,T)是在区间 [ 0 , T ] [0,T] [0,T]上的均匀分布,实际使用时会进行归一化,即是区间 [ 0 , 1 ] [0,1] [0,1]上的均匀分布,分布中的数值是一个连续量; p 0 t ( x ( t ) ∣ x ( 0 ) ) p_{0t}(x(t)|x(0)) p0t(x(t)∣x(0))表示从 x ( 0 ) x(0) x(0)到 x ( t ) x(t) x(t)的转移概率, λ ( t ) \lambda(t) λ(t)表示一个正数权重。
在上述目标中, x ( 0 ) x(0) x(0)的期望可以通过 p 0 p0 p0的数据样本的经验平均值来估计。当SDE中的漂移系数 f ( x , t ) f(x,t) f(x,t)是一个仿射变换,即可通过重参数采样就能从 x ( 0 ) x(0) x(0)和时间 t t t采样出样本 x ( 0 ) x(0) x(0),即 x ( t ) x(t) x(t)的期望可通过从 p 0 t ( x ( t ) ∣ x ( 0 ) ) p_{0t}(x(t)|x(0)) p0t(x(t)∣x(0))采样来估计。为了匹配不同时间点上的分数匹配损失的数量级,权重函数 λ ( t ) \lambda(t) λ(t)一般设置为 1 E [ ∣ ∣ ∇ x ( t ) log p 0 t ( x ( t ) ∣ x ( 0 ) ) ∣ ∣ 2 2 ] \frac{1}{E[||\nabla_{x(t)} \log p_{0t}(x(t)|x(0))||^2_2]} E[∣∣∇x(t)logp0t(x(t)∣x(0))∣∣22]1,与上述NCSN中一致,如果噪声符合高斯分布, 1 E [ ∣ ∣ ∇ x ( t ) log p 0 t ( x ( t ) ∣ x ( 0 ) ) ∣ ∣ 2 2 ] \frac{1}{E[||\nabla_{x(t)} \log p_{0t}(x(t)|x(0))||^2_2]} E[∣∣∇x(t)logp0t(x(t)∣x(0))∣∣22]1就等于方差 σ t 2 \sigma^2_t σt2。
分数网络设计建议
时间相关的分数模型的网络架构没有任何限制,除了它们的输出应该与输入具有相同的维度,并且它们应该以时间为条件。以下实在结构设计上的几条有用建议
- 使用Unet作为分数网络 s θ ( x , t ) s_{\theta}(x,t) sθ(x,t)的主干通常效果更好
- 对于时间信息可以不只是使用简单的embedding隐射到分数网络中,而是使用高斯随机特征。具体做法是先从分布 N ( 0 , s 2 I ) N(0,s^2I) N(0,s2I)中采样一个 ω \omega ω,该分数是固定的,即 s s s是固定的,训练过程中不用学习。对于一个时间步 t t t,对应的高斯随机特征定义为 [ sin ( 2 π ω t ) ; cos ( 2 π ω t ) ] [\sin(2\pi \omega t);\cos(2\pi \omega t)] [sin(2πωt);cos(2πωt)], [ a ⃗ ; b ⃗ ] [\vec{a} ; \vec{b}] [a;b]表示 a ⃗ \vec{a} a和 b ⃗ \vec{b} b的拼接。该高斯随机特征可以用作时间步长 t 的编码,以便分数网络可以通过合并该编码来以 t 为条件。
- 可以对Unet的输出用一个系数 1 E [ ∣ ∣ ∇ x ( t ) log p 0 t ( x ( t ) ∣ x ( 0 ) ) ∣ ∣ 2 2 ] \frac{1}{\sqrt{E[||\nabla_{x(t)} \log p_{0t}(x(t)|x(0))||^2_2]}} E[∣∣∇x(t)logp0t(x(t)∣x(0))∣∣22]1进行缩放。这是为了使最优的分数网络 s θ ( x , t ) s_{\theta}(x,t) sθ(x,t)的二阶范数近似于 E [ ∣ ∣ ∇ x ( t ) log p 0 t ( x ( t ) ∣ x ( 0 ) ) ∣ ∣ 2 ] E[||\nabla_{x(t)} \log p_{0t}(x(t)|x(0))||_2] E[∣∣∇x(t)logp0t(x(t)∣x(0))∣∣2],此缩放过程有助于捕捉真实分数的范数。
- 训练时使用EMA更新模型权重,采用时使用EMA权重,此方法采样的样本质量更高。
相关文章:
从扩散模型开始的生成模型范式演变--SDE
SDE是在分数生成模型的基础上,将加噪过程扩展时连续、无限状态,使得扩散模型的正向、逆向过程通过SDE表示。在前文讲解DDPM后,本文主要讲解SDE扩散模型原理。本文内容主要来自B站Up主deep_thoughts分享视频Score Diffusion Model分数扩散模型…...
【python使用kazoo连ZooKeeper基础使用】
from kazoo.client import KazooClient, KazooState from kazoo.exceptions import NoNodeError,NodeExistsError,NotEmptyError import json# 创建 KazooClient 实例,连接到 ZooKeeper 服务器 zk KazooClient(hosts127.0.0.1:2181) zk.start()# 定义节点路径 path…...
【设计模式系列】解释器模式(十七)
一、什么是解释器模式 解释器模式(Interpreter Pattern)是一种行为型设计模式,它的核心思想是分离实现与解释执行。它用于定义语言的文法规则,并解释执行语言中的表达式。这种模式通常是将每个表达式抽象成一个类,并通…...
只出现一次的数字
只出现一次的数字 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 ÿ…...
SpringMVC-08-json
8. Json 8.1. 什么是Json JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写…...
技术文档的语言表达
技术文档的语言表达 在这个瞬息万变的技术世界中,了解如何撰写有效的技术文档显得尤为重要。无论是开发团队还是最终用户,清晰、简洁且有条理的文档都是连接各方的桥梁。本文将深入探讨技术文档的语言表达,从其重要性、写作原则到各种类型&a…...
UEFI 事件
UEFI 不再支持中断(准确地说,UEFI 不再为开发者提供中断支持,但在UEFI内部还是使用了时钟中断),所有的异步操作都要通过事件(Event)来完成。 启动服务为开发者提供了用于操作事件、定时器及TPL…...
大师开讲-图形学领域顶级专家王锐开讲Vulkan、VSG开源引擎
王锐,毕业于清华大学,图形学领域顶级专家,开源技术社区的贡献者与推广者。三维引擎OpenSceneGraph的核心基石开发者与维护者,倾斜摄影数据格式osgb的发明人。著有《OpenSceneGraph 3 Cookbook》,《OpenSceneGraph 3 Beginers Guid…...
小F的矩阵值调整
问题描述 小F得到了一个矩阵。如果矩阵中某一个格子的值是偶数,则该值变为它的三倍;如果是奇数,则保持不变。小F想知道调整后的矩阵是什么样子的。 测试样例 样例1: 输入:a [[1, 2, 3], [4, 5, 6]] 输出:…...
ORB-SLAM2 ----- LocalMapping::SearchInNeighbors()
文章目录 一、函数意义二、函数讲解三、函数代码四、本函数使用的匹配方法ORBmatcher::Fuse()1. 函数讲解2. 函数代码 四、总结 一、函数意义 本函数是用于地图点融合的函数,前面的函数生成了新的地图点,但这些地图点可能在前面的关键帧中已经生成过了&a…...
给UE5优化一丢丢编辑器性能
背后的原理 先看FActorIterator的定义 /*** Actor iterator* Note that when Playing In Editor, this will find actors only in CurrentWorld*/ class FActorIterator : public TActorIteratorBase<FActorIterator> {//..... }找到基类TActorIteratorBase /*** Temp…...
【Docker】常用命令汇总
Docker 是1个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相…...
Mybatis:CRUD数据操作之多条件查询及动态SQL
Mybatis基础环境准备请看:Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之多条件查询 1,编写接口方法 在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。在 BrandMapper 接口中定义多条件查询的方法。 而该功能有三个参数,…...
【笔记】轻型民用无人驾驶航空器安全操控
《轻型民用无人驾驶航空器安全操控》 理论考试培训材料 法规部分 【民用无人驾驶航空器的分类】 1、如何定义微型、轻型无人驾驶航空器? 微型无人驾驶航空器,是指空机重量小于0.25千克,最大平飞速度不超过40千米/小时,无线电发…...
TouchGFX设计模式代码实例说明
一)Model - View - Presenter (MVP) 模式在 TouchGFX 中的应用 1)Model(模型): 模型代表应用程序的数据和业务逻辑。例如,在一个简单的计数器应用中,模型可以是一个包含计数器当前值的类。 class CounterModel { pri…...
flink学习(7)——window
概述 窗口的长度(大小): 决定了要计算最近多长时间的数据 窗口的间隔: 决定了每隔多久计算一次 举例:每隔10min,计算最近24h的热搜词,24小时是长度,每隔10分钟是间隔。 窗口的分类 1、根据window前是否调用keyBy分为键控窗口和非键控窗口…...
restTemplate get请求
报错解释: 这个报错信息表明在使用RestTemplate进行GET请求时,需要提供一个请求类型(reqType),但是传入的值为空。这通常意味着在构建请求或者调用方法时,没有正确设置请求的Content-Type头部,…...
ffmpeg 预设的值 加速
centos 安装ffmpeg 编译安装 官网获取最新的linux ffmpeg 代码 https://ffmpeg.org//releases/ mkdir -p /data/app/ffmpeg cd /data/app/ffmpeg wget http://www.ffmpeg.org/releases/ffmpeg-7.1.tar.gz tar -zxvf ffmpeg-7.1.tar.gz#安装所需的编译环境 yum install -y \…...
maven <scope>compile</scope>作用
在 Maven 项目中, 元素用于定义依赖项的作用范围。 元素可以有多个值,每个值表示不同的作用范围。其中,scope compile scope 是默认的作用范围,表示该依赖项在编译、测试和运行时都需要。 scope compile scope 的含义 1、编译时…...
Ubuntu Server 22.04.5 从零到一:详尽安装部署指南
文章目录 Ubuntu Server 22.04.5 从零到一:详尽安装部署指南一、部署环境二、安装系统2.1 安装2.1.1 选择安装方式2.1.2 选择语言2.1.3 选择不更新2.1.4 选择键盘标准2.1.5 选择安装版本2.1.6 设置网卡2.1.7 配置代理2.1.8 设置镜像源2.1.9 选择装系统的硬盘2.1.10 …...
反射机制了解
反射概念 了解反射背景 存在某些变量或形参的声明类型是Object类型,但是程序却需要调用该对象运行时类型的方法,该方法不是Object中的方法,如何解决。转到如何获取该对象运行时类型的方法。 只能运行时才能获取,这就用到反射。 …...
机器学习策略Ⅰ
机器学习策略Ⅰ 在构建一个好的监督学习系统时,通常需要确保以下四个方面: 系统需要在训练集上能够很好地拟合数据,达到某种可接受的性能水平(如接近人类水平)。如果训练集表现不好,可以使用更大的模型&…...
redis中的bigkey及读取优化
一、bigKey介绍 1、简介 在 Redis 中,Big Key(大键)指的是占用大量内存的单个键。通常,Redis 是一个高性能的内存数据库,但是当某些键变得非常大时,会带来性能上的影响。例如,大量的内存消耗、长时间的操作延迟,甚至可能导致 Redis 停止响应或崩溃。 通俗的来说,指…...
【西瓜书】支持向量机(SVM)
支持向量机(Support Vector Machine,简称SVM)。 超平面 分类学习最基本的想法就是基于训练集合D在样本空间中找到一个划分超平面,将不同类别的样本分开。 但能将训练样本分开的划分超平面可能有很多,应该努力去找到哪…...
三维渲染中顺序无关的半透明混合(OIT)(二——Stencil Route)
1、A-Buffer算法。 在谈到Stencil Route之前,需要先讨论A-Buffer算法。A-Buffer是一种图形学(渲染方向)上的用于可见面分析(Visble Surface Detection)的技术,是Z-Buffer的衍生方法。 Z-Buffer是用于剔除 不透明 物体的算法。假…...
(SAST检测规则-3)固定的 SessionID 缺陷详解
漏洞类型: 会话固定攻击(Session Fixation Attack) 漏洞描述: 会话固定攻击是利用服务器的会话管理机制存在漏洞,攻击者通过提前控制或预测用户的会话标识符(Session ID),当用户登录…...
【安卓开发】【Android Studio】项目构建(Build)时报错:Integer Overflow
一、问题描述 在安卓项目中,构建(Build)失败并报错:xxxxx Integer Overflow(整型溢出)。 二、相关代码 刚开始以为是某个整数(例如控件、java类)不匹配造成的,检查如下…...
STM32主要功能
STM32 是由意法半导体(STMicroelectronics)推出的一系列基于 ARM Cortex-M 内核的微控制器(MCU)。STM32 微控制器广泛应用于嵌入式系统中,因其高性能、低功耗、丰富的外设接口和多种封装形式而被广泛采用。其主要功能和…...
MacOS 如何连接 Linux NFS 服务器
以 Ubuntu 为例。 Ubuntu 服务器端设置 1. 进入 root 权限,安装 NFS 服务: apt-get update apt-get install nfs-kernel-server2. 创建共享目录: mkdir /data chown nobody:nogroup /data chmod 777 /data3. 配置 /etc/exports 文件: vi …...
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-39
文件下载与邀请翻译者 学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么ÿ…...
创新驱动发展战略意义/seo优化需要做什么
实验环境 摘要拓扑图: 实验拓扑图 设备登录凭据 软路由设备:( GatewayIP: 1-9 ) Hostname IP Address Username/Password ispct-vyos eth0IP: 192.168.31.41/24 eth1IP: 192.168.10.1/24 dns: 192.168.30.191 ospfv2: Route-ID(1.1.1.1/32) vyos/12…...
帮别人做彩票网站/口碑seo推广公司
linux下给目录下所有子目录和文件赋权 chmod -R 777 * 给所有文件指定用户和用户组 chown - R wang.users /his 把目录/his及其下的所有文件和子目录的属主改成wang,属组改成users。...
怎么免费建设个人网站/企业宣传软文
1. 在Groovy可以用def定义无类型的变量(定义变量方面def与JavaScript中的var相似),和返回值为无类型的方法,而在Java中没有def 2. Java中的equals方法对应Groovy中的 , 而Java中的(判断是否引用同一对象)对应Groovy中的is方法 3…...
程序员做的网站别人用于诈骗/怎么查看域名是一级还是二级域名
这段时间在做Unity的项目,这差不多是我的第一次实战啊~然后公司来了实习的童鞋要学Unity,但是我一向不靠谱啊,所以只能帮他们稍微梳理下基础的东西了啊,唉~学长只能帮你们到这里了~顺便就把自己这两天整理的一些基础知识分享上来了…...
爱做的小说网站/网络软文推广平台
今天给大家推荐一个Android垂直型的SeekBar,可能对于你们在项目中有所帮助。这个已经有人具体实现。本人只是在这里稍做推荐。有关更多的好的控件本人在网上已建了一个网站专门做Android开源控件的收录以及示例代码的各种使用用法,目的是帮助更多的Android开发者&am…...
wordpress wbexam/快手流量推广网站
要实现一个类型转换器,我们必须要重写(override)四个方法: CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我们只提供转换string和InstanceDesc…...