扩散模型到GLIDE

扩散模型的发展

扩散模型foundation model,GAN,VAE同属于生成领域。在这里插入图片描述
扩散模型的发展从DDPM—>GLIDE----->DALLE2----->Stable Diffusion
DALL-E 2 论文没有详细介绍模型架构,因为它主要扩展了早期的架构GLIDE。

扩散模型的数学原理

扩散模型的灵感来自非平衡热力学。他们定义了一个扩散步骤的马尔可夫链,以缓慢地将随机噪声添加到数据中,然后学习反转扩散过程以从噪声中构建所需的数据样本。下面的图片来自于DDPM的论文。
扩散模型的马尔科夫链过程

正向过程
给一个真实的数据分布X0 ~ q(x)(图片)采样的数据点,经过T步骤,不断的给数据添加少量噪声,产生一些列噪声样本X1…XT,最终当T→∞时,xT等价于一个各向同性的高斯分布。
逆向过程
逆向过程从一张随机高斯噪声图片 xt 开始,通过逐步去噪生成最终的结果 x0
具体的数学推导推荐看这个连接https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

扩散模型的引导生成guided generation

文生图:使用文本作为指导生成和文本匹配的图片。分为三种情况:分类器指导,clip指导,无分类器指导。核心思想其实是一样的。

分类器引导classified guided

在去燥生成图像的过程中(扩散模型的逆向过程中),每一步生成的图像都要分类器得到一个分类分数,然后计算这个分数和目标类别的交叉熵损失梯度,然后用这个梯度引导下一步扩散模型过程中的生成的采样。扩散模型和分类器分开独立训练,不需要重新训练扩散模型,比如DDPM扩散模型拿来直接就能用,只需要在生成时加入类别引导。
在这里插入图片描述

c这个位置用分类器做引导。

clip做引导CLIP guidance

和分类器引导很像,公式里的s超参数,越大引导的强度越大。g( c)的c是文本,f(xt)中的xt是图像,然后计算图像和文本的相似度去做引导。
在这里插入图片描述
clip大模型
该模型可以在共享嵌入空间中为图像或文本输入生成嵌入。可以找到图像和某些文本(例如标题)的嵌入的余弦相似度,可以确定文本与图像的相关性。CLIP 包括两部分,图像编码器 f(x)和字幕编码器 g( c)。在 GLIDE 和 DALL-E 2 中,CLIP 用于监督图像的生成。
在这里插入图片描述

无分类器引导 classified-free guided

为了避免必须训练额外的模型,提出了一种无分类器的指导方法。给扩散模型添加一个条件y,再有条件下和无条件下训练模型,预测噪声。
在这里插入图片描述

GLIDE大模型

论文连接:https://arxiv.org/abs/2112.10741
代码地址(暂时还没训练):https://github.com/openai/glide-text2im
有了上面的基础知识,终于到了最近一直在看的模型GLIDE。
该模型的作用是使用文本生成图片,它还能够进行图像修复。输入的标签是文本信息,基于引导的扩散模型。
模型详解
该架构是一个 U-Net 类型的模型,结合了卷积层的残差块和注意力块。
输入包括文字标题 c、图像 xt 和时间步长 t。时间步长被转换为谐波嵌入,然后通过线性层进行投影。(?)

输入文本的过程:
将文本 c 编码K 个token 序列,将其输入 到Transformer 模型中。官方代码

def get_text_emb(self, tokens, mask):
        assert tokens is not None
        if self.cache_text_emb and self.cache is not None:
            assert (
                tokens == self.cache["tokens"]
            ).all(), f"Tokens {
      
      tokens.cpu().numpy().tolist()} do not match cache {
      
      self.cache['tokens'].cpu().numpy().tolist()}"
            return self.cache

        xf_in = self.token_embedding(tokens.long())
        xf_in = xf_in + self.positional_embedding[None]
        if self.xf_padding:
            assert mask is not None
            xf_in = th.where(mask[..., None], xf_in, self.padding_embedding[None])
        xf_out = self.transformer(xf_in.to(self.dtype))
        if self.final_ln is not None:
            xf_out = self.final_ln(xf_out)
        xf_proj = self.transformer_proj(xf_out[:, -1])
        xf_out = xf_out.permute(0, 2, 1)  # NLC -> NCL

        outputs = dict(xf_proj=xf_proj, xf_out=xf_out)

        if self.cache_text_emb:
            self.cache = dict(
                tokens=tokens,
                xf_proj=xf_proj.detach(),
                xf_out=xf_out.detach() if xf_out is not None else None,
            )

        return outputs

该模型输出 64 x 64 图像,因此他们训练了一个上采样模型,该模型也以文本输入为条件,以生成大小为 256 x 256 的最终输出。
在论文中,他们试验了无分类器和基于 CLIP 的指导。为了支持无分类器指导,他们微调了模型,同时用空序列替换了 20% 的字幕。通过这种方式,模型可以生成文本条件和无条件输出。(?)

OpenAI 尚未发布完整模型,因为它可能会被用来生成有害图像。然而,他们已经发布了一个更小的变体。
更详细的还需要训练模型才能知道吧,先记录到这里吧

猜你喜欢

转载自blog.csdn.net/shan_5233/article/details/128529230
今日推荐