当前位置: 首页 > news >正文

(2024,LlamaGen,Llama,自回归下一token预测,模型扩展)自回归模型优于扩散:Llama 用于可扩展图像生成

Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation

目录

0. 摘要

1. 引言

2. 自回归模型在图像生成中的应用

2.1 概述

2.2 图像 tokenizer

2.3 自回归模型生成图像

2.4 规模扩展

2.5 服务

3. 实验

5. 结论


0. 摘要

我们介绍 LlamaGen,一个新的图像生成模型家族,该模型将大型语言模型(LLM)的原始 “下一 token 预测” 范式应用于视觉生成领域。这是对纯粹的自回归模型(例如 Llama)在没有视觉信号上的归纳偏差的情况下,通过适当扩展,是否能实现最先进的图像生成性能的肯定回答。我们重新审视了图像 tokenizer 的设计空间、图像生成模型的可扩展性属性及其训练数据质量。这次探索的成果包括:

  • 一个图像 tokenizer,具有 16 倍的下采样比,在 ImageNet 基准测试中实现了 0.94 的 rFID 重建质量和 97% 的码本使用率。
  • 一系列类别条件的图像生成模型,参数从 111M 到 3.1B 不等,在 ImageNet 256×256 基准测试中实现了 2.18 的 FID,超过了流行的扩散模型如 LDM 和 DiT。
  • 一个具有 775M 参数的文本条件图像生成模型,通过在 LAION-COCO 和高美学质量图像上的两阶段训练,展示了在视觉质量和文本对齐方面的竞争性能。
  • 我们验证了 LLM 服务框架在优化图像生成模型推理速度方面的有效性,实现了 326% - 414% 的加速。

我们发布了所有模型和代码,以促进开源社区的视觉生成和多模态基础模型的发展。

1. 引言

基于自回归模型,大型语言模型(LLMs)通过预测序列中的下一个 token 来生成文本。这种 “下一 token 预测” 范式在以类似人类对话的方式解决语言任务方面表现出了前所未有的能力,并展现了惊人的可扩展性,显示了通用人工智能模型的潜在路径。

自回归模型在大型语言模型上的可扩展性被验证后,先驱性工作尝试探索自回归模型在图像生成中的应用,例如,VQVAE ,DALL-E,Parti。他们引入图像 tokenizer,将连续图像转换为离散 token,并应用自回归模型以 “下一 token 预测” 的方式生成图像 token。他们在 2022 年前的同类中表现出了强大的性能。然而,他们的开源社区发展不完善,这在很大程度上限制了其进一步的改进。

同期,另一种图像生成方法,扩散模型快速发展。伴随着其开源社区,他们主导了直到今天的视觉生成领域。然而,扩散模型与自回归语言模型有着截然不同的范式,这对构建统一的语言和视觉模型提出了巨大的挑战。

在这项工作中,我们致力于进一步推进自回归模型在图像生成方面的应用:继续其研究方法并为开源社区做出贡献。回顾 2024 年前的图像生成文献,我们确定了现有高级模型的三个关键点:1)精心设计的图像压缩器,2)可扩展的图像生成模型,和 3)高质量的训练数据。受此启发,我们重新审视了图像 tokenizer(自回归模型的图像压缩器)的设计、图像生成模型的可扩展性属性及其训练数据的影响

为了实现语言和视觉之间潜在的统一模型,我们的设计是减少对视觉信号的归纳偏差,并采用与 LLM 相同的架构。这与最近的一些工作所采用的以视觉为导向的设计不同。例如,MaskGIT 和 MAGVIT 采用了掩码图像建模策略,VAR 使用了分层多尺度属性。尽管它们在实现领先的图像生成性能方面取得了成功,甚至超过了扩散模型,但仍不清楚原始语言模型架构是否具备这种能力。相反,我们的工作揭示了应用与语言模型完全相同的 “下一 token 预测” 的纯粹自回归模型也能够实现最先进的图像生成性能。额外的好处是,我们可以利用 LLM 社区开发的技术来优化我们模型的训练配方和推理速度。

