【扩散模型】8、DALL-E2 | 借助 CLIP 的图文对齐能力来实现文本到图像的生成

在这里插入图片描述

文章目录

    • 一、背景
    • 二、方法
      • 2.1 Decoder
      • 2.2 Prior
    • 三、图像控制
      • 3.1 Variations
      • 3.2 Interpolations
      • 3.3 Text Diffs
    • 四、探索 CLIP 的潜在空间
    • 五、文本到图像的生成
      • 5.1 先验的重要性
      • 5.2 人类评价
      • 5.3 多样性和保真性的平衡
      • 5.3 在 COCO 上对比

论文:DALLE.2

代码:https://github.com/lucidrains/DALLE2-pytorch

出处:OPENAI

时间:2022.08

DALLE-2 的关键过程:

  • 给定一个文本,先用clip模型生成一个文本特征,这一步是固定的,这里的clip模型是锁死的,接下来就到了两阶段模型
  • 第一阶段:根据文本特征生成图像特征(prior),当然clip在这里也有用,因为clip生成的图像特征是要用做 ground truth 的。
  • 第二阶段:一旦有了图像特征,就需要decoder来生成最后的图像,就完成了从文本到图像的过程。

一、背景

使用类似于 CLIP 的对比学习的模型已经被证明能够很好的学习图像的表达,也能够捕捉语义和风格特征,所以能不能将 CLIP 和扩散模型结合起来,实现文本控制的图像或视频生成呢

本文作者就将这两个方法结合起来,来解决 text-conditional 图像的生成

  • 训练一个 diffusion decoder 来逆转 CLIP 图像编码器。这个逆转过程是非确定性的,也就是说,对于给定的图像嵌入(embedding),它可以生成多个对应的图像。逆转的意思就是将 CLIP 抽取图像特征的过程反过来,从特征恢复图像。
  • 使用 CLIP 的一个好处在于可以通过语音描述来控制生成的图像的特征
  • 为了得到完整生成模型, 作者将 CLIP 的 image embedding decoder 与先验模型结合起来, 根据给定的 text caption 来生成 CLIP image embedding

作者把本文提出的 text-conditional image generation 方法称为 unCLIP,因为这种生成方法其实是 CLIP image encoder 的逆过程

unCLIP模型基于"Contrastive Language–Image Pretraining"(对比语言-图像预训练)技术,这也就是“CLIP”的来源。然而,“un”表示“解开”,所以“unCLIP”实际上意味着该模型可以逆向工作,即不仅可以从文本生成相关图像,还能从图像生成相关文本。

例如,如果你给unCLIP一个描述性词句(如"太阳下山了"),它可能会产生一个与描述匹配的图片。相反地,如果你给它一张图片(如一张夕阳照片),它可能会生成一个描述该图片内容的句子。

二、方法

训练数据:图像 x 和 文本描述 y 组成的 pairs (x,y)

给定 image x x x,CLIP 的 image 和 text embedding 分别为 z i z_i zi z t z_t zt

本文生成过程包括两个部分:

  • prior P ( z i ∣ y ) P(z_i|y) P(ziy):这是一个条件概率,表示在给定文本描述 y y y 时产生 CLIP image embedding z i z_i zi 的概率。使用文本输入 CLIP 的 text encoder 之后,会得到文本特征,这里的 prior 就是根据这个文本特征来预测对应的图像特征。
  • decoder P ( x ∣ z i , y ) P(x|z_i,y) P(xzi,y):这个解码器接收 prior 预测到的 CLIP image embedding z i z_i zi 以及可选地接收文本描述,然后生成相应的图像 x x x。也就是根据编码来生成图片

根据这两个过程,可以得到在给定文本描述 y 时,产生图像 x 的概率

