DiT解读:当Diffusion遇上Transformer

前置知识

ViT

Vision Transformer是一种基于Transformer架构的深度学习模型,专门用于处理计算机视觉任务。他的1出现给以往CNN base的图像工作带来了很多新的可能性

ViT的核心思想是将图像分割成均匀的图像块,然后将这些图像块转换为序列,并将序列输入Transformer模型进行处理。这使得ViT可以利用Transformer模型强大的序列建模能力来处理图像数据,避免了传统CNN需要手工设计、调整网络层次结构的缺点。ViT的工作流程大致如下:

  1. 输入图像被分割成固定大小的图像块。
  2. 每个图像块通过一个可学习的线性投影(projection)映射到特征空间,并与位置编码(position embeddings)结合,形成Transformer模型所需的输入序列。
  3. 将这些输入序列输入到Transformer编码器中进行处理。
  4. 最终,通过Transformer的输出进行任务相关的预测。

U-Net

U-Net是一种用于图像分割任务的深度学习架构,它的名字来源于其U形状的网络结构。U-Net在医学影像分割等领域取得了很大成功,也被广泛用于其他图像分割任务。

U-Net的结构包含两部分:编码器(Encoder)和解码器(Decoder)。整体结构如同一个U字形,因此得名U-Net。具体工作流程如下:

  1. 编码器(Encoder): 编码器由一系列卷积层和池化层组成,用于提取输入图像的特征并逐步减小特征图的尺寸。
  2. 跳跃连接(Skip Connections): 在每一层的编码器中,将特征图与对应层的解码器中的特征图进行连接,这种连接保留了高分辨率的特征信息。
  3. 解码器(Decoder): 解码器由一系列卷积层和上采样(或反卷积)层组成,用于将编码器提取的特征映射恢复为与输入图像相同大小的分割结果。
  4. 输出层: 最后一层经过适当的激活函数(如sigmoid或softmax)产生最终的分割结果。

Diffusion Model

Diffusion model是一种用于建模数据分布的概率生成模型。它提供了一种对数据分布进行建模的方法,特别适用于处理具有复杂结构和高维度的数据。

Diffusion model的核心思想是通过一系列迭代步骤来逐渐将初始数据分布“扩散”(diffuse)到目标数据分布。在这些迭代步骤中,模型会逐渐将噪声注入原始数据,从而使原始数据在逐步迭代的过程中逼近目标数据分布。训练过程通常包括以下步骤:

  1. 初始化: 从一个简单的初始分布开始,例如高斯分布。
  2. 扩散过程: 在每个迭代步骤中,模型会通过引入逐渐增加的噪声来扩散数据分布。这个噪声可以是随机的,也可以是通过模型生成的。
  3. 反向过程: 每个迭代步骤之后,模型将尝试逆向这个扩散过程,使得扩散后的数据逼近目标数据分布。
  4. 训练目标: 模型的训练目标通常是最小化生成数据与真实数据分布之间的差异,例如通过最大似然估计或其他损失函数进行优化。

LDM(Latent Diffusion Model)

Latent Diffusion Model(潜变扩散模型)是一种生成模型,是对Diffusion Model的一种扩展和改进。它结合了变分自动编码器(VAE)的思想和概念,以更好地建模数据分布和学习高质量的数据表示。

Latent Diffusion Model的核心思想是在Diffusion Model的基础上引入潜在变量,并通过潜在变量来表示数据空间中的不确定性。这种方法使得模型更具灵活性和表达能力,能够更好地处理数据中的高维度、复杂性和多模态性。

模型结构

DiT的模型的基础架构如图,左边的*N可以看作是一个不断循环叠加的过程。可以发现这其实就是transformer的编码器架构,和ViT的区别是不大。DiT他的主要改进是运用到了扩散模型的流程当中

我们从LDM的设计图上可以看到他的核心其实就是U-Net结构的网络,上面的一段是先用VAE编码压缩图片,然后的模拟扩散过程得到ZT。接下来获取到相关的语义图,文本信息,以及各种潜在变量集合起来传入U-Net大网络,图片除了做卷积之外,还和其他的这些关键信息做注意力机制,以学习到图片的深层语义信息和类别信息等内容之间的关系。