我们发布了所有模型和代码,以促进视觉生成和多模态基础模型的开源社区的发展。值得注意的是,我们发布的模型在性能上仍落后于基于扩散模型的最先进视觉生成模型 [Alpha-VLLM 2024; Esser等人 2024; Brooks等人 2024]。当未来有更多的训练数据和计算资源可用时,将探索更大规模的基于 AR 的视觉生成模型,例如超过 7B 参数的模型。

2. 自回归模型在图像生成中的应用

2.1 概述

首先,图像像素 x∈R^(H×W×3) 被图像 tokenizer 量化为 q∈Q^(h×w) 的离散 token,其中 h=H/p,w=W/p,p 是图像 tokenizer 的下采样率,q^(i,j) 是图像码本的索引。然后,这些图像 token 被重新排列为按照栅格扫描顺序的 h⋅w 个 token 序列,并用于训练基于 Transformer 的自回归模型。

在图像生成过程中,图像 token (q1,q2,...,q_(h⋅w)) 由自回归模型通过 “下一 token 预测” 的方式生成:

其中 c 是类别标签嵌入或文本嵌入。最后,这些图像 token 通过图像 tokenizer 解码器转换为图像像素。

2.2 图像 tokenizer

量化自编码器架构。我们使用与 VQGAN 相同的架构,即编码器-量化器-解码器。编码器和解码器是具有下采样比率 p 的卷积网络。量化器包含一个码本 Z∈R^(K×C),其中有 K 个可学习的向量。编码器将图像像素 x 投射到特征图 f。量化过程将特征图中的每个向量 f^(i,j) 映射到码本中最接近的向量 z^(i,j) 的编码索引 q^(i,j)。在解码过程中,编码索引 q^(i,j) 被重新映射到特征向量 z^(i,j),解码器将这些特征向量转换回图像像素 ^x。

码本对图像 tokenization 性能有重大影响。根据 [Yu等人 2021],我们对码本向量使用 ℓ_2 正则化、低码本向量维度 C 和大码本大小 K。这些设计显著提高了重建质量和码本的使用率。更多细节将在实验中讨论。

训练损失。由于量化是不可微操作,使用直通梯度估计器(straight-through gradient
estimator)来保持从解码器到编码器的梯度:z = sg[z−f] + f,其中 sg[⋅] 是停止梯度操作。对于码本学习:L_VQ = || sg[f] − z ||^2_2 + β·|| f − sg[z] ||^2_2,其中第二项是 commitment loss,迫使从编码器提取的特征向量接近码本向量,β 是 权重。为了简化,我们在码本学习中不添加熵损失 [Yu等人 2023a; Chang等人 2022]。

对于图像重建训练:

其中 ℓ_2 是图像像素的重建损失,L_P(⋅) 是来自 LPIPS 的感知损失,LG(⋅) 是与图像 tokenizer 同时训练的 PatchGAN [Isola等人 2017] 鉴别器的对抗损失,λ_G 是对抗损失权重。

2.3 自回归模型生成图像

Llama 架构。我们的模型架构主要基于 Llama,应用了 RMSNorm 进行预归一化(pre-normalization),SwiGLU 激活函数,以及旋转位置嵌入。具体来说,我们在每一层模型中使用 2D RoPE,按照 [Lu et al. 2023; Fang et al. 2023] 的实现方法。我们不使用 AdaLN 技术,以保持我们的结构与 LLM 一致。

类别条件图像生成。类别嵌入从一组可学习的嵌入中索引,并用作预填充 token 嵌入。从这个 token 嵌入开始,模型通过下一 token 预测的方式生成图像 token 序列,并在预定义的最大长度位置停止。

文本条件图像生成。为了将文本条件整合到自回归模型中,我们使用 FLAN-T5 XL 作为文本编码器,编码后的文本特征通过一个额外的 MLP 投影,并用作自回归模型中的预填充 token 嵌入。我们注意到这种设计并不是多模态基础模型的最终设计,其中语言和视觉之间建立了统一的词汇表。我们将其留待未来研究。

无分类器指导。在扩散模型社区中开发的无分类器指导以其提高视觉质量和文本图像对齐而闻名。我们在我们的模型中采用了这一方法。在训练过程中,条件随机丢弃,并被一个空的无条件嵌入取代。在推理时,对于每个 token,其 logit ℓ_g 由 ℓ_g = ℓ_u + s(ℓ_c − ℓ+u) 形成,其中 ℓ_c 是条件 logit,ℓ_u 是无条件 logit,s 是无分类器指导的缩放比例。