在这里插入图片描述

  • P ( x ∣ y ) P(x|y) P(xy): 这表示在给定文本描述 y 时,产生图像 x 的概率。也就是说,如果你有一个文本描述(比如"一只黑色的猫在跳跃"),这个模型能够生成符合这个描述的图像。

  • P ( x , z i ∣ y ) = P ( x ∣ z i , y ) P ( z i ∣ y ) P(x, zi | y) = P(x|zi , y)P(zi | y) P(x,ziy)=P(xzi,y)P(ziy): 这里使用了贝叶斯规则来分解上述概率。在给定文本 y 时,产生图像 x 和嵌入zi 的联合概率可以分解为:在给定 image embedding z i z_i zi 和文本 y 时产生图像 x 的条件概率(由解码器计算)和在给定文本 y 时产生 image embedding z i z_i zi 的条件概率(由先验计算)。

  • P(x|zi, y):这部分是由解码器提供的,在已知 CLIP image embedding z i z_i zi 和文本描述 y y y 的情况下,生成图片 x x x 的条件概率。

  • P(zi | y):这部分是先验,在已知文字说明 y 情况下得到 CLIP 图片嵌入 z i z_i zi 的条件概率。

  • 通过将两者相乘,可以得到完整模型 P ( x ∣ y ) P(x|y) P(xy),它可以根据输入语句生成相关联且符合该语句内容的图片。

2.1 Decoder

作者借鉴了 GLIDE 的结构,将 CLIP embedding 加到了 timestep embedding 中,且将 CLIP embedding 映射到了 4 个 额外的 token,和 GLIDE 的text encoder 输出进行 concat。

虽然可以直接从解码器条件分布进行采样,但过去使用扩散模型工作表明使用 conditional information 指导能够大大改善样本质量。所以本文中通过随机将 CLIP embedding 设为零,并在训练期间随机丢弃 50% 的文本字幕来实现无分类器指导。

为了生成高分辨率图像,作者训练两个扩散上采样模型:一个用于从64×64上采样至256×256分辨率图像;另一个进一步把那些图像上采样至1024×1024分辨率。为提高上采样器稳健性,在训练期间轻微破坏图片。对于第一个上采样阶段, 使用高斯模糊, 对于第二个阶段, 我们使用更多元化BSR降级处理。

为减少训练的计算和提高数值稳定性, 我们按照Rombach等人[42]建议在目标尺寸四分之一大小随机裁剪图片进行培训. 在模型里我们只用空间卷积 (也就是说不包含注意力层),并且在推断时直接应用目标解析度下的模型,观察它是否能很好地适应更高解析度。

2.2 Prior

虽然 decoder 可以通过 CLIP 的逆向操作来从 image embedding z i z_i zi 生成图像 x x x,但还需要一个先验模型来从文本输入 y y y 中来预测出需要用到的 image embedding z i z_i zi

作者对比了两种不同的先验模型:

  • 自回归先验 Autoregressive (AR) prior:将CLIP图像嵌入 z i z_i zi 转换为一系列离散编码,并在 y y y 的条件下自回归预测。
  • 扩散先验 Diffusion prior:直接使用以标题 y y y 为条件的高斯扩散模型对连续向量 z i z_i zi进行建模。

CLIP 的 text embedding z t z_t zt 也可以用作 condition prior

为了提高样本质量,作者在训练过程中随机丢弃10%的文本条件信息,以实现 classifier-free guidance 的AR和扩散先验采样。

对于 AR 先验:

  • 为了更有效地训练和从AR先验中采样,首先通过应用主成分分析(PCA)[37]来降低CLIP图像嵌入zi的维度。当使用SAM [15] 训练CLIP时,CLIP 表示空间的秩大幅降低,并略微改善评估指标。通过只保留原始1024个主成分中的319个主成分,能够保留几乎所有信息。

  • 使用 PCA 后,按照特征值大小递减顺序排列主成分,并将每个319维度量化到1024个离散桶内,并使用带有因果注意力掩码的Transformer [53]模型预测生成序列。这使得推理期间预测 token 数量减少三倍,并提高了训练稳定性。

  • 将文本标题和 CLIP embedding 作为前缀以控制 AR 先验。此外, 在序列前加上一个标记, 标记表示文本嵌入与图像嵌入之间(量化)点积, zi · zt. 这使得模型可以依赖更高点积进行条件设置, 因为更高文字-图片点积对应于更好地描述图片的标题

  • 在实践中, 作者发现从顶部一半的分布中抽取点积更好