在DiT中,作者创新的改造了LDM这个网络,把U-Net这一步换成了transformer的方式,其就是在中间的去噪步骤去除了CNN相关的操作,统一接入了transformer架构,新的大模型可以理解成下图的形式。这种方式的好处就是解决了CNN感受野限制的问题,图像可以通过自注意力机制来得到更加全面的信息

DiT Block的设计

DiT Block的设计是这个文章最关键的部分。对于各种相关的特征信息,比如图像的类别,扩散的步数这些信息,作者也尝试了很多种方式去把他们结合起来,并且做了很多的实验去对比,最后选择了N-Zero这种方式。

右边的两种方式其实都比较好理解。最右侧的In-Context方法就是把这些信息只是当作一个token去接入,然后forward训练,效果不好也是可以理解的。

中间的交叉注意力的方式就是在中间环节菜用上这些信息,其实效果提升也不大。

On-Zero的方式就是在每个环节都会结合上这些关键信息,模型能够更好地把深层信息和他们关联起来

这是一个形象化的效果图,原本在U-Net中的图片形式在DiT中被展开成了token的形式来进行学习。

规模效果

作者还实验对比了不同的模型规模以及patch_size对于模型性能的影响,实验结果如下,模型的参数量的提升都会提升模型的性能,但是后面边界效应也明显。更小的path_size会有更多的token,模型可以学习到更多的细节

Sora和DiT的联系

Sora的工作其实也是基于DiT,不过这里输入训练的是视频。首先把视频分成一帧一帧输进入做扩散以及ViT编码,每一帧的图片都要结合前后时间的编码,同时可还有另外一侧专门的文字prompt输入做注意力机制辅助可控生成,最终才可以达到我们锁看到的那种生成视频的效果

论文和源码

[2212.09748] Scalable Diffusion Models with Transformers (arxiv.org)

facebookresearch/DiT: Official PyTorch Implementation of "Scalable Diffusion Models with Transformers" (github.com)

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

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

相关文章

【LAMMPS学习】八、基础知识(3.8)计算扩散系数

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

4.点云数据的配准

1.点云配准ICP(Iterative Closest Point)算法 点云配准的原理及ICP(Iterative Closest Point)算法原理参照博客【PCL】—— 点云配准ICP(Iterative Closest Point)算法_icp点云配准-CSDN博客。 (1)点云配准原理:三维扫描仪设备对目标物体一…

Learn ComputeShader 02 Multiple kernels

前面已经成功创建了第一个compute shader,并且使用它替换掉quad的材质的纹理,现在我们将要在计算着色器中创建多个kernel。 首先调整上次的计算着色器,让它显示为红色。 然后再次创建一个kernel,显示为黄色。 结果应该是这样的…

mysql基础2——字段类型

整数类型 需要考虑存储空间和可靠性的平衡 浮点类型 浮点数类型不精准 将十进制数转换为二进制数存储 浮点数类型:float double real(默认是,double ) 如果需要将real设定为float ,那么通过以下语句实现 set sql_mode "real_as…

52 文本预处理【动手学深度学习v2】

将文本作为字符串加载到内存中。 将字符串拆分为词元(如单词和字符)。 建立一个词表,将拆分的词元映射到数字索引;将文本转换为数字索引序列,方便模型操作。

我在本地部署通义千问Qwen1.5大模型,并实现简单的对话和RAG

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

WordPress 告别 MySQL:Docker SQLite WordPress

本篇文章聊聊,如何将这个持续诞生和维护了 21 年的开源软件“脱离数据库”运行,让它能够更加轻量、适合低成本离线运行。 写在前面 2003 年,Michel Valdrighi 基于 b2/cafelog 创建了开源软件 WordPress,并在 GPL 协议下发布。 …

(一)Java EE企业级应用开发实战之Servlet教程——JDK安装

