Score-Based

NCSN

pθ(x)=efθ(x)Zθ

已知很多样本 xi ,要估计 x 的概率分布,待学习参数为 θ 。然而问题是归一化常数 Zθ 很难求,因为没办法积分。

一般有两种解决方案,要么控制模型结构使得 Zθ 能处理,要么近似估计。而 Score-Based 使用 score function 绕开了这个问题:

xlogpθ(x)=xfθ(x)xlogZθ=0=xfθ(x)

然后就只需要训练一个函数 sθ 来拟合 xlogp(x) ,训练目标是最小化:

Ep(x)[xlogp(x)sθ(x)22]

我们不知道 xlogp(x) ,但这个可以通过 score matching 方法获得,一般两种方法: denoising score matching 或者 sliced score matching,NCSN 用的是前者去噪分数匹配。

然后就可以用类似退火爬山的朗之万动力学,通过一步步更新来采样了:

xi+1xi+ϵxlogp(x)+2ϵ zi,i=0,1,

其中 ziN(0,I) 用于增加随机性不至于卡在局部最小, ϵ0 使得步长从大到小最后收敛,而 xlogp(x) 是通过 sθ(x) 来拟合的。

还有问题是 p(x) 较小的地方没有梯度数据,使得这些地方更新不对,解决方法是在数据样本 x 上加噪声,类似于模糊滤镜,这样样本就扩散到稀疏的地方了,但准确性降低,因此让模糊程度从高到低,这可以通过直接在样本上加噪实现:

xi=x+σiz , zN(0,I)

其中 σi 是模糊程度,通过这些样本得到 pσi(x) 并训练得到 sθ(x,i)

这时候的训练目标是:

i=1Lλ(i)Epσi(x)[xlogpσi(x)sθ(x,i)22]

其中 λ(i)=σi2 是权重参数,用来平衡不同模糊程度的贡献。实际生成时,使模糊程度从大到小递减,这样可以前期走对方向,后期走得精准。

SDE

不同噪声程度划分得越细效果当然越好,所以使用随机微分方程使得离散的噪声程度变为连续的。

前向过程:

dx=f(x,t)dt+g(t)dw

其中 f(x,t):RdRd 叫 drift coefficient ,对应离散形式的 xlogp(x)g(t)R 叫 diffusion coefficient ,对应离散形式的 2dw 可以当作无穷小的噪声。前半部分描述采样运动,后半部分描述布朗运动。

反向过程:

dx=[f(x,t)g2(t)xlogpt(x)]dt+g(t)dw

类似离散版本,我们可以训练一个 sθ(x,t)

EtU(0,T)Ept(x)[λ(t)xlogpt(x)sθ(x,t)22]

其中 λ(t)1/E[x(t)logp(x(t)x(0))22] ,用于平衡贡献,选择 λ(t)=g(t)2 效果较好。

TODO:怎么得出反向过程公式和 λ(t) 的, f(x,t) 是什么?