diffusion model(六)Dalle2技术小结

news2024/9/20 16:37:53

Dalle2 技术小结

文章目录

  • Dalle2 技术小结
    • 系列阅读
    • 背景
    • Dalle2的总体架构
      • DiffusionPrior模块
        • 训练阶段
        • 推理阶段
      • DiffusionDecode 模块
    • Dalle2的生成质量和目前的局限性
      • Dalle2的生成效果
        • 基于MS-COCO caption生成效果
        • Other
      • Dalle2的局限性
    • 参考文献

系列阅读

  • diffusion model(一)DDPM技术小结 (denoising diffusion probabilistic)
  • diffusion model(二)—— DDIM技术小结
  • diffusion model(三)—— classifier guided diffusion model
  • diffusion model(四)文生图diffusion model(classifier-free guided)
  • diffusion model(五)stable diffusion底层原理(latent diffusion model, LDM

背景

随着AIGC概念及diffusion model在视觉领域的发光发热。OpenAI结合CLIP与diffusion model提出了一个二阶段的文本生成图片范式Dalle2[1],能够更精细的从语义层面控制图片的生成效果。得益于其训练范式,Dalle2的图片生成的质量不弱于GLIDE[2],但生成器的多样性有明显提升。下面我们来看它是怎么做的吧!

Dalle2的总体架构

Dalle2作为一个文到图的生成模型,其输入是文本,其输出是基于该文本对应的图片即 P ( x ∣ y ) P(x|y) P(xy) 。Dalle2将该过程分为两个阶段

其一是DiffusionPrior P ( z i ∣ y ) P(z_i|y) P(ziy),其作用是获得输入文本 y y y对应的CLIP图片向量 z i z_i zi

其二是DiffusionDecode P ( x ∣ z i , y ) P(x|z_i,y) P(xzi,y),作用是根据输入的文本 y y y和估计的图片向量 z i z_i zi生成图片 x x x。下面我们对这两个模块进行详细介绍。

上述两个阶段可用公式(1)进行表述
P ( x ∣ y ) = P ( x , z i ∣ y ) = P ( x ∣ z i , y ) P ( z i ∣ y ) P(x|y)=P(x,z_i|y) = P(x|z_i, y)P(z_i|y) P(xy)=P(x,ziy)=P(xzi,y)P(ziy)
可能会有读者疑问为什么 P ( x ∣ y ) = p ( x , z i ∣ y ) P(x|y)=p(x,z_i|y) P(xy)=p(x,ziy)这是因为 z i z_i zi x x x的CLIP的image embedding,CLIP是一个确定的函数,故相等
在这里插入图片描述

DiffusionPrior模块

Prior模块的作用是给定文本,生成该文本对应的CLIP模型的图片向量。(generate possible CLIP image embedding from a given text caption)

前置知识:

  • DIffusion model的原理,可参考博客[^5]。

  • CLIP的基本原理[^4]。

训练阶段

训练数据: 图片文本对 { ( x i , y i ) ∣ i = 1 , 2 , . . . , N } \{(x_i,y_i)| i=1,2,...,N\} {(xi,yi)i=1,2,...,N}

对DuffusionPrior的训练主要包含以下几个步骤:

Step1:将图片文本对输入到CLIP[^4]模型中获得对应的文本向量编码(text embedding)文本中每个token的编码(text encoding)及图像向量编码(image embedding)。这里值得注意的是:CLIP的模型权重冻结,不参加训练。

Step2: 对image embedding(此处的image embedding就是diffusion model中的 x 0 x_0 x0)。随机采样时间步 t t t,对 x 0 x_0 x0进行加噪,得到第 t t t时刻的noise image embedding x t x_t xt

Step3: 将文本向量编码、文本token编码、时间步向量、 t t t时刻的图像向量编码输入到模型中(其本质是一个decode-only transformer with a causal attention mask)。该模型的作用是预测分布 p ( x t − 1 ∣ x t ) p(x_{t-1}|x_t) p(xt1xt)分布的均值。

Step4: 计算预测分布与实际分布的KL散度实现训练。

PS:作者训练中用了很多trick,由于本文主要关注在理解dalle2的工作原理,故未详细描述,若想深入了解可参考代码。
在这里插入图片描述

原创图,使用请注明出处

推理阶段

推理阶段主要包含以下步骤:

Step1:将文本内容 y y y送入到CLIP模型中得到文本向量文本向量编码(text embedding)文本中每个token的编码(text encoding)。

Step2: 从高斯分布中随机采样一组向量作为 T T T时刻的图片向量编码。将文本向量编码、文本中每个token的编码、时间步编码、 T T T时刻的图片向量编码送入到DiffusionPriorNetwork中,预测 T − 1 T-1 T1时刻的图片向量编码。

Step3: 不断重复步骤2,直至时间步到 0 0 0得到所需的image embedding。

可能会有读者有疑问:CLIP模型不是已经在文本特征与图片特征对齐了吗?为什么要多此一举设计DiffusionPrior模块来根据文本embedding来生成图片embedding而不是直接用文本embedding来作为图片embedding。

这是因为虽然CLIP在训练过程中通过对比损失使得图片特征与文本特征进行对齐,但是模态间还是有存在Gap[^6],Prior模块的很大的意义是给定文本embedding,准确预测出其对应CLIP的image embedding,更有益于重建的效果。如下图将CLIP的image embedding送入decode生成的图像(第三行)从相关性与质量上明显优于直接送入text embedding的效果(第二行)。

在这里插入图片描述

DiffusionDecode 模块

Decode部分也是个diffusion model。其主要作用是根据image embedding和文本embedding进行图像重建。这里值得强调的是,之前基于文本生成图片的任务只有文本向量作为条件(condition)。与之不同的是,Dalle2生成图片的条件有两个:其一是文本向量;其二是基于Prior模块估计的图片向量,这个操作使得它的生成效果更逼真、稳定。
原创图,使用请注明出处

decode模块有两个比较关键训练trick

  1. 如何实现classifier-free guidance[^7]

    dalle2的实现是每次随机mask掉10%的CLIP embedding,并且每次随机丢弃50%的text caption。

  2. 如何获得更高分辨率的生成图像

    Dalle2采用了渐进式的生成方法。Dalle2训练了两个diffusion upsampler模型,第一个模型从 64 × 64 64 \times 64 64×64采样到 256 × 256 256 \times 256 256×256,第二个进一步采样到 1024 × 1024 1024 \times 1024 1024×1024。为了提升upsamper的稳健性,第一个上采样阶段用了高斯模糊;第二个上采样阶段用了多种BSR degradation操作[^8]

最后来看一下Dalle2的pipeline

原创图,使用请注明出处

Dalle2的生成质量和目前的局限性

Dalle2的生成效果

基于MS-COCO caption生成效果

Other

Dalle2的局限性

CLIP的embedding没有将属性精确的绑定到对象,导致进行解码重建时会混淆属性和对象。

CLIP的embedding可能没有精确编码渲染文本的拼写信息,导致连续文本的生成会出现问题。

由于解码器是在 64 × 64 64 \times 64 64×64分辨率生成图像,虽有进行上采样,这可能导致难以在复杂场景生成细节。

参考文献

  1. Dalle2论文:Hierarchical Text-Conditional Image Generation with CLIP Latents
  2. GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models.
  3. https://github.com/lucidrains/DALLE2-pytorch
  4. [Learning Transferable Visual Models From Natural Language Supervision](Learning Transferable Visual Models From Natural Language Supervision)
  5. DDPM (denoising diffusion probabilistic) 技术小结
  6. Mind the Gap: Understanding the Modality Gap in Multi-modal Contrastive Representation Learning
  7. Classifier-Free Diffusion Guidance
  8. High-Resolution Image Synthesis with Latent Diffusion Models

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

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

相关文章

Ubuntu服务器ELK部署与实践

文章目录 1. Docker安装2. 拉镜象2.1 ElastciSearch2.2 Kibana2.3 logstash 3. 数据展示 1. Docker安装 看之前的文章 docker ubuntu完全卸载docker及再次安装 Ubuntu安装 Docker 此外,Docker偶尔会出现这种问题dial tcp: lookup registry-1.docker.io on 192.168.1…

ICMP 理解

icmp 差错报告机制,tcp/ip协议族中重要的子协议,通常被ip层或者更高的(tcp/udp)使用,,属于网络层协议,主要用于在ip主机和路由器之间传递控制消息,用于报告主机是否可达、路由是否可…

融邦JAVA面试题

1. Java线程池的作用及使用方式 线程池的作用: (1) 降低系统资源消耗:通过重用已存在的线程,降低线程创建和销毁造成的消耗。 (2) 提高系统响应速度:当有任务到达时,无需等待新线程的创建便能立即执行。 (3) 提高线程…

SpringBoot3基础用法

技术和工具「!喜新厌旧」 一、背景 最近在一个轻量级的服务中,尝试了最新的技术和工具选型; 即SpringBoot3,JDK17,IDEA2023,Navicat16,虽然新的技术和工具都更加强大和高效,但是适应采坑的过程…

阿里云瑶池 PolarDB 开源官网焕新升级上线

导读近日,阿里云开源云原生数据库 PolarDB 官方网站全新升级上线。作为 PolarDB 开源项目与开发者、生态伙伴、用户沟通的平台,将以开放、共享、促进交流为宗旨,打造开放多元的环境,以实现共享共赢的目标。 立即体验全新官网&…

【测试】软件测试工具JMeter简单用法

简明扼要,点到为止。 1. JMeter介绍 JMeter的全称是Apache JMeter,是一款用于软件测试的工具软件,其是开源免费的,由Apache基金会运营。 官网:Apache JMeter - Apache JMeter™ 2. 下载安装及运行 2.1 安装 Java8…

RabbitMQ的6种工作模式

RabbitMQ的6种工作模式 官方文档: http://www.rabbitmq.com/ https://www.rabbitmq.com/getstarted.html RabbitMQ 常见的 6 种工作模式: 1、simple简单模式 1)、消息产生后将消息放入队列。 2)、消息的消费者监听消息队列,如果队列中…

深入探究Spring核心模块

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

Flowise AI:用于构建LLM流的拖放UI

推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Flowise AI? Flowise AI是一个开源的UI可视化工具,用于帮助开发LangChain应用程序。在我们详细介绍 Flowise AI 之前,让我们快速定义 LangChain。LangChain是…

谈谈如何使用ShellExecute的返回值

之前的一篇文章中,我们讲到了在 16 位 Windows 中,实例句柄(HINSTANCE)唯一标识了一个进程。到了 32 位 Windows,内核得到了完全的重新设计,其中之一是:它引入了 “内核对象” 和 “安全描述符”。 在 16 位 Windows …

vue项目实战-脑图编辑管理系统kitymind百度脑图

前言 项目为前端vue项目,把kitymind百度脑图整合到前端vue项目中,显示了脑图的绘制,编辑,到处为json,png,text等格式的功能 文章末尾有相关的代码链接,代码只包含前端项目,在原始的…

GET和POST的区别,java模拟postman发post请求

目录 一、先说一下get和post1、看一下人畜无害的w3schools怎么说:2、问一下文心你言哥,轻轻松松给你一个标准答案:3、卧槽,懂了,好像又没懂 二、让我们扒下GET和POST的外衣,坦诚相见吧!三、我们…

MySQL5.7源码编译Debug版本

编译环境Ubuntu22.04LTS 1 官方下载MySQL源码 https://dev.mysql.com/downloads/mysql/?spma2c6h.12873639.article-detail.4.68e61a14ghILh5 2 安装基础软件 cmakeclangpkg-configperl 参考:https://dev.mysql.com/doc/refman/5.7/en/source-installation-prere…

网络安全进阶学习第十二课——SQL手工注入3(Access数据库)

文章目录 注入流程:1、判断数据库类型2、判断表名3、判断列名4、判断列数1)判断显示位 5、判断数据长度6、爆破数据内容 注入流程: 判断数据库类型 ——> 判断表名 ——> 判断列名 ——> 判断列名长度 ——> 查出数据。 asp的网…

