guidance是这样做的,其实没什么知识点,知道classifier-based 的diffusion model是怎么控制生成图片的类别的就知道了。首先,原来的diffusion是从
z
t
z_t
zt预测噪声epsilon减去得出
z
0
z_0
z0,然后从
z
t
z_t
zt和
z
0
z_0
z0推
z
t
−
1
z_{t-1}
zt−1,这就是一个reverse的step。那么guidance就是,在
z
0
z_0
z0的基础上,计算一个损失,然后计算损失对于对于
z
0
z_0
z0的梯度,乘以一个scale,加上去,相当于对
z
0
z_0
z0做了一步梯度回传加更新,得到
z
^
0
\hat z_0
z^0。然后以更新后的
z
^
0
\hat z_0
z^0和
z
t
z_t
zt来推
z
t
−
1
z_{t-1}
zt−1,作为一个reverse的step。关键就是这个损失怎么算,一般guidance就是计算
z
0
z_0
z0和guidance的相似度,本文也一样,guidance image就是一阶段restored 的image,但是我们希望只有平滑区域学restored image,有纹理区域不要学,让diffusion生成,所以就在算loss的时候乘了个平滑度图。
如上所示,
D
(
z
0
)
D(z_0)
D(z0)就是stable diffusion的decoder,stable diffusion不是直接对图片进行reverse step,而是对特征进行diffusion,所以需要先用decoder把特征转成图像域,再和restored image算差,差还是CHW的,还没取平均,这时候先element-wise地乘以一个权重图
W
W
W,这个
W
W
W表示的是区域的平滑度,越高则越接近1,否则越接近0。从而这个损失对有纹理细节的区域影响相对小,而对平滑区域影响相对大,所以实现了前面的目的。
W
W
W怎么来的,很简单,先用sobel算子对restored image算梯度的模,然后切不相交的patch,算patch内部的平均,然后用1来减。