如果尝试用stable diffusion生成特别暗或特别亮的图像,它几乎总是生成平均值相对接近 0.5 的图像。如下图所示,生成暗的图片总是带着明亮的区域(暗的街道明亮的光),生成亮的图片总是带着暗的区域(白的雪暗的树)。
Offset Noise正是为了解决这个问题的一个trick。
stable diffusion使用的初始噪声是服从 N ( 0 , I ) N(\pmb{0}, \pmb{I}) N(0,I)的,如下:
noise = torch.randn_like(latents)
Offset Noise将初始噪声改为
noise = torch.randn_like(latents) + 0.1 * torch.randn(latents.shape[0], latents.shape[1], 1, 1)
因为虽然前向过程在不停的往图片加噪声,但实际上,因为实现的问题,前向过程最后并没有得到真的符合 N ( 0 , I ) N(\pmb{0}, \pmb{I}) N(0,I)分布的噪声。而反向过程是从 N ( 0 , I ) N(\pmb{0}, \pmb{I}) N(0,I)中采样初始噪声的,这导致了前向过程和反向过程之间的差异。
参考
https://www.crosslabs.org/blog/diffusion-with-offset-noise
Common Diffusion Noise Schedules and Sample Steps are Flawed