值得注意的是,迄今为止讨论的所有设计选择主要受到先前工作的启发,例如,图像 tokenizer 借鉴自 [Rombach et al. 2022; Yu et al. 2021],图像生成来自 [Peebles & Xie 2023; Chen et al. 2023b; Esser et al. 2021]。这些技术的大部分在扩散模型中研究得很好,但在自回归模型中研究得较少。我们的工作将这些先进的设计集体适应于基于自回归的视觉生成模型。

2.4 规模扩展

我们的模型架构与 Llama 几乎相同,这使我们能够无缝采用 LLM 社区中的优化技术和训练方案。如表 1 所示,我们在这项工作中将模型规模扩展到 3.1B 参数。所有模型都使用 PyTorch 2 实现,并在 80GB A100 GPU 上进行训练。对于参数少于 1.4B 的模型,我们直接使用 DDP,否则,我们采用 PyTorch FSDP 来优化 GPU 内存使用。

2.5 服务

自回归模型一直受困于其低推理速度。随着大规模语言模型的快速发展,LLM 社区提出了高级推理技术来优化推理速度。与训练类似,LLM 社区开发的推理技术也可以用来优化我们的模型。我们验证了 vLLM 这一最流行的 LLM 服务框架之一在我们的图像生成方法上的有效性。如表 7 所示,与基线设置相比,实现了 326% - 414% 的加速。

3. 实验

5. 结论

在这项工作中,我们深入研究了用于可扩展图像生成的普通自回归模型。通过重新审视其图像 tokenizer、图像生成模型和训练数据,我们的类别条件模型优于流行的扩散模型,而我们的文本条件模型在视觉质量和文本对齐方面表现出竞争力。 

论文地址:https://arxiv.org/abs/2406.06525

项目页面:https://github.com/FoundationVision/LlamaGen 

公和众与号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群)
加 VX 群请备注学校 / 单位 + 研究方向 

相关文章:

(2024,LlamaGen,Llama,自回归下一token预测,模型扩展)自回归模型优于扩散:Llama 用于可扩展图像生成

Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation 目录 0. 摘要 1. 引言 2. 自回归模型在图像生成中的应用 2.1 概述 2.2 图像 tokenizer 2.3 自回归模型生成图像 2.4 规模扩展 2.5 服务 3. 实验 5. 结论 0. 摘要 我们介绍 LlamaGen&…...

重新安装操作系统的软件都有哪些?

重新安装操作系统关键步骤 重新安装操作系统通常涉及到几个关键步骤:创建可启动媒体、备份现有数据、安装操作系统、以及系统初始化和配置。以下是一些常用工具和软件,它们可以帮助你完成这些步骤: 创建可启动媒体 Rufus:用于W…...

深圳水务展|2025深圳国际水务科技博览会

2025深圳国际水务科技博览会 展会主题: 新质生产力赋能水务产业高质量发展 展会时间:2025年7月24-26日 展会地点:深圳会展中心(福田) 主办单位: 广东省水利学会 深圳市水务学会 协办单位: 中国水利…...

OpenAI not returning a result?

题意:OpenAI 没有返回结果吗? 问题背景: Im trying to use the OpenAI beta but I cant seem to get a result. Im accessing the API via an NPM package (openai-api - npm). I have that setup and working but when I make a request th…...

[Windows]_[初级]_[GetVersionEx获取系统版本错误的原因]

场景 开发WTL/ATL/Win32程序时, 有时候需要获取系统版本号,以便判断用户在使用软件时的系统。在某一天突然发现获取的系统版本号是错的, 一直是版本号6.2.x,什么情况? 说明 如果软件没有针对Win8.1或Win10以上的系统做兼容处理,返回的是Wi…...

2024,Java开发在中国市场还有发展前景吗?

随着2024年的到来,Java作为一种经典而强大的编程语言,依然在中国的软件开发市场中扮演着重要角色。然而,许多人对Java的未来发展前景持有不同的看法。让我们来探讨一下当前情况和未来的走向。 Java程序员真的过剩了吗? 2023年, 各…...

