文章目录
- 1 概述
- 2 CLIP (Used in GPT-V)
- 3 VQ-VAE (Used in Gemini)
- **VQ-VAE 详细笔记**
- **VQ-VAE 的模块组成与数据流**
- **1. 输入数据**
- **2. 编码器(Encoder)**
- **2.1 编码器的作用**
- **2.2 数据流与维度变化**
- **2.3 编码器输出**
- **3. 量化器(Quantizer)**
- **3.1 代码本体(Codebook)是什么?**
- **3.2 向量量化的过程**
- **3.3 输出维度**
- **3.4 q(z|x) 的作用**
- **4. 解码器(Decoder)**
- **4.1 解码器的作用**
- **4.2 数据流与维度变化**
- **5. 损失函数**
- **5.1 重构损失(Reconstruction Loss)**
- **5.2 代码本体损失(Codebook Loss)**
- **5.3 承诺损失(Commitment Loss)**
- **5.4 最终损失函数**
- **6. 训练过程**
- **总结**
1 概述
这份讲义主要讲解了Vision-Language Models (VLM) 的核心概念及其应用,涉及人工智能系统如何处理图像和文本输入并生成输出。以下是内容的主要概要:
- AGI 与 VLM:
- 人工通用智能 (AGI) 应该能够处理多种形式的输入与输出,包括音频、视频、图像、文本等。
- VLM 是专注于图像和文本混合输入,输出主要是文本,但也有可能生成图像。
- VLM 的基本原理:
- 标准文本转换器通过将输入的文本转化为一系列的 tokens,然后使用 Transformer 模型处理这些 tokens。
- VLM 的不同之处在于它不仅能处理文本,还可以处理图像。通过特定的图像编码器,图像也会被转化为可以输入 Transformer 的 tokens。
- VLM 编码器:
- 两种主要的 VLM 编码器:
- 基于 CLIP 的编码器:将图像映射为向量序列,适用于 OpenAI 的模型。
- 基于 VQ-VAE 的编码器:将图像编码为离散的 token 序列,更适合生成图像的任务。
- VQ-VAE 详细解释:
- VQ-VAE 是一种自编码器,负责将图像编码为 token 序列,并通过解码器恢复图像。
- 训练目标是通过量化 VAE 的输出,使得离散的 token 序列能够保留原始图像的信息。
- CLIP 的训练目标:
- CLIP 的目的是通过图像和对应文本的相似性最大化以及与不相关文本的区分来进行训练,从而保持图像的详细信息。
- VLM 的训练数据和基准测试:
- VLM 使用的数据包括图像和文本配对的数据集(如 Google Images、Bing Images),以及合成的 ChartQA、Document layout 等数据。
- 常见的基准测试包括文档理解(DocVQA)、数学推理(MathVista)等。
- VLM 的训练技巧:
- 训练通常分为预训练和指令微调两个阶段,前者使用图文交织数据,后者采用类似问答的数据。
- 细节如分辨率和图像的原生长宽比对模型效果有重要影响。
2 CLIP (Used in GPT-V)
见lec13笔记。
3 VQ-VAE (Used in Gemini)
2017.11。deepmind 3人
https://arxiv.org/pdf/1711.00937
VQ-VAE 详细笔记
VQ-VAE(Vector Quantized Variational AutoEncoder)是一种生成模型,结合了自编码器和向量量化技术,旨在学习图像、音频等数据的离散化表示,常用于生成任务和特征压缩。VQ-VAE 的主要创新点是将连续的潜在表示离散化,使模型能够在离散空间中学习数据特征。
VQ-VAE 的模块组成与数据流
VQ-VAE 主要由三个模块构成:编码器(Encoder)、量化器(Quantizer)、解码器(Decoder),每个模块在模型的训练和推理过程中都扮演了关键角色。
1. 输入数据
假设我们有一张 32 × 32 32 \times 32 32×32 的 RGB 图像,其输入维度是 32 × 32 × 3 32 \times 32 \times 3 32×32×3,表示图像的宽度、高度和三个颜色通道。
2. 编码器(Encoder)
2.1 编码器的作用
编码器的任务是将高维度的输入图像映射为低维度的潜在特征表示。它通过卷积神经网络(CNN)提取输入图像的特征,并将这些特征压缩到较低维度。
2.2 数据流与维度变化
以 32 × 32 × 3 32 \times 32 \times 3 32×32×3 的输入图像为例,经过几层卷积操作,编码器将其压缩成一个特征图(Feature Map)。假设经过 CNN 编码后,特征图的输出维度为 8 × 8 × 64 8 \times 8 \times 64 8×8×64,即:
- 8 × 8 8 \times 8 8×8 的空间分辨率
- 64 个特征通道,表示不同的特征。
2.3 编码器输出
编码器输出的这个 8 × 8 × 64 8 \times 8 \times 64 8×8×64 特征图是连续的,即每个像素位置的特征表示为 64 维的向量。这时的输出记作 z e ( x ) z_e(x) ze(x)。
3. 量化器(Quantizer)
量化器是 VQ-VAE 的关键组件,它负责将编码器输出的连续表示离散化。这个过程称为向量量化(Vector Quantization),具体使用了一个 代码本体(Codebook)。
3.1 代码本体(Codebook)是什么?
代码本体 是一个预定义的向量集合,存储了所有可能的离散表示。这些向量就像是一个词汇表,用来代替连续的特征向量。
- 初始化:代码本体中的向量通常是随机初始化的,经过训练逐步调整。这些向量的个数(即词汇表大小)是超参数,假设代码本体的大小为 512 512 512,即有 512 个不同的向量。
- 每个向量的维度与编码器输出的维度一致,例如每个向量的大小为 64 维。所以,代码本体的维度为 512 × 64 512 \times 64 512×64,表示有 512 个 64 维向量。
3.2 向量量化的过程
量化器的任务是将编码器输出的每个连续特征向量映射为代码本体中的一个离散向量。
- 量化过程:对编码器输出的每个 8 × 8 8 \times 8 8×8 空间位置中的 64 维特征向量,量化器会从代码本体中找到最接近的向量,并将其替代。
- 最近邻搜索:量化器计算编码器输出 z e ( x ) z_e(x) ze(x) 与代码本体中每个向量的距离,选择最相似的向量 e i e_i ei 替代原始的连续向量。这一过程记作 z q ( x ) z_q(x) zq(x),即量化后的表示。
公式表示:
z q ( x ) = argmin e i ∈ E ∣ ∣ z e ( x ) − e i ∣ ∣ 2 z_q(x) = \text{argmin}_{e_i \in E} || z_e(x) - e_i ||_2 zq(x)=argminei∈E∣∣ze(x)−ei∣∣2
其中, E E E 是代码本体的所有向量集合, e i e_i ei 表示某个代码向量。
3.3 输出维度
量化后的输出维度保持不变,仍然是 8 × 8 × 64 8 \times 8 \times 64 8×8×64,但每个 64 维的向量现在是代码本体中某个离散的向量,而不再是连续的编码器输出。
3.4 q(z|x) 的作用
q ( z ∣ x ) q(z|x) q(z∣x) 是量化器的概率分布,它表示给定输入 x x x 时,选择哪个离散代码向量 z z z。在实际中,这个选择过程可以视为一个非参数化的过程,通过最近邻搜索选择最接近的代码本体向量。
4. 解码器(Decoder)
4.1 解码器的作用
解码器负责将量化后的离散向量表示 z q ( x ) z_q(x) zq(x) 转换回原始图像空间。解码器通常也是一个 CNN,它通过反卷积操作(up-sampling),将低维度的离散表示恢复为原始数据的高分辨率表示。
4.2 数据流与维度变化
解码器接收量化后的 8 × 8 × 64 8 \times 8 \times 64 8×8×64 的张量,通过多层反卷积操作,将其逐步恢复为原始分辨率的图像。最终,解码器输出的图像维度为 32 × 32 × 3 32 \times 32 \times 3 32×32×3,即重建的图像。
5. 损失函数
VQ-VAE 的训练过程中使用了三个主要的损失函数,分别负责不同的目标:
5.1 重构损失(Reconstruction Loss)
重构损失衡量解码器生成的图像与输入图像之间的差异。这个损失通常使用均方误差(MSE),用于优化解码器,使生成的图像与输入尽可能相似。
L rec = ∣ ∣ x − x ^ ∣ ∣ 2 2 L_{\text{rec}} = ||x - \hat{x}||_2^2 Lrec=∣∣x−x^∣∣22
其中, x x x 是原始图像, x ^ \hat{x} x^ 是解码器生成的图像。
5.2 代码本体损失(Codebook Loss)
为了确保编码器的输出 z e ( x ) z_e(x) ze(x) 可以被量化为代码本体中的向量,模型需要一个损失项来鼓励编码器输出接近这些离散代码。这通过一个距离度量来实现。
L vq = ∣ ∣ sg [ z e ( x ) ] − e ∣ ∣ 2 2 L_{\text{vq}} = || \text{sg}[z_e(x)] - e ||_2^2 Lvq=∣∣sg[ze(x)]−e∣∣22
其中, sg \text{sg} sg 表示“停止梯度”,即该项在反向传播时不会更新代码本体中的向量。
5.3 承诺损失(Commitment Loss)
承诺损失是为了约束编码器输出,使其尽量保持在代码本体的离散空间附近。该项损失防止编码器在连续空间中生成与代码本体相距过远的特征向量。
L com = ∣ ∣ z e ( x ) − sg [ e ] ∣ ∣ 2 2 L_{\text{com}} = ||z_e(x) - \text{sg}[e]||_2^2 Lcom=∣∣ze(x)−sg[e]∣∣22
5.4 最终损失函数
最终的损失函数是上述三个损失的加权和,模型通过最小化该损失来优化编码器、量化器和解码器的参数。
L = L rec + L vq + β L com L = L_{\text{rec}} + L_{\text{vq}} + \beta L_{\text{com}} L=Lrec+Lvq+βLcom
其中, β \beta β 是控制承诺损失强度的超参数。
6. 训练过程
- 代码本体的初始化:代码本体中的向量初始为随机向量,并且在训练过程中逐渐调整。
- 梯度传播:由于量化器的选择是一个离散过程,无法直接对量化器的选择进行反向传播,因此使用了直通估计器(Straight-Through Estimator) 技术。这一技术跳过不可导的量化步骤,使得梯度能够从解码器通过量化器回传到编码器。
总结
VQ-VAE 是一种基于向量量化的自编码器,通过将连续潜在空间表示离散化,利用代码本体存储离散的表示向量。其训练过程通过优化重构损失、代码本体损失和承诺损失,最终生成高质量的重建图像。通过这种离散化的表示,VQ-VAE 在生成任务和特征压缩等方面具有独特的优势。