Q:有关于扩散模型的一个点不太懂,就是损失为何是去噪Unt的输出跟随机噪声的均方差?假如是图像修复任务,那为何不是去噪结果与真实图像进行损失计算呢?
A:扩散模型simple loss将U-Net的输出与随机噪声计算MSE,其实不是为了预测噪声,而是为了解析分布,让预测结果的均值满足随机高斯分布的均值。这里是因为DDPM中 p(xt−1|xt) 的过程方差是固定的,要解析分布无非就是预测均值。而DDPM中说过直接预测随机高斯噪声的做法 会比直接预测均值的做法效果要更好 ,所以最终simple loss的形式就变成直接跟随机高斯噪声运算了。
Q:如果是图像修复任务,本身输入含有mask的图像,如果带着mask的图像进行加噪,去噪,那去噪后的图像岂不是还带着mask?mask怎么修复成真实图像呢?训练过程也没用过去噪图与真实图像做损失啊?
A:对于图像修复任务的话,如果记输入的干净图像是 x0,经过t步加噪之后的带噪图像为 xt,mask为 m,通常会有一步 x^t=xt⊙m+x0⊙(1−m)的compse操作,同时U-Net的输入通常会有一个额外的channel用于mask的concat,然后再将 x^t和 m的concatenation送入U-Net预测噪声,这样U-Net学习到的分布就是mask区域内部的,同时模型也能够接受mask的输入,在sampling的时候就会仅生成mask区域的内容了。
Q:文生图任务去噪Unet的输入是4通道,本身图片是3通道,那为何要变成4通道进去?额外一个通道哪里来的?
A:4通道是vae隐空间特征的形状,后面SD3都把通道数扩到了64了。
Q:修复的时候,在测试中采样阶段会事先生成一个跟原始输入相同纬度的假图像(全是噪声)然后用这个假图像来进行去噪,真实的带有mask的输入图像跟这个假图像做concat操作,也就是其实输入带有mask的图像,其实相当于一个控制条件?而真正进入Unet去噪的图像还是随机生成的高斯噪声图像?
A:送入unet去噪的图像是噪声潜变量+masked image+mask的concat组合,训练中模型可以学到mask区域的修复,因为你除mask区域之外的相当于把gt给模型了,不用学了。
Q:在pipline中有一行代码是latents = (init_latents_proper * mask) + (latents * (1 - mask)) 这里直接对latent添加mask给我造成很大疑惑,image经过encode后,在latent中的信息不应该没有一一对应的关系嘛?就比如我在(20,20)处有一个点是红色但是经过encode后这个红色点对应的信息不一定在(20,20)处了。那我给latent直接添加mask后经过decode产生的图像和原来mask的位置是怎么对应上的?
A:VQGAN压缩后的表征跟RGB空间中的图像是有一定空间一致性的,RGB空间图像下采样8倍跟VQGAN空间的latent feature是有对应关系的 ,做inpainting的时候直接把下采样之后的mask打到latent feature上就可以了。
T1:矩阵乘积AB与SD模型的参数有相同的维度,同时分解出来的两个较小矩阵可以确保参数更新是在低秩情况下的,这样就显著减少训练的参数数量了。通常来说,对于矩阵𝐴,我们使用随机高斯分布初始化,并对于矩阵𝐵使用全0初始化,使得在初始状态下这两个矩阵相乘的结果为0。这样能够保证在初始阶段时,只有SD模型(主模型)生效。b的偏导数(梯度)不是0哈,经过第一次反向传播之后b就有非0值了。
T2: