多模态思路之—无损输入

May 29, 2025
1 views
Large Model

问题背景

首先简化一下问题,本文所讨论的多模态,主要指图文混合的双模态,即输入和输出都可以是图文。可能有不少读者的第一感觉是:多模态模型难道不也是烧钱堆显卡,Transformer“一把梭”,最终“大力出奇迹”吗?

其实没那么简单。先看文本生成,事实上文本生成自始至终都只有一条主流路线,那就是语言模型,即建模条件概率 \(p(x_t|x_1,\cdots,x_{t-1})\),不论是最初的 n-gram语言模型,还是后来的Seq2Seq、GPT,都是这个条件概率的近似。也就是说,一直以来,人们对“实现文本生成需要往哪个方向走”是很明确的,只是背后所用的模型有所不同,比如LSTM、CNN、Attention乃至最近复兴的线性RNN等。所以,文本生成确实可以All in Transformer来大力出奇迹,因为方向是标准的、清晰的。

然而,对于图像生成,并没有这样的“标准方向”。就本站所讨论过的图像生成模型,就有VAEGANFlowDiffusion,还有小众的EBM、PixelRNN/PixelCNN等,这些方法的区分,并不是因为它们用了RNN、CNN或者Attention导致效果上的不同,而是建模理论就有根本差别。而造成图像生成手段多样化的根本原因,是对连续变量进行概率建模的困难性。

对于一个长度为l的句子 \((x_1,x_2,\cdots,x_l)\),它的每个 \(x_t\) 都来自于一个有限的词表,因此\(p(x_t|x_1,\cdots,x_{t-1})\) 本质上就是分类任务,在“神经网络的万能拟合能力 + Softmax”的组合下,理论上任何分类任务都可以精确建模,这就是文本生成背后的理论保证。然而,我们通常会将图像看成是连续型向量,那么对于图像来说,\(x_t\) 就是一个实数,纵然我们也可以做同样的条件分解,那么又该如何建模 \(p(x_t|x_1,\cdots,x_{t-1})\) 呢?注意此时 \(p(x_t|x_1,\cdots,x_{t-1})\) 是一个概率密度,概率密度的必要条件是非负且积分为 \(1\)

\[ \begin{equation}\int p(x_t|x_1,\cdots,x_{t-1}) dx_t = 1\end{equation} \]

除了正态分布,我们还能写出几个积分恒为1的函数呢?而能写出的函数如正态分布,并不足以拟合任意复杂的分布。说白了,神经网络是函数的万能拟合器,但不是概率密度的万能拟合器,这就是连续型变量做生成建模的本质困难,而图像生成的各种方案,本质上都是“各显神通”来绕过对概率密度的直接建模(除了Flow)。但离散型变量不存在这个困难,因为离散型概率的约束是求和为 \(1\),这通过Softmax就可以实现。

离散之路

这时候也许有读者会想:那么能不能将图像变成离散化的,然后套上文本生成的框架去做?确实可以,这是目前的主流思路之一(很可能没有“之一”)。

事实上,图像本来就是离散的,一幅 \(n\times n\) 大小的RGB图像,背后其实就是\(3n^2\) 个 0~255的整数,也就是说相当于长度为 \(3n^2\)、vocab_size为 \(256\) 的句子。甚至往大了讲,计算机本质上是离散的,即它能表示的一切都是离散的,不管是文本、图像、语音还是视频,所以直接用它们的原始离散表示套用文本生成的框架在理论上是没有问题的,早些年的PixelRNNPixelCNN等工作,就是直接在图像的像素空间上做自回归生成.

然而,直接在像素空间上操作的最大问题是——序列太长,生成太慢。在多数应用场景中,图片分辨率起码要达到256以上才有实用价值(除非只是为了用于小图表情包的生成),那么就算 \(n=256\),也有\(3n^2\approx 20\text{万}\),也就是说为了生成一张 \(256\) 大小的图片,我们需要自回归解码20万步!虽然近来Long Context技术有了长足的进步,但这个成本依然很奢侈,而且生成时间上也很难接受。

为此,一个很容易想到的思路是“先压缩,后生成”,即通过另外的模型压缩序列长度,然后在压缩后的空间进行生成,生成后再通过模型恢复为图像。压缩自然是靠AE(AutoEncoder),但我们想要的是套用文本生成的建模方式,所以压缩之后还要保证离散性,这就需要VQ-VAE,以及后来的VQ-GAN,其中VQ还可以替换为近来的FSQ。跟文本的Tokenizer类似,VQ-VAE/GAN就相当于“图像Tokenizer”的角色,它保持了编码结果的离散性,但序列长度明显缩小(比如分辨率降低为 \(1/4\),那么就是 \(3n^2\to (n/4)^2\),缩小48倍),并可以通过相应的Decoder恢复为原始图片(DeTokenize)。基于“图像Tokenizer”这个思路的多模态工作已经有很多,比如LWMAnyGPT

不管原始的像素空间还是在压缩后的编码空间,它们都有一个共同的特点——都是二维特征,换句话说,文本只有左右一个维度,而图像则有左右、上下两个问题,那么在进行自回归生成的时候,就需要人工设计生成方向,比如先左右后上下、先上下后左右、从中心逆时针到四周、按照到左上角的距离排序等等。不同的生成方向可能会明显影响生成效果,这就引入了额外的超参,并且由于不够端到端而显得不够优雅。针对这个问题,我们可以用Cross Attention的方式对二维特征进行组合,输出只有单一方向的编码结果,相关工作可以参考《Planting a SEED of Vision in Large Language Model》

压缩损失