Acwing.877 扩展欧几里得算法

题目 给定n对正整数ai , bi,对于每对数,求出一组ai ,g,使其满足ai* xi bi * yi gcd(ai ,bi)。 输入格式 第一行包含整数n。 接下来n行,每行包含两个整数ai , bi。 输出格式 输出共n行,对于每组ai, bi&#xff0c…

hcip的ospf综合实验

题目 拓扑图 IP地址分配及环回 R1 < Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sysname r1 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 172.16.0.1 27 Aug 6 2023 19:03:33-08:00 r1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol I…

第3章 语言基础

引言 任何语言的核心所描述的都是这门语言在最基本的层面上如何工作&#xff0c;涉及语法、操作符、数据类型以及内置功能&#xff0c;在此基础之上才可以构建复杂的解决方案 本章接下来的内容主要基于ECMAScript第6版。ES6 语法 js的语法借鉴了c/c&#xff0c;java。js是相对…

如何在PCB设计过程中处理好散热

在现代高性能电子设备中&#xff0c;散热是一个常见而重要的问题。正确处理散热问题对于确保电子设备的可靠性、稳定性和寿命至关重要。 下面将介绍在PCB设计过程中处理散热问题的方法和技巧&#xff0c;以帮助大家提高设计质量和性能。 首先&#xff0c;在处理散热问题之前&…

项目部署(前后端分离)

1、前端项目 &#xff08;打包成dist文件,放到nginx的html目录下面&#xff09;&#xff0c;然后配置nginx 2、后端项目部署 使用之前的shell脚本&#xff08;然后赋予用户权限&#xff09;&#xff0c;最后运行脚本 查看进程

Flutter编译一直显示Running Gradle task ‘assembleDebug‘

&#x1f525; 目前开发的Android Studio版本 &#x1f525; &#x1f525; 当前Flutter SDK 版本 &#x1f525; Flutter 3.10.6 • channel stable • https://github.com/flutter/flutter.git Framework • revision f468f3366c (3 周前) • 2023-07-12 15:19:05 -0700 Eng…