对于扩散先验:

  • 在一个序列上训练了一个只有 decoder-only 的 Transformer模型,该序列包含:encoded text、CLIP text embedding、扩散时间步长的嵌入、带噪声的 CLIP image embedding,以及从 Transformer 中输出用于预测无噪声的 CLIP image embedding。

  • 通过生成两个 zi 样本并选择与 zt 点积更高的那个来提高采样时质量。对此预测使用均方误差损失:

    在这里插入图片描述

三、图像控制

本文的方法可以将任何给定的图像 x x x 编码为一个双边潜在表达 ( z i , x T ) (z_i, x_T) (zi,xT)

  • z i z_i zi:使用 CLIP 的 image encoder 编码得到的图像特征
  • x T x_T xT:使用 diffusion decoder 得到的生成的结果(conditioning on z i z_i zi

作者这里展示了 3 种不同的方式

3.1 Variations

给定图像 x x x,可以通过语言描述来让模型生成和主要元素有关但方向或形状不同的图像

实现的方式就是使用 DDIM 作为扩散模型,使用 η > 0 \eta>0 η>0 来控制采样:

  • η = 0 \eta=0 η=0 时,扩散模型解码器就是确定的,会产生和原图一样的图片
  • η \eta η 越大,就会对采样引入一定的随机性,产生一些变体

在这里插入图片描述

3.2 Interpolations

本文方法也支持将两张图片混合,通过将两个图片变换到 CLIP image embedding space 然后通过球面混合来实现

在这里插入图片描述
θ \theta θ 从 0 到 1,控制着两个图片的。球面插值(slerp)就像一个平滑过渡器,它能帮助我们从苹果(zi1)平滑过渡到香蕉(zi2)。θ值从0到1改变时,我们可以得到中间的各种"混合水果"状态。

  • 第一种方法就是在原始图像对应的DDIM反向潜变量之间进行类似上述球面插值般地过度, 这样会得到一个连续轨迹且起点为苹果、终点为香蕉.

  • 第二种方法则更随机:对于每次插入新元素(即新生成的“混合水果”图片),都采取随机选择其 DDIM 潜在值。虽然最后得出来结果可能不再完全符合原始图像(可能看起来既不太象苹果也不太象香蕉),但却能生成无数条独特且多样化的路径.

在这里插入图片描述

3.3 Text Diffs

使用 CLIP 和其他方法最大的不同就在于 CLIP 可以把 image 和 text 映射到同一隐空间,所以可以支持使用 language-guided 来控制图像的修改

为了根据文本描述 y y y 来修改图片,首先获取这个 y y y 对应的 text embedding z t z_t zt,同时也获得当前图片对应的 CLIP text embedding z t 0 z_{t_0} zt0,计算 text diff z d = n o r m ( z t − z t 0 ) z_d=norm(z_t-z_{t_0}) zd=norm(ztzt0)。然后使用球面插值来产生中间的 CLIP representation,使用 DDIM 生成对应的图片即可。球面插值公式如下:

在这里插入图片描述

在这里插入图片描述

四、探索 CLIP 的潜在空间

diffusion decoder 的存在,使得可以直接可视化 CLIP 图像编码器所看到的内容,来探索CLIP潜在空间。作为一个示例用例,我们可以重新审视那些CLIP做出错误预测的情况,比如文字攻击[20]。

在这些反面例子中,一段文字被覆盖在物体上面,导致CLIP预测出文字描述的物体而不是图像中描绘的物体。这段文字实际上在输出概率方面隐藏了原始对象。在图 6 中,我们展示了来自[20]的这种攻击的一个例子,在其中一个苹果可能被误分类为iPod。令人惊讶的是,尽管“Granny Smith”(一种苹果)被预测为近乎零概率事件, 我们发现我们的解码器仍然以很高概率生成苹果图片。此标题(指iPod)有非常高相对预测概率, 但模型从未产生过iPod图片.

在这里插入图片描述

PCA重构提供了另一种探索 CLIP 潜在空间结构的工具。在图7中,使用少量源图片的 CLIP 图像嵌入,并使用逐渐增加的 PCA 维度进行重构,然后使用我们的解码器和 DDIM 在固定种子上可视化重构的图像嵌入。这使我们能够看到不同维度编码的语义信息。我们观察到早期PCA维度保留了粗粒度语义信息,例如场景中有哪些类型的物体,而后期PCA维度则编码了更为精细的详情,如物体形状和确切形式等。例如,在第一个场景中,早期维度似乎编码了存在食物和可能存在容器这样的信息,而后面几个维度明确地编码了西红柿和瓶子等特定元素。

在这里插入图片描述

五、文本到图像的生成

5.1 先验的重要性

使用 UNCLIP的效果最好,仅使用 caption 作为条件的效果最差,在实验中对 AR 和 diffusion priors 进行了比较,发现 diffusion prior 更胜一筹。

在这里插入图片描述

5.2 人类评价

在这里插入图片描述

5.3 多样性和保真性的平衡

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.3 在 COCO 上对比

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM-12-即时编译器

Java程序最初都是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”(Hot Spot Code),为了提高热点代码的执行效率&#xf…

案例 | 数据中台如何支撑6000+门店降本提效?

对于企业来说,上中台不是目的,借助数据中台让企业建立数据驱动意识,并结合数据中台持续做好各项业务运营,才是根本。 那么对于零售行业来说,该如何利用数据中台为业务赋能?惟客数据以某头部连锁零售企业为…

leetcode 974. 和可被 K 整除的子数组(优质解法)

代码&#xff1a; class Solution {public int subarraysDivByK(int[] nums, int k) {HashMap<Integer,Integer> hashMapnew HashMap();hashMap.put(0,1);int count0; //记录子数组的个数int last0; //前一个下标的前缀和int now0; //当前下标的前缀和for(int i0;…

打开任务管理器的13种方法,总有一款适合你

任务管理器是一个很好的工具,可以帮助你管理应用程序、进程和服务在Windows PC上的运行方式。在使用任务管理器之前,你应该首先知道如何打开它。在本指南中,我们将向你展示运行它的不同方式,无论你使用的是Windows 11还是Windows 10。该列表包括启动任务管理器的十三种方法…

使用Python爬取GooglePlay并从复杂的自定义数据结构中实现解析

文章目录 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》&#xff0c;对分布…

计算机组成原理综合3

41、计算机操作的最小时间单位是__________。A A. 时钟周期 B. 指令周期 C. CPU周期 D. 外围设备 42、微程序控制器中&#xff0c;机器指令与微指令的关系是__________。B A. 每一条机器指令由一条微指令来执行 B. 每一条机器指令由一段用微指令编成…

在做题中学习(35):判断字符是否唯一

面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;1.用哈希表&#xff08;创建另一个数组存储&#xff09;然后和原数组一一比对。 时间复杂度O&#xff08;N&#xff09; 空间复杂度 O&#xff08;N&#xff09; 2.位图&#xff08…

使用物理机的burpsuite抓取虚拟机的请求包(虚拟机代理配置)

关于burpsuite抓取本地浏览器的请求包大家应该都会配置吧 我也是第一次配抓取虚拟机的包&#xff0c;最开始遇到了些问题&#xff0c;这里简单给大家分享一下 下面以Windows系统下的Firefox浏览器为例&#xff1a; 首先我还是先添加了一个小狐狸&#xff08;foxyproxy&#…

ubuntu保存分辨率失效解决办法

在VM虚拟机中&#xff0c;遇到修改ubuntu分辨率后&#xff0c;重启后又重置的解决办法。 目前我的ubuntu版本是&#xff1a;ubuntu 18.04.6 版本。 1.首先&#xff0c;在你喜欢的目录建立一个.sh 脚本文件。 终端执行命令&#xff1a;sudo vim xrandr.sh 2.按 i 进入编辑状…

神经网络:优化器和全连接层

SGD&#xff08;随机梯度下降&#xff09; 随机梯度下降的优化算法在科研和工业界是很常用的。 很多理论和工程问题都能转化成对目标函数进行最小化的数学问题。 举个例子&#xff1a;梯度下降&#xff08;Gradient Descent&#xff09;就好比一个人想从高山上奔跑到山谷最低…

【51单片机系列】C51中的中断系统扩展实验

本文是关于51单片机中断系统的扩展实验。 文章目录 一、 扩展实验一&#xff1a;使用外部中断0控制蜂鸣器&#xff0c;外部中断1控制直流电机二、扩展实验二&#xff1a;修改定时器初值&#xff0c;设定3秒钟的定时时间让LED模块闪烁三、扩展实验三&#xff1a;使用定时器1和数…

华为OD机试 - 区间交集 - 深度优先搜索dfs算法(滥用)(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述备注用例1、输入2、输出3、说明 四、解题思路1、核心思路&#xff1a;2、具体步骤 五、Java算法源码再重新读一遍题目&#xff0c;看看能否优化一下~解题步骤也简化了很多。 六、效果展示1、输入2、输出3、说明 华为OD机试 2…

Screen记录窗口输出日志

screen是Linux窗口管理器&#xff0c;用户可以建立多个screen会话&#xff0c;每个screen会话又可以建立多个window窗口&#xff0c;每一个窗口就像一个可操作的真实的ssh终端一样。 screen详解&#xff1a;http://www.linuxidc.com/Linux/2013-10/91612.htm Linux Screen超简…

C++_动态二维数组的两种方法

介绍 本文主要介绍使用 动态二维数组的两种方法 (PS:仅作创建 动态二维数组参考,详细使用方法根据需求自行改变) 第一种&#xff1a;连续存储结构的 二维动态数组(需固定 列 大小&#xff0c;可通过下标访问) 缺点: 1.需要在设计二维数组前写死 列 的大小 2.空间利用率不高 优点…

PostgreSQL使用docker部署,设置密码失效问题处理

文章目录 问题描述使用场景排查解决修改已有的文件卷使用SQL初始化 问题描述 PostgreSQL使用docker虚拟化部署&#xff0c;使用docker-compose管理&#xff0c;配置了密码部署在客户现场时&#xff0c;客户的安全扫描&#xff0c;反馈测到PostgreSQL数据库弱密码漏洞查看docke…

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一 学习前言为什么每次训练结果不同什么是随机种子训练中设置随机种子 学习前言 好多同学每次训练结果不同&#xff0c;最大的指标可能会差到3-4%这样&#xff0c;这是因为随机种子没有设定导致的&#x…

网络安全:专科及普通本科的温柔乡

当代普通大学生的现状是卷又卷不过、躺又躺不平&#xff0c;把大把的青春都荒废在了思考我应该做什么才能有前途的问题上面。当然&#xff0c;这里说的是那些普通学历且对自己的职业生涯甚至是人生没有规划的大学生&#xff0c;包括专科、普通一本二本&#xff0c;并非985、211…

MySQL-2

复习 1. Data数据–>DB数据库–>DBMS数据库管理系统常见DBMS: MySQL oracle sql server db2 … redis Mongodb两大功能&#xff1a; 定义DDL 操纵DML 2. 表table创建表, 行和列 3. MySQL数据类型数据类型分成三大类&#xff1a;数值型、字符型、日期时间类4. 关于列属性…

【JVM基础】 JVM 如何加载一个类以及类加载机制

文章目录 1、什么时候一个类会被加载&#xff1f;1、包含 main 方法的主类2、非 包含 main 方法的主类&#xff0c;什么时候去加载&#xff1f; 3、类加载器如何加载一个类&#xff1f;1、验证阶段&#xff1a;2、准备阶段&#xff1a;3、解析阶段&#xff1a;4、初始化&#x…

PHP开发日志——循环和条件语句嵌套不同,效率不同(循环内加入条件语句,条件语句判断后加入循环,array_map函数中加入条件语句)

十多年前开发框架时&#xff0c;为了效率不断试过各种代码写法&#xff0c;今天又遇到了&#xff0c;想想php8时代会不会有所变化&#xff0c;结果其实也还是和当年一样&#xff0c;但当年没写博客&#xff0c;但现在可以把数据记录下来了。 PHP_loop_ireflies_dark_forest 项目…