首先打开清华大学开源软件镜像站,清华大学开源镜像网站地址为: https://mirrors.tuna.tsinghua.edu.cn/ 打开该地址后的界面显示如下图所示 找到8版本对应的SDK安装包,我现在用的开发机器是Windows,所以我找的是Windows对应的版本…

weblogic怎么配置控制台日志输出路径

要在WebLogic Server中配置控制台日志(Server Log)的输出路径,请按照以下步骤操作: 通过WebLogic管理控制台配置: 登录到WebLogic Server的管理控制台,地址通常是 http://hostname:port/console&#xff0c…

[柏鹭杯 2021]试试大数据分解?

题目:(NSSCTF | 在线CTF平台) 题目就是如此,我没看到有5个不同的文本,其中最后一个文本以pem后缀,所以我们先来了解一下什么是pem格式。 PEM 格式 PEM格式通常用于数字证书认证机构(Certifica…

EelasticSearch的介绍和基于docker安装

1.概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计,提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据,并且具备横向扩展能力,能够通过增加更多的硬…

AES和RSA加解密算法学习笔记(实战版)

1. 写在前面 今天整理一篇有关密码学的学习笔记,原因是最近做的一个任务是在网络传输的时候,需要对传输的包进行加密和解密工作,以保证传输过程的安全性。所以,这个过程用到了AES和RSA两个算法。 场景:假设我要给我的老师传送毕设代码和论文, 我已经把代码和论文打成了一…

P1601 A+B Problem(高精)(高精度加法)

题目&#xff1a;AB Problem&#xff08;高精&#xff09; - 洛谷 #include<bits/stdc.h> using namespace std; const int N100010; int A[N],B[N],C[N]; int Add(int a[],int b[],int c[],int cnt){int t0; //表进位for(int i1;i<cnt;i){ta[i]b[i]; c[i]t%10; t/10…

VSCode 配置 C/C++ 环境

1 安装 VSCode 直接去官网(https://code.visualstudio.com/)下载并安装即可。 2 配置C/C编译环境 方案一 如果是在Windows&#xff0c;需要安装 MingW&#xff0c;可以去官网(https://sourceforge.net/projects/mingw-w64/)下载安装包。 注意安装路径不要出现中文。 打开 w…

C++结构体

结构体定义 三种声明方式 1 struct Student s1 2 struct Student s2{…} 3在定义结构体时&#xff0c;顺便创建结构体变量&#xff08;不建议用&#xff09; // 结构体.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> usi…

《1w实盘and大盘基金预测 day25》

上贴整体预测还行&#xff0c;第三点、第四点完全符合&#xff0c;最低3042&#xff0c;我预测3038 昨日预测&#xff1a; 3038-3064-3074-3090 低开拉升&#xff0c;冲高回落 大盘继续震荡&#xff1f;收3074附近 中字头等股票回调&#xff1f;大跌收3038附近 科技股有继续回…

Ubuntu-18.04本地化部署Rustdesk服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置防火墙二、安装三大件1.下载三大件2.安装三大件 三、安装客户端1.下载客户端1.Windows2.Linux 四、配置客户端连接服务器五、总结 前言 如果你是想数据…

JEECG表格选中状态怎么去掉

官网代码&#xff08;在取消选中状态的时候不生效&#xff09; rowSelection() {return {onChange: (selectedRowKeys, selectedRows) > {console.log(selectedRowKeys: ${selectedRowKeys}, selectedRows: , selectedRows);},getCheckboxProps: record > ({props: {disa…

数据结构系列-堆排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 昨天我们实现的堆的搭建&#xff0c;我们今天实现以下堆的排序&#xff0c; 堆的排序的最大的优点就是提高的效率&#xff0c;减小了时间复杂度&#xff0c;在这个里面我们有一个…

面试十八、容器适配器

容器适配器是一种特殊类型的容器&#xff0c;它们提供了一种不同于常规容器的接口和行为。容器适配器通常是建立在其他容器之上&#xff0c;通过改变接口或添加限制来满足特定的需求或解决特定的问题。 在 C 中&#xff0c;标准库提供了三种常见的容器适配器&#xff1a; 栈&am…