gcc: string.c_str gcc-8.5的一个问题

https://en.cppreference.com/w/cpp/string/basic_string/c_str https://sourceforge.net/p/cppcheck/wiki/ListOfChecks/ common mistakes when using string::c_str()string的这个成员是返回c类型的一个字符数组指针。但是这个指针所对应的地址有赖于string对象的生命周期。所…...

一道笔试题 - 无重复字符的最长子串

老生常谈的一道题,常见并 文章目录 描述预期结果Java代码 描述 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 预期结果 Java代码 import java.util.HashSet; import java.util.Set;public class Demo2 {public static void main(S…...

C#反射的NullReferenceException

背景 xml文件中有些元素的属性被删除,导致文件无法被读取(C#)。 调试之后发现,因为属性被删除,读进来会保持默认值null,在后续的反射中如果用这个null给字符串属性赋值,会抛异常。 另外发现前面…...

100道C/C++面试题

1. static的作用2. 引用与指针的区别3. .h头文件中的ifndef/define/endif 的作用4 #include<file.h>与#include"file.h"的区别?5 描述实时系统的基本特性6 全局变量和局部变量在内存中是否有区别?如果有&#xff0c;是什么区别?7 什么是平衡二叉树?8 堆栈溢…...

Python(模块)

模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构&#xff1a; import模块名称【as别名】 from……import导入方式的语法结构&#xff1a; from模块名称&#xff0c;import变量/函数/类/*&#xff08;*是通配符&#xff09; impor…...

【八股文】Java基础篇

1. 和 equals的区别是什么&#xff1f; 判断两个变量或者实例是否都指向同一内存空间的值&#xff08;不仅值相同&#xff0c;地址也要相同&#xff09;equals是判断两个变量执行的内存空间的值是否相同&#xff08;值相同&#xff0c;地址可以不同&#xff09;&#xff0c;所…...

python rsa如何安装

Python中的一些模块是用一个包管理器来发布的&#xff0c;RSA模块就是&#xff0c;所以首先需要安装setup tools工具。 1、下载文件&#xff1a;ez_setup.py 2、安装&#xff1a; sudo python ez_setup.py 3、下载RSA安装包&#xff1a;rsa-3.1.1-py2.7.egg 4、安装RSA&…...

P10289 [GESP样题 八级] 小杨的旅游

Description 给定一棵 n n n 个点的树&#xff0c;每条边权值均为 1 1 1&#xff0c;树上有 k k k 个关键点&#xff0c;关键点们在 0 0 0 的时间内相互可达&#xff0c; q q q 次询问&#xff0c;求 s → t s\to t s→t 的最短路。 Analysis 考虑暴力建图&#xff0c;…...

网络编程 ----------- 4、组播与广播

1、广播 broadcast 广播是指向同一个网络中所有的主机传输数据只有传输层协议为 UDP协议时&#xff0c;才支持广播 TCP是端对端&#xff0c;广播是一对多 &#xff0c;所以无法符合其要求。 1&#xff09;广播地址 广播地址的计算&#xff1a; 子网掩码…...

最短路径算法:Bellman-Ford算法

引言 在图论中&#xff0c;Bellman-Ford算法是一种用于计算单源最短路径的算法。与Dijkstra算法不同&#xff0c;Bellman-Ford算法可以处理带有负权边的图&#xff0c;并且可以检测图中是否存在负权环。本文将详细介绍Bellman-Ford算法的定义、步骤及其实现。 Bellman-Ford算…...

爬虫:xpath模块及昵图网实例

xpath模块 from lxml import etreestr1 """ <div><ul><li class"item-0"><a href"link1.html">first item</a></li><li class"item-1"><a href"link2.html">second…...

高级java每日一道面试题-2024年8月03日-web篇-forward和redirect有什么区别?

如果有遗漏,评论区告诉我进行补充 面试官: forward和redirect有什么区别? 我回答: 在Java Web开发中&#xff0c;forward和redirect是Servlet容器提供的两种用于页面跳转的技术。它们的主要区别在于客户端感知的方式、URL地址的变化、请求对象的共享等方面。下面详细介绍两…...

如何让你的网站拥有更好的体验

在HTML中&#xff0c;属性是用于提供关于HTML元素的额外信息。接下来我们将讲解13个可以让用户拥有更好体验的HTML属性。 Accept 属性 我们可以在<input>元素&#xff08;仅适用于文件类型&#xff09;中使用accept属性来指定服务器可以接受的文件类型。 <input ty…...

opencascade AIS_TypeFilter AIS_XRTrackedDevice源码学习

opencascade AIS_TypeFilter 前言 通过它们的类型选择交互对象。该过滤器会对本地上下文中的每个交互对象提出问题&#xff0c; 以确定它是否具有非空的所有者&#xff0c;并且如果是&#xff0c;则检查它是否是所需类型。 如果对象在每种情况下都返回 true&#xff0c;则保留…...

使用Spring AOP监控指定方法执行时间

文章目录 一、加入pom依赖二、切面类和注解三、执行方法 一、加入pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>二、切面类和注解 import java.lang.…...

最新CSS3纵向菜单的实现

纵向菜单 通过下面例子&#xff0c;你会知道把列表转换成菜单的关键技术 a中的#是URL的占位符可以点击&#xff0c;真正用途中写实际URL <nav class"list1"><ul><li><a href"#">Alternative</a></li><li><…...

GooLeNet模型搭建

一、model import torch from torch import nn from torchsummary import summaryclass Inception(nn.Module):def __init__(self, in_channels, c1, c2 , c3 , c4):super(Inception, self).__init__()self.ReLU nn.ReLU()#路线1:1x1卷积self.p1_1 nn.Conv2d(in_channels i…...

使用ThreadLocal来存取单线程内的数据

一.什么是ThreadLocal&#xff1f; ThreadLocal&#xff0c;即线程本地变量。如果你创建了一个 ThreadLocal变量&#xff0c;那么访问这个变量的每个线程都会有这个变量的一个本地拷贝&#xff0c;多个线程操作这个变量的时候&#xff0c;实际是在操作自己本地内存里面的变量&…...

elasticsearch教程

1. 单点部署(rpm): #提前关闭firewalld,否则无法组建集群 #1. 下载ES rpm包 ]# https://www.elastic.co/cn/downloads #2. 安装es ]# rpm -ivh elasticsearch-7.17.5-x86_64.rpm #3. 调整内核参数(太低的话es会启动报错) echo "vm.max_map_count655360 fs.file-max 655…...

Arrays、Lambda表达式、Collection集合

1. Arrays 1.1 操作数组的工具类 方法名说明public static String toString(数组)把数组拼接成一个字符串public static int binarySearch(数组,查找的元素)二分查找法查找元素public static int[] copyOf(原数组,新数组长度)拷贝数组public static int[] copyOfRange(原数组…...

2024年前端趋势:全栈或许是不容错过的选择!

近年来&#xff0c;前端开发的技术不断推陈出新&#xff0c;2024年也不例外。在这个变化迅速的领域&#xff0c;全栈开发逐渐成为一股不容忽视的趋势。无论你是经验丰富的开发者&#xff0c;还是刚刚入门的新手&#xff0c;掌握全栈技术都能让你在竞争中脱颖而出。而在这个过程…...

MySQL 实战 45 讲(01-05)

本文为笔者学习林晓斌老师《MySQL 实战 45 讲》课程的学习笔记&#xff0c;并进行了一定的知识扩充。 sql 查询语句的执行流程 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器和执行器。 连接器负责接收客…...

仓颉编程语言入门 -- Array数组详解

仓颉编程语言入门 – Array数组详解 一. 如何创建Array数组 我们可以使用 Array 类型来构造单一元素类型&#xff0c;有序序列的数据。 1.仓颉使用 Array 来表示 Array 类型。T 表示 Array 的元素类型&#xff0c;T 可以是任意类型 , 类似于泛型的概念 var arr:Array<St…...

C#初级——简单单例模式使用

单例模式 单例模式是一种常用的软件设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例&#xff0c;通过单例模式防止私有成员被多次引用&#xff0c;防止数据被随意纂改。本文使用的是线程不安全的懒汉式单例。 创建单例模式 首…...