看上去通过“图像Tokenzier”的方式,多模态生成已经“迎刃而解”?不然,问题才刚刚开始。

诸如VQ-VAE、VQ-GAN的图像Tokenzier的最大问题在于,为了明显提高生成速度,缩短序列长度,对编码分辨率做了高度压缩(主流的是\(256\times 256\to 32\times 32\) 甚至 \(256\times 256\to 16\times 16\)),这导致了图像信息的严重损失。为了直观地感知这一点,我们可以参考SEED一文的重构效果:

image

可以看到,虽然重构图像确实很清晰,并且也基本保持了输入图像的整体语义,但局部细节完全不同,这意味着不可能基于该图像Tokenizer完成任意图文混合任务(比如OCR)。

进一步地,我们简单算一笔信息账,就能更清楚地知道信息损失有多严重了。首先,参考《Generating Long Sequences with Sparse Transformers》的实验结果,我们可以知道ImageNet-64的平均信息熵是3.44 比特/字节,当时的模型还不够大,理论上增大模型这个数字还可以进一步降低,我们就当它是 3 比特/字节,那么一个 \(64*64\) 的ImageNet图像,平均的总信息熵是 \(64\times 64\times 3\times 3\) 比特;接着,我们知道vocab_size为 \(V\) 的词表,每个token的平均信息熵是 \(\log_2 V\) 比特,如果要想将编码长度压缩为 \(L\),并且实现无损压缩,那么至少有

\[ \begin{equation}L\times \log_2 V \geq 64\times 64\times 3\times 3\end{equation} \]

如果 \(L=1024=32\times 32\),那么至少有 \(V\geq 2^{36}\approx 7\times 10^{10}\),如果 \(L=256=16\times 16\),那么更是至少要 \(V\geq 2^{144}\approx 2\times 10^{43}\)!很明显当前各种图像Tokenizer的codebook大小,都没有达到如此逆天的量级,所以结果必然是严重的信息损失!

一个自然的质疑是:为什么必须无损呢?确实,人也做不到无损,甚至人对图像的理解,信息损失可能比图像Tokenizer更严重。但问题是,模型的最基本要求是跟人类自己的认知对齐,换句话说,有损压缩没问题,但至少对人来说是无损,就好比丢掉红外光和紫外光,对人眼是完全无损的一样。然而,“对人无损”本身是一个很宽泛的概念,没有可计算的指标,VQ-VAE直接用L2距离去重构图像,由于信息损失,模糊是必然的,VQ-GAN补充了GAN损失,提高了清晰度,但也只能大体上保持全局的语义,无法完全对齐人的标准。更何况,谁也不知道人什么时候会提出新的更依赖于细节的图像任务,因此从通用智能的角度来看,无损压缩是必然的最终选择。

由此可见,在一个真正通用的多模态模型中,图像部分必然要比文本部分要困难得多,因为图像的信息量远大于文字。但其实人类自己创造的图像(比如画画)也不会比文字(比如写作)复杂多少,真正复杂的图像,是直接采集自大自然的照片。所以归根结底,文字只是人类的产物,而图像是大自然的产物,人不如自然聪明,所以文字也不如图像难,而真正通用的人工智能,本就是要往全面碾压人类的方向走的。

扩散模型

言归正传。就当前的图像生成技术来说,如果限定无损压缩,那么要不就回到像素空间做自回归,但正如前述所分析的,这样的生成速度难以接受,所以剩下的唯一选择就是重新回到连续空间,即将图像视为连续型向量,并且在无损压缩的限定下,唯二的选择就是Flow模型和扩散模型了。

Flow本身设计上就是可逆的,扩散模型也可以导出可逆的ODE方程,它们都是将标准高斯分布映射为目标分布,这意味着它们有足够的熵源。离散型和连续型生成有所不同,离散型自回归生成的熵源是seqlen和vocab_size,而vocab_size的贡献是对数增长的,所以主要靠seqlen,但是seqlen等价于成本,所以离散型的熵源是昂贵的;基于变换的连续型生成的熵源是高斯噪声,原则上可以无穷无尽,是廉价且可并行的。不过Flow为了保证每一层的可逆性,对架构做了明显修改,很可能会明显影响效果上限(没有直接证据,但Flow模型确实没做出过惊艳的生成效果就是了),因此剩下的唯一选择就是扩散模型了。

注意扩散只是图像生成方案的选择,对于图像理解,从无损的角度来说,任何编码手段都有失真的风险,所以最保证输入肯定就是原始图像了。因此,最保险的方式,应该是以Patch的方式直接输入原始图像,即类似Fuyu-8b的处理方式:

image

但是Fuyu-8b只是多模态输入,输出还是单模态的文本。如何给它补上图像生成能力呢?考虑到扩散模型在训练阶段就是一个去噪任务,所以一个或许可行的做法是:

image

训练阶段,输入文本和加噪的图像,文本的训练目标就是预测下一个token,图像的训练目标就是预测原图(或者噪声);预测结果,文本部分还是token by token地递归,直到预测出[IMG],然后就并行输入若干个噪声向量,按照扩散模型的方式进行采样图像。注意图像生成部分是并行的,所以原则上不Decoder-Only更好,因为如果Decoder-Only的话,就需要人为指定排序了,不同的排序可能会明显影响效果。在当前扩散模型的加速采样技术下,基本上10个steps就可以完成图像的生成,因此生成速度是可以接受的。

2024.08.26更新:Meta的新出的Transfusion跟上述方案基本一样,只是图片多加了一步Latent Encoder,效果颇佳;此外稍晚一点的Show-o也大同小异,差别是将Diffusion也离散化了。)

Reference

🔖 https://spaces.ac.cn/archives/9984