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: