简介
分数蒸馏采样(Score Distillation Sampling, SDS)是当今3D生成的一大流派,这个方法利用了预训练的2D扩散模型就能生成3D物体,而无需真实的3D数据。
原理推导
扩散模型的训练方式是:
LDiff(x;ϕ)=Et,ϵ[w(t)∥ϵϕ(xt,t)−ϵ∥22](1)
对于一个训练好的扩散模型,当给定一张图片x,这张图片在这个扩散模型训练集的分布内,那么这个损失函数将会较小;反之则较大。
SDS正是利用这个原理:如果一个3D模型的每一个角度渲染出来的图像都在预训练扩散模型的分布内(看起来比较真实),那么这个3D模型整体也就看起来比较真实。
在SDS算法中,优化一个NeRF,这个NeRF不断从不同的角度渲染图像,然后将这个图像交给预训练扩散模型计算公式(1)中的损失,即:
假设这个NeRF由θ参数化,从角度v渲染图像x=x(θ,v),则使用SDS优化θ的方法是:
但是,公式(2)是不高效的,求解梯度得到:
=Et,ϵ,v[w(t)∇θ∥ϵϕ(xt(θ,v))−ϵ∥22]=2Et,ϵ,v[w(t)∂xt(θ,v)∂ϵϕ(xt(θ,v))∂θ∂xt(θ,v)(ϵϕ(xt(θ,v))−ϵ)](3)
求解(*)需要计算扩散模型UNet的Jacobian(反向传播),效率很低。所以在SDS算法中,不直接使用公式(2)进行优化。
在SDS算法中,发现直接将梯度中的(*)省去也能有很好的效果,即:
=∇θEt,ϵ,v[w(t)∥ϵϕ(xt(θ,v))−ϵ∥22]=2Et,ϵ,v[w(t)∂θ∂xt(θ,v)(ϵϕ(xt(θ,v))−ϵ)](4)
这个梯度相当于最小化以下KL散度:
∇θLSDS=∇θEt,ϵ,v[σt/αtw(t)KL(q(xt(θ,v)∣x0(θ,v))∥pϕ(xt(θ,v)))](5)
证明:
(5)=Et,ϵ,v[σt/αtw(t)∇θKL(q(xt(θ,v)∣x0(θ,v))∥pϕ(xt(θ,v)))]
其中,∇θKL(q(xt(θ,v)∣x0(θ,v))∥pϕ(xt(θ,v)))=Eq[∇θlogq(xt(θ,v)∣x0(θ,v))−∇θlogpϕ(xt(θ,v))]
第一项:∇θlogq(xt(θ,v)∣x0(θ,v))=∇θlog(−2πσt1e−2σt2(xt(θ,v)−αtx0(θ,v))2)=∇θlog(−2πσt1e−2σt2ϵ2σt2)=0
第二项:−∇θlogpϕ(xt(θ,v))≈σtαtϵϕ(xt(θ,v),t)∂θ∂xt(θ,v)
所以,(5)=Et,ϵ,v[w(t)ϵϕ(xt(θ,v),t)∂θ∂xt(θ,v)]
对于一个0均值的高斯变量ϵ,在期望的意义下为0,可以继续将(5)改写为:
(5)=Et,ϵ,v[w(t)(ϵϕ(xt(θ,v),t)−ϵ)∂θ∂xt(θ,v))]
证明完毕!
SDS分析
公式(5)说明了SDS的优化目标是最小化NeRF从各个角度采样的图片加噪后的分布和扩散模型先验分布的KL散度,但是对于一个NeRF来说,它只表示一个场景,而扩散模型是大量图片形成的分布。SDS强行减少两个分布的KL散度,会导致NeRF渲染图的分布更加地平滑。所以SDS就会导致NeRF渲染图尽量和先验分布的所有图的距离都一样大,会导致多样性低、模糊的现象。
从优化方向(梯度)的角度来说,(5)式的是让NeRF渲染图朝着score,即最大化似然的方向优化,这就变成了mode seeking的方法,不论是什么样的初始化,最终会收敛到同一个似然最大的地方(注意这是一个高斯分布),多样性降低。