# From Transformer to ViNT

@[TOC](https://github.com/UnderTurrets/notes/blob/master/Robotics/%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95/README.md)

***

## Attention is All You Need (2017)

这篇论文于2017年由Google的研究人员发表，介绍了Transformer模型，它彻底改变了自然语言处理（NLP）领域。它的核心思想是，完全抛弃以往序列处理任务中占主导地位的循环神经网络（RNN）和卷积神经网络（CNN）结构，仅依靠 **注意力机制（Attention Mechanism）** 来捕捉输入和输出序列之间的全局依赖关系。

* **输入 (Input)**：一个代表源信息的词元序列（a sequence of tokens）。在机器翻译任务中，这就是源语言的句子（例如，一句英文）。
* **输出 (Output)**：一个代表目标信息的词元序列。在机器翻译任务中，这就是目标语言的句子（例如，翻译好的法文）。
* **解决的任务 (Task Solved)**：该模型主要解决**序列到序列（Seq2Seq）的任务，最典型的例子是机器翻译**。它旨在通过完全依赖注意力机制来捕捉序列内的长距离依赖关系，从而取代了以往在NLP领域占主导地位的RNN和CNN架构，解决了它们在并行计算和长距离信息传递上的瓶颈。

### Motivation

在Transformer出现之前，序列到序列（Seq2Seq）任务，如机器翻译，主要依赖于包含编码器（Encoder）和解码器（Decoder）的RNN（特别是LSTM和GRU）模型。

这些模型存在几个核心痛点：

* **顺序计算的瓶颈 (The Bottleneck of Sequential Computation)**
  * RNN的本质是顺序处理。要计算时刻 `t` 的隐藏状态 `h_t`，必须先完成时刻 `t-1` 的计算。$$h_t = f(h_{t-1}, x_t)$$
  * 这种内在的顺序性**阻碍了并行化**。在处理长序列时，你无法同时计算所有时间步，这使得在现代GPU/TPU等擅长并行计算的硬件上训练变得非常缓慢。
* **长距离依赖问题 (Long-Range Dependency Issues)**
  * 理论上，RNN可以处理任意长度的序列，但实际上，信息在通过长序列的多个时间步传递时，会逐渐丢失或扭曲（即**梯度消失/爆炸**问题）。
  * 尽管LSTM和GRU等门控机制在一定程度上缓解了这个问题，但对于非常长的序列，捕捉远距离词语之间的依赖关系仍然是一个巨大挑战。信息从第一个词传递到最后一个词的路径长度是 `O(n)`，其中 `n` 是序列长度，路径越长，信息损失越严重。
* **CNN的尝试与局限**
  * 像ByteNet和ConvS2S等模型尝试使用CNN来代替RNN，以实现并行计算。CNN确实可以并行处理，但它们的主要问题是感受野有限。
  * 为了捕捉长距离依赖，需要堆叠非常多的卷积层，或者使用空洞卷积（Dilated Convolutions）。这使得两个任意位置之间的信息传递路径长度仍然是 `O(n/k)`（k为卷积核大小）或 `O(log(n))`，而不是常数时间。

**核心动机总结：** 研究人员希望设计一个模型，既能**强大地捕捉序列内的长距离依赖关系**，又能**摆脱RNN的顺序计算限制，实现大规模并行化**，从而显著提升训练速度和模型性能。Transformer的目标就是用一种全新的方式来解决这个问题，即**完全依赖注意力机制**。

### Architecture

Transformer沿用了主流的 **编码器-解码器（Encoder-Decoder）** 架构，如下图所示。

![Transformer Architecture](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/The_transformer_encoder_decoder_stack.png)

#### 整体结构

* **编码器 (Encoder)**：左侧部分。负责接收输入序列（例如，源语言句子），并将其转换为一系列连续的、富含上下文信息的表示（vectors）。它由 **N=6** 个完全相同的层堆叠而成。
* **解码器 (Decoder)**：右侧部分。负责接收编码器的输出和已经生成的目标序列部分，然后预测下一个词。它也由 **N=6** 个完全相同的层堆叠而成。

#### 编码器（Encoder）内部结构

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/Transformer_encoder.png)

每个编码器层都由两个主要的**子层 (Sub-layers)** 构成：

1. **多头自注意力层 (Multi-Head Self-Attention Layer)**：这是模型的核心。该层让输入序列中的每个位置都能关注到序列中所有其他位置，从而计算出该位置的上下文感知表示。
2. **位置全连接前馈网络 (Position-wise Feed-Forward Network)**：这是一个简单的、在每个位置上独立应用的全连接网络，用于对注意力层的输出进行非线性变换。

每个子层外面都包裹着一个**残差连接 (Residual Connection)** 和一个**层归一化 (Layer Normalization)**。即每个子层的输出是 `LayerNorm(x + Sublayer(x))`。这对于训练深度网络至关重要，可以防止梯度消失，并稳定训练过程。

#### 解码器（Decoder）内部结构

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/Transformer_decoder.png)

每个解码器层比编码器层多一个子层，共包含三个子层：

1. **带掩码的多头自注意力层 (Masked Multi-Head Self-Attention Layer)**：与编码器中的自注意力类似，但增加了一个**掩码 (mask)**。这个掩码确保在预测位置 `i` 的词时，模型**只能关注到位置 `i` 及其之前**的输出，而不能“看到”未来的词。这是为了保持模型的**自回归 (auto-regressive)** 特性，即一次生成一个词。
2. **编码器-解码器注意力层 (Encoder-Decoder Attention Layer)**：这是连接编码器和解码器的桥梁。在这一层，解码器可以**关注到输入序列（即编码器的输出）的全部内容**。它的**Query**来自前一个解码器子层（Masked Self-Attention的输出），而**Key**和**Value**则来自编码器的最终输出。这使得解码器在生成目标词时能够参考整个源句子。
3. **位置全连接前馈网络 (Position-wise Feed-Forward Network)**：与编码器中的完全相同。

同样，每个子层也都采用了残差连接和层归一化。

### Scaled Dot-Product Attention

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/self-attention-output.png)

这是Transformer注意力的核心计算单元。注意力机制可以被描述为将一个**查询 (Query, Q)** 和一系列**键值对 (Key-Value, K-V)** 映射到一个输出。

计算过程如下：

1. **计算分数**：计算查询 `Q` 与所有键 `K` 的点积，以衡量`Q`和每个`K`的相似度。
2. **缩放**：将点积结果除以一个缩放因子 `sqrt(d_k)`，其中 `d_k` 是键向量的维度。**这一步非常关键**，因为当`d_k`很大时，点积的值会变得非常大，导致Softmax函数的梯度变得极小，不利于训练。缩放可以缓解这个问题。
3. **Softmax归一化**：对缩放后的分数应用Softmax函数，将其转换为权重（概率分布），表示每个值`V`的重要性。
4. **加权求和**：将得到的权重与对应的值`V`相乘并求和，得到最终的注意力输出。

**公式表示为**： `Attention(Q, K, V) = softmax( (Q * K^T) / sqrt(d_k) ) * V`

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/self-attention-matrix-calculation.png)

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/self-attention-matrix-calculation-2.png)

### Multi-Head Attention

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/transformer_attention_heads_qkv.png)

论文作者发现，只用一套Q, K, V进行一次注意力计算，可能会限制模型从不同角度理解信息。因此，他们提出了**多头注意力**。

其思想是：

1. **线性投影**：将原始的Q, K, V通过不同的、可学习的线性变换（权重矩阵）投影`h`次（`h`是头的数量，论文中`h=8`）。这样就得到了`h`组不同的Q, K, V。
2. **并行计算注意力**：对这`h`组Q, K, V并行地执行缩放点积注意力计算，得到`h`个输出向量。
3. **拼接与再投影**：将这`h`个输出向量拼接（Concatenate）起来，再通过一个最终的线性变换，将其投影回原始的维度。

**好处**：多头注意力允许模型在不同的**表示子空间 (representation subspaces)** 中共同关注来自不同位置的信息。例如，一个头可能关注句法关系，另一个头可能关注指代关系，等等，从而增强了模型的表达能力。

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/transformer_multi-headed_self-attention-recap.png)

### Positional Encoding

自注意力机制本身是**位置无关的**。它处理的是一个集合，而不是一个序列。如果不加入位置信息，“猫在垫子上”和“垫子在猫上”对于模型来说可能没有区别。

为了解决这个问题，论文引入了**位置编码**。

* **方法**：在将词嵌入向量送入编码器和解码器之前，给它们加上一个**位置编码向量**。这个向量的维度与词嵌入向量相同。
* **实现**：论文中使用**正弦和余弦函数**来生成位置编码：

$$
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
$$

$$
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
$$

其中 `pos` 是词在序列中的位置，`i` 是编码向量中的维度索引。

* **优点**：
  1. 每个位置的编码是唯一的。
  2. 这种编码方式使得模型可以轻易地学习到**相对位置关系**，因为对于任何固定的偏移量 `k`，`PE_{pos+k}` 都可以表示为 `PE_{pos}` 的线性函数。
  3. 它能够推广到比训练集中所见过的序列更长的序列。

***

## ViT: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (2020)

* **输入 (Input)**：一张二维图像。
* **输出 (Output)**：图像的类别标签（通过输出类别概率分布来预测）。
* **解决的任务 (Task Solved)**：**图像分类/图像识别**。ViT的核心贡献是证明了纯Transformer架构，在没有CNN固有归纳偏置（如局部性）的情况下，可以直接应用于计算机视觉任务。它通过将图像分割成小块（patches）并将其视为一个序列，成功地将Transformer模型从NLP领域迁移到了CV领域，并证明了在大规模数据预训练下，其性能可以超越顶尖的CNN模型。

### Motivation

在ViT出现之前，计算机视觉（CV）领域被CNN架构统治了近十年（从AlexNet在2012年大放异彩开始）。CNN的核心优势在于其**归纳偏置（Inductive Bias）**，这非常适合处理图像任务：

1. **局部性 (Locality):** 卷积核只在局部感受野上操作，假设了空间上相邻的像素点关联性更强。
2. **平移等变性 (Translation Equivariance):** 图像中的物体无论移动到哪个位置，卷积操作都能提取出相同的特征。

这些“先验知识”让CNN在数据量不那么大的情况下也能高效学习。

与此同时，自然语言处理（NLP）领域已经被Transformer架构彻底改变。Transformer的核心是**自注意力机制（Self-Attention）**，它允许模型在输入序列的任意两个位置之间建立联系，捕捉长距离依赖关系。但它缺少CNN那样的图像专用归纳偏置，它对输入元素的顺序是不敏感的（需要位置编码来弥补），并且是全局计算的。

**ViT的动机就是回答以下几个关键问题：**

* **Transformer能否摆脱CNN，直接用于图像识别？** 以往的工作大多是将自注意力机制作为CNN的补充模块，而不是完全取代它。
* **CNN的归纳偏置是必需品吗？** 作者推测，CNN的归纳偏置在数据量有限时是优势，但在数据量极其庞大时，这种“硬编码”的先验知识反而可能限制了模型的学习能力。
* **如果我们给一个没有图像偏置的Transformer模型足够多的数据，它能否自己学会这些空间结构和模式？** 这就是论文的核心假设：“**规模胜过归纳偏置（Scale trumps inductive bias）**”。

### Architecture

ViT的架构设计遵循了“尽可能保持NLP中Transformer原貌”的原则，整个流程非常简洁优雅，可以分解为以下几个步骤（参考论文图）：

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/vit_figure.png)

#### 步骤 1: 图像分块 (Image Patching)

标准的Transformer接收一个一维的“词元”（token）序列作为输入。为了处理二维图像，ViT首先将图像分割成一系列固定大小的、不重叠的**小方块（patches）**。

* 例如，一张 `224x224` 的图像，如果patch大小是 `16x16`，那么就会被分割成 `(224/16) * (224/16) = 14 * 14 = 196` 个patches。
* **这正是论文标题《An Image is Worth 16x16 Words》的由来**：每个 `16x16` 的图像块就像是句子中的一个“单词”。

#### 步骤 2: 展平与线性投射 (Patch Embedding)

每个图像块（Patch）被 **展平（flatten）** 成一个一维向量。

* 对于一个 `16x16` 的RGB图像块，其维度为 `16 * 16 * 3 = 768`。
* 然后，这个展平的向量会通过一个 **可训练的线性投射层（Linear Projection）** ，映射到一个固定的维度 `D`（例如`D=768`），这个输出被称为**patch embedding**。
* 至此，一张二维图像就成功转化为了一个一维的 `N x D` 的向量序列（`N`是patch数量），可以被Transformer处理了。

#### 步骤 3: 引入\[CLS] Token与位置编码 (Classification Token & Positional Embedding)

1. **\[CLS] Token:** 借鉴了BERT模型的设计，在patch embedding序列的最前面，**拼接（prepend）上一个可学习的特殊向量，称为 `[class]` token。这个token不代表任何一个具体的图像块，它的作用是在经过Transformer Encoder的充分信息交互后，其对应的最终输出向量将作为整个图像的全局特征表示**，用于最终的分类任务。
2. **位置编码 (Positional Embedding):** Transformer本身不具备处理序列顺序的能力（置换不变性）。为了让模型知道每个patch的原始空间位置，需要给每个patch embedding（包括`[CLS]` token）加上一个**位置编码**。ViT使用的是标准的可学习的1D位置编码，每个位置都有一个独特的、可学习的向量。

#### 步骤 4: Transformer Encoder (编码器)

经过上述处理后得到的向量序列（长度为 `N+1`）被送入一个标准的Transformer Encoder。

* Encoder由 `L` 个相同的层堆叠而成。
* 每一层包含两个核心子模块：
  * **多头自注意力 (Multi-head Self-Attention, MSA):** 这是核心。它允许序列中的每个patch embedding（token）关注并融合序列中所有其他token的信息。这实现了**全局信息交互**，与CNN的局部感受野形成鲜明对比。
  * **多层感知机 (MLP):** 在MSA之后，每个token的输出会独立地通过一个MLP（通常是两个线性层加一个GELU激活函数）。
* 每个子模块前后都有**层归一化 (LayerNorm)**，并使用了**残差连接 (Residual Connection)**。

#### 步骤 5: 分类头 (Classification Head)

当序列通过整个Transformer Encoder后，我们只取`[CLS]` token在最后一层对应的输出向量。这个向量被认为是整个图像的聚合表示。

* 这个向量最后被送入一个简单的**MLP分类头**（在预训练时通常是带一个隐藏层的MLP，在微调时则是一个简单的线性层），最终输出图像的类别概率。

### 关键技术细节

#### 1. 归纳偏置的缺失与大数据的重要性

* **ViT的弱点:** 如前所述，ViT几乎没有内置的图像归纳偏置。它必须从零开始学习空间关系，比如“眼睛通常在鼻子的上方”，“相邻的patch可能属于同一个物体”等。
* **实验验证:** 论文中的实验（Figure 3）完美地证明了这一点：
  * 当在**中等规模**的数据集（如ImageNet-1k，约130万张图）上从头训练时，ViT的性能**不如**同等计算量的ResNet。这是因为它没有足够的数据来学习这些基本的视觉模式，容易过拟合。
  * 当在**大规模**数据集（如ImageNet-21k，1400万张图；JFT-300M，3亿张图）上预训练后，ViT的性能**开始超越**ResNet。这表明，有了海量数据，ViT能够克服归纳偏置的缺失，学习到比CNN更强大、更通用的特征表示。

#### 2. 微调与高分辨率处理 (Fine-tuning & Higher Resolution)

这是一个非常巧妙的工程细节。在下游任务（如对一个新数据集进行分类）上进行微调时，通常会使用比预训练时更高分辨率的图像，这能提升性能。

* **问题:** 更高分辨率的图像意味着会产生更多的patches，输入序列的长度变了。预训练好的位置编码长度不匹配，该怎么办？
* **解决方案:** ViT保持patch大小不变，因此序列长度 `N` 会增加。作者对预训练好的**位置编码进行2D插值**，以匹配新的序列长度。例如，预训练时是 `14x14` 的位置编码，微调时如果是 `16x16`，就将 `14x14` 的编码图插值到 `16x16`。这是ViT中为数不多的、巧妙利用了图像2D结构信息的地方。

#### 3. 混合架构 (Hybrid Architecture)

除了纯粹的ViT，论文还实验了一种混合架构：

* 先用一个CNN（如ResNet）来提取图像的低级特征图（feature maps）。
* 然后，将CNN输出的特征图视为“图像”，对其进行分块（patch size可以设为1x1），再送入Transformer。
* 实验发现，对于较小的模型和数据集，混合模型性能略优于纯ViT。但随着模型和数据规模的增大，纯ViT的潜力更大，最终会追上并反超。

#### 4. 内部工作机制的可视化 (Inspecting ViT)

为了理解ViT学到了什么，作者做了一些可视化分析：

* **Patch Embedding Filters:** 第一层线性投射层的权重（滤波器）被可视化出来，它们类似于CNN底层学习到的Gabor滤波器和颜色基元，说明ViT确实在学习有意义的低级特征。
* **位置编码相似度:** 可视化位置编码之间的余弦相似度，发现模型自主地学会了图像的2D空间结构。同一行或同一列的patch具有更相似的位置编码。
* **注意力距离:** 模型中的注意力头可以同时关注局部和全局信息。即使在网络的浅层，也有一些头（heads）的“感受野”（attention distance）非常大，覆盖了整个图像，这与CNN逐层扩大感受野的方式完全不同。在网络的深层，几乎所有的头都具有全局注意力。

***

## CLIP: Learning Transferable Visual Models From Natural Language Supervision (2021)

* **输入 (Input)**：
  * **训练时**：大量的（图像，文本）配对数据。
  * **推理时（零样本预测）**：一张待分类的图像，以及一组描述所有可能类别的文本提示（例如，"A photo of a dog", "A photo of a cat"等）。
* **输出 (Output)**：
  * **训练时**：一个共享的多模态嵌入空间，其中语义相似的图像和文本的特征向量在空间上彼此靠近。
  * **推理时（零样本预测）**：输入图像的预测类别。这个类别是通过计算图像特征与哪个文本提示特征最相似来确定的。
* **解决的任务 (Task Solved)**：核心是学习一个**通用的、可迁移的视觉-语言联合表示**。它最惊艳的应用是解决了 **零样本图像分类（Zero-Shot Image Classification）** 问题，即模型无需在特定任务的数据上进行微调，就能对任意给定的类别进行分类。这极大地摆脱了对昂贵的人工标注数据集的依赖。

### Motivation

在CLIP出现之前，深度学习在计算机视觉领域的主流范式是**在大型有标签数据集（如ImageNet）上进行有监督预训练，然后将模型迁移（微调）到下游任务**。这种范式虽然成功，但存在几个核心痛点：

* **高昂的标注成本**：像ImageNet这样的数据集需要大量的人工标注，成本极高，且难以扩展到更多、更细粒度的类别。
* **任务局限性**：在ImageNet上预训练的模型，其“知识”被局限在预定义的1000个类别中。对于新任务或新类别，模型通常需要重新收集数据并进行微调，灵活性差。
* **鲁棒性问题**：在标准基准测试中表现出色的模型，在面对真实世界中各种分布变化（如风格、光照、角度变化）时，性能会急剧下降。如论文第13页`Figure 18`所示，在ImageNet上提升性能（Adapt to ImageNet）反而可能降低模型在其他分布数据集上的平均鲁棒性。

CLIP的动机就是**摆脱对传统“固定标签”的有监督学习的依赖**，转而利用互联网上已经大量存在的、带有自然语言描述的图像数据。作者认为，**自然语言**本身就包含了丰富、灵活、开放的语义信息，可以用来监督视觉模型的学习，从而获得一个更通用、更鲁棒、可以轻松迁移到任意视觉分类任务的模型。

### Architecture

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/CLIP_Architecture.png)

CLIP的核心思想是**将图像和文本映射到同一个多模态嵌入空间**，并通过对比学习拉近匹配的图文对，推远不匹配的图文对。其架构非常简洁，主要包含两个核心组件（如第1页`A.2. Models`部分描述）：

1. **图像编码器 (Image Encoder)**：
   * 负责将输入的图像转换成一个特征向量。
   * 论文中探索了两种主流架构：
     * **ResNet-50** 的变体（`CLIP-RN`系列），并通过类似EfficientNet的复合缩放方法，扩展出不同计算量的版本（如`RN50x4`, `RN50x16`, `RN50x64`）。
     * **Vision Transformer (ViT)**（`CLIP-ViT`系列），如`ViT-B/32`, `ViT-B/16`, `ViT-L/14`。
2. **文本编码器 (Text Encoder)**：
   * 负责将输入的文本（一句话或一个词）转换成一个特征向量。
   * 采用标准的**Transformer**架构，具体超参数在第25页`Table 19`和`Table 20`中有详细说明（例如，12层，多头注意力机制等）。

训练时，图像和文本编码器**同时从头开始训练**，没有使用任何预训练权重。它们的目标是学习如何将语义上相关的图像和文本映射到嵌入空间中的相近位置。

### 核心技术细节

#### 数据集

作者构建了一个名为 **WebImageText (WIT)** 的庞大数据集。他们从互联网上收集了**4亿个（图像，文本）对**。这个数据集是CLIP成功的关键，它具备以下特点：

* **规模巨大**：远超ImageNet等传统数据集。
* **噪声高**：文本描述与图像内容不一定完全对应，但巨大的数据量弥补了质量上的不足。
* **内容多样**：覆盖了极其广泛的视觉概念，远不止1000个类别。

#### 训练方法：对比学习 (Contrastive Learning)

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/CLIP_Architecture.png)

CLIP的训练过程是其精髓所在，具体步骤如下：

1. **构建批次 (Batch Construction)**：在一个训练批次中，随机抽取 `N` 个（图像，文本）对。这样就有了 `N` 张图像和 `N` 段文本。
2. **特征提取**：
   * `N` 张图像通过图像编码器得到 `N` 个图像特征向量 `I_1, I_2, ..., I_N`。
   * `N` 段文本通过文本编码器得到 `N` 个文本特征向量 `T_1, T_2, ..., T_N`。
3. **计算相似度**：计算所有可能的图像-文本对的余弦相似度，形成一个 `N x N` 的相似度矩阵。
   * 在这个矩阵中，对角线上的元素 `(I_i, T_i)` 是**正样本对**（匹配的图文）。
   * 所有非对角线上的元素 `(I_i, T_j)` 其中 `i ≠ j`，都是**负样本对**（不匹配的图文）。
4. **计算损失函数**：
   * 损失函数的目标是**最大化正样本对的相似度，同时最小化负样本对的相似度**。
   * 它是一个**对称的交叉熵损失**：
     * 对于每一行（每一张图像），模型需要预测其对应的正确文本（在`N`个文本中）。
     * 对于每一列（每一段文本），模型也需要预测其对应的正确图像（在`N`张图像中）。
   * 最终的损失是这两个方向损失的平均值。

这个过程迫使模型学习到一个**共享的嵌入空间**，在这个空间里，"一只狗的照片"的图像特征会非常接近"a photo of a dog"的文本特征。

#### 核心能力：零样本预测 (Zero-Shot Prediction)

训练完成后，CLIP最惊人的能力是**无需微调即可在各种分类任务上进行零样本预测**。这个过程巧妙地将传统的分类任务转化为了图文匹配任务（如第9页`B. Zero-Shot Analysis`所述）：

1. **构建文本提示 (Prompt Engineering)**：对于一个分类任务（比如CIFAR-10），我们不直接使用类别名（如 "dog", "car"），而是将它们构造成有意义的句子，即**提示 (Prompt)**。例如，使用模板 `"A photo of a {label}."`，生成 "A photo of a dog.", "A photo of a car." 等。作者发现这种方式能显著提升性能（比直接用标签词提升1.3%）。
2. **编码**：
   * 给定一张待分类的**图像**，通过图像编码器得到其特征向量 `I_f`。
   * 将所有类别的**文本提示**，通过文本编码器得到一组文本特征向量 `T_1, T_2, ..., T_C`（C为类别数）。
3. **预测**：
   * 计算图像特征 `I_f` 与所有文本特征 `T_1, ..., T_C` 的余弦相似度。
   * **相似度最高的那个文本提示所对应的类别，即为模型的预测结果**。

这个过程完全不需要使用新任务的任何训练样本，因此被称为“零样本”。

***

## From Classical Reinforcement Learning to Decision Transformer

### Example of Classical Reinforcement Learning

我们来用一个生动且专业的例子，把传统强化学习（RL）的核心机制讲透，为理解Decision Transformer（DT）铺平道路。

* 场景：小机器人玩迷宫游戏

想象一个简单的小机器人，它的任务是在一个4x3的网格迷宫中找到宝藏（+1分），同时要避开陷阱（-1分）。每走一步，都会有-0.04分的小惩罚，鼓励它尽快找到目标。

* **智能体 (Agent)**: 小机器人。
* **环境 (Environment)**: 4x3的迷宫。
* **状态 (State)**: 机器人所在的格子位置，比如 (0, 0)。
* **动作 (Action)**: 上、下、左、右。
* **奖励 (Reward)**: 走到宝藏+1，掉进陷阱-1，每走一步-0.04。

#### 传统RL的目标：为机器人打造一个“最优导航大脑”

机器人的“大脑”就是它的**策略（Policy）π**，即一个地图，告诉它在每个格子里应该往哪个方向走。我们的目标是找到**最优策略 π**\*，让机器人从任何起点出发，平均得分最高。

传统RL就像一个经验丰富的探险家，通过两种核心方式来绘制这张“最优藏宝图”。

#### 第一种方法：价值迭代 (Value-Based) - Q-Learning

这种方法的核心是：**“先别管怎么走，我们先把每个位置每个选择的‘价值’算清楚。”** 这里的“价值”就是**Q值 (Q-Value)**。

**Q(s, a)** 代表在状态 `s`（某个格子）下，采取动作 `a`（某个方向），未来能获得的总期望得分。

* Q-Learning 的工作流程：

1.  **初始化一张Q表 (Q-Table)**: 我们创建一个大表格，行是所有状态（12个格子），列是所有动作（4个方向）。一开始，所有Q值都是0。这张表就是机器人的“草稿版导航地图”。

    | 状态    | 上   | 下   | 左   | 右   |
    | ----- | --- | --- | --- | --- |
    | (0,0) | 0   | 0   | 0   | 0   |
    | (0,1) | 0   | 0   | 0   | 0   |
    | ...   | ... | ... | ... | ... |
2.  **探索与学习 (Exploration & Learning)**: 机器人开始在迷宫里瞎逛（探索）。每走一步，它都像一个会计一样，更新它的Q表。这个更新过程遵循一个著名的公式——**贝尔曼方程的TD（时序差分）更新**：

    **新Q值 = (1 - α) \* 旧Q值 + α \* (当前奖励 + γ \* 未来最大Q值)**

    * `α` (alpha) 是学习率，控制更新步子的大小。
    * `γ` (gamma) 是折扣因子，代表对未来的耐心程度。

    **举个例子，机器人从 (0,0) 向右走到了 (0,1)：**

    * 它在状态 `s = (0,0)` 采取了动作 `a = 右`。
    * 它到达了新状态 `s' = (0,1)`。
    * 它获得了即时奖励 `r = -0.04`。
    * **关键一步：向前看！** 它会查看Q表中 `(0,1)` 这一行，找到所有动作（上/下/左/右）中最大的Q值。假设这个最大Q值是 `max Q(s', a') = 0` (因为刚开始都是0)。

    现在，它开始更新 `Q((0,0), 右)` 这个值： `新Q((0,0), 右) = (1-α)*0 + α*(-0.04 + γ*0) = -0.04α`

    这个 `-0.04α` 虽然很小，但它包含了宝贵的信息：**“从(0,0)往右走，至少会损失0.04分。”**
3.  **价值传播 (Value Propagation)**: 随着机器人不断探索，奖励的“价值”会像水波一样从宝藏和陷阱处传播开来。

    * 当机器人走到宝藏旁边，比如在(0,2)向上走到(0,3)的宝藏时。它会获得+1的巨大奖励。
    * 更新 `Q((0,2), 上)` 时，它的 “未来最大Q值” 是从宝藏格子(0,3)看的，假设宝藏格子Q值已经很高了。这会使得 `Q((0,2), 上)` 变得非常正。
    * 再下一步，当机器人走到(1,2)，它向上走到(0,2)时，它会发现 `(0,2)` 这个状态的未来Q值很高（因为离宝藏近），于是 `Q((1,2), 上)` 也会变高。

    经过成千上万次的探索，Q表会逐渐收敛，准确地反映出每个格子、每个方向的真实长期价值。
4. **最终策略 (Optimal Policy)**: 学习完成后，Q表就是最优导航地图。在任何格子，机器人只需查看Q表，选择Q值最高的那个方向走即可。这就是**贪心策略 (Greedy Policy)**。

**与DT的对比点1：** Q-Learning的核心是**估计**。它在不断地用“即时奖励 + 对未来的估计”来更新“对现在的估计”。这个过程是**自举 (Bootstrapping)**，在离线数据不充分时极易出错。DT则完全不估计，它把未来的回报直接当成已知条件。

#### 第二种方法：策略梯度 (Policy-Based) - REINFORCE

这种方法的核心是：**“别算那么细了，直接学一个概率模型，告诉我该怎么走。”**

它不维护Q表，而是直接学习一个策略网络 `π(a|s; θ)`，输入状态 `s`，输出每个动作 `a` 的概率。`θ` 是网络的参数。

* REINFORCE 的工作流程：

1. **玩一整局游戏**: 机器人根据当前的策略网络（一开始是随机的）从头到尾玩一局游戏。比如，它走了一条路径： `(0,0) → 右 → (0,1) → 右 → (0,2) → 上 → (0,3)宝藏!`
2. **计算总回报 (Calculate Return)**: 游戏结束后，它会计算这一整局的总得分 `G`。 `G = (-0.04) + (-0.04) + (-0.04) + (+1) = 0.88`。 这是一个很高的分数！
3.  **回顾与反思 (Credit Assignment)**: 现在，机器人要“论功行赏”。它会回顾这一局走过的每一步，并认为：“既然这局结果这么好（G=0.88），那么这一路上我做的所有决定，都应该是好决定！”

    于是，它会调整策略网络的参数 `θ`，使得：

    * 在 `(0,0)` 状态下，选择“右”的概率**提高**。
    * 在 `(0,1)` 状态下，选择“右”的概率**提高**。
    * 在 `(0,2)` 状态下，选择“上”的概率**提高**。

    这个调整的数学形式就是**策略梯度**： `Δθ = α * G * ∇θ log π(a|s; θ)`

    如果 `G` 是负数（比如掉进陷阱），那么 `Δθ` 就会反向更新，降低那些导致坏结果的动作的概率。
4. **重复千万次**: 通过玩大量的游戏并根据最终结果来调整策略，策略网络会慢慢地学会倾向于那些能通向高回报路径的动作。

**与DT的对比点2：Policy Gradient依赖于完整的回合（Episode）轨迹**和**最终的总回报G**来进行学习。它的学习信号是“滞后的”，并且方差很大（运气好的一局和运气差的一局，同样的动作可能会得到截然相反的更新）。DT把 **“未来回报和（Return-to-Go）”** 这个概念引入了**每一步**的决策中，使得学习信号更加即时和精确。

#### 演员-评论家 (Actor-Critic)：两种方法的结合

这是目前最主流的方法。它结合了Q-Learning和Policy Gradient的优点。

* **演员 (Actor)**: 一个策略网络，负责做动作。
* **评论家 (Critic)**: 一个价值网络（类似Q-Learning），负责给演员的动作打分，告诉它这个动作是比平均水平好，还是差。

这样，演员就不需要等到一局结束，而是每走一步，评论家就给它一个反馈，使得学习更高效、更稳定。但其本质仍然是**估计价值**和**优化策略**的结合。

### Preliminaries

现在，我们来系统且专业地梳理一下传统强化学习（RL），为理解Decision Transformer（DT）铺好坚实的垫脚石。我们将聚焦于那些与DT形成鲜明对比的核心概念和机制。

#### 传统强化学习的核心目标与框架

传统RL的目标是为一个**智能体（Agent）找到一个最优策略（Policy）π**，使其在与**环境（Environment）的交互中，最大化累积的折扣奖励（Discounted Cumulative Reward）**。

这个过程通常被建模为**马尔可夫决策过程（Markov Decision Process, MDP）**，由一个五元组定义：$$(S, A, P, R, \gamma)$$

* S: 状态空间（State Space）
* A: 动作空间（Action Space）
*   P: 状态转移概率 ：

    $$
    P(s_{t+1}|s_t, a_t): 在状态 s_t 执行动作 a_t 后，转移到状态 s_{t+1} 的概率
    $$
*   R: 奖励函数：

    $$
    R(s_t, a_t): 执行动作后环境给出的即时奖励
    $$
* γ: 折扣因子（Discount Factor, 0 < γ < 1），用于平衡短期奖励和长期奖励的重要性。未来的奖励要乘以一个小于1的折扣因子，意味着越远的奖励价值越低。

**核心目标函数**：最大化期望回报（Expected Return）：

$$
G_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k+1}
$$

#### 两大核心价值函数：RL的“导航系统”

为了找到最优策略，传统RL引入了两个核心的“导航”工具——价值函数，它们用来评估“好坏”。

1. **状态价值函数（State-Value Function）** $$V^\pi(s)$$
   * **定义**：在遵循策略 $\pi$ 的前提下，从状态 $s$ 出发，能够获得的期望累积折扣奖励。
   * **公式**： $$V^\pi(s) = \mathbb{E}_\pi[\sum_{k=0}^{\infty} \gamma^k r_{t+k+1} | s_t = s]$$
   * **直观理解**：“我现在所处的位置（状态s）有多好？”
2. **动作价值函数（Action-Value Function）** $$Q^\pi(s, a)$$
   * **定义**：在遵循策略 $\pi$ 的前提下，从状态 $s$ 出发，执行动作 $a$ 后，能够获得的期望累积折扣奖励。
   * **公式**： $$Q^\pi(s, a) = \mathbb{E}_\pi[\sum_{k=0}^{\infty} \gamma^k r_{t+k+1} | s_t = s, a_t = a]$$
   * **直观理解**：“我现在这个位置（状态s），做这个动作（动作a）有多好？”

**这两个函数是传统RL的基石。几乎所有主流算法都围绕着如何学习和使用它们。**

#### 贝尔曼方程：价值函数的迭代基石

贝尔曼方程（Bellman Equation）是RL中最核心的方程，它将一个状态（或状态-动作对）的价值与其后继状态的价值联系起来，形成了一个递归关系。这为我们通过迭代来学习价值函数提供了理论基础。

$$V^\pi(s) 的贝尔曼方程：$$

$$V^\pi(s) = \sum_{a \in A} \pi(a|s) (R(s,a) + \gamma \sum_{s' \in S} P(s'|s,a) V^\pi(s'))$$

当前状态的价值 = 所有可能动作的（即时奖励 + 折扣后的下一状态的期望价值）的期望。

$$Q^\pi(s,a) 的贝尔曼方程：$$

$$Q^\pi(s,a) = R(s,a) + \gamma \sum_{s' \in S} P(s'|s,a) \sum_{a' \in A} \pi(a'|s') Q^\pi(s', a')$$

当前状态-动作对的价值 = 即时奖励 + 折扣后的下一状态-动作对的期望价值。

**核心思想：自举（Bootstrapping）** 注意，方程的右边也包含了价值函数本身。这意味着我们可以用**当前的价值估计**来更新**之前的价值估计**。这种“用一个估计值去更新另一个估计值”的方法，就是**自举**。这是传统RL（尤其是时序差分学习）的核心，也是其不稳定的根源之一。

#### 传统RL算法的两大流派

所有传统RL算法都可以大致归为以下两类，它们学习和使用价值函数的方式不同。

**1. 基于价值的方法（Value-Based Methods）**

* **核心思想**：不直接学习策略，而是学习一个最优的动作价值函数Q\*(s,a)一旦学到了最优的动作价值函数，最优策略&#x3C0;_&#x5C31;自然而然地确定了：在任何状态s，选择使Q_(s,a)最大的动作a。

$$
\pi^*(s) = \arg\max_a Q^*(s,a)
$$

* **代表算法**：**Q-Learning** 和 **Deep Q-Network (DQN)**。
* **学习方式**：通过**时序差分（Temporal Difference, TD）学习**来迭代更新Q值。TD学习是自举思想的具体实现。
  * **TD Target**：（这是对未来回报的一个估计）$$Y_t = r_t + \gamma \max_{a'} Q(s_{t+1}, a')$$
  * **TD Error**：（估计值和当前值的差距）$$\delta_t = Y_t - Q(s_t, a_t)$$
  * **更新规则**：（朝估计的方向更新）$$Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \delta_t$$
* **关键点**：依赖于对Q值的准确估计。在离线场景下，由于数据分布固定，无法探索，对未见过（Out-of-Distribution）的(s, a)对的Q值估计会非常离谱，导致策略崩溃。

**2. 基于策略的方法（Policy-Based Methods）**

* **核心思想**：不学习价值函数，而是直接参数化策略π(a|s)（通常是一个神经网络），然后通过梯度上升来优化策略参数θ，以最大化期望回报。
* **代表算法**：**REINFORCE** (也叫Policy Gradient)。
* **学习方式**：通过**策略梯度定理**来更新策略。
  * **梯度方向**：$$\nabla_\theta J(\theta) \approx \mathbb{E}[\nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t]$$
  * **直观理解**：如果一个动作 $a\_t$ 最终导致了很高的回报 $G\_t$，那么就增大它被选中的概率，即增大：

$$
\log \pi_\theta(a_t|s_t)
$$

* **关键点**：REINFORCE需要等到整个回合（episode）结束后才能计算回报 $G\_t$，导致学习效率低且方差大。

**3. 演员-评论家方法（Actor-Critic Methods）**

这是上述两种方法的结合，也是现代RL的主流。

* **核心思想**：同时学习一个策略（**Actor**，演员）和一个价值函数（**Critic**，评论家）。
  * **Actor (策略)**：负责选择动作。
  * **Critic (价值函数)**：负责评估Actor选择的动作有多好，并向Actor提供更低方差的学习信号。
* **学习方式**：Actor使用Critic提供的价值信息来更新策略，而不是等待整个回合结束。例如，用TD Error来指导策略更新。
* **代表算法**：A2C, A3C, SAC, TD3。
* **关键点**：仍然严重依赖价值函数的估计，因此在离线场景下也面临和Value-Based方法类似的挑战。

### 总结：传统RL与Decision Transformer的根本分歧

现在，你可以清晰地看到传统RL和DT的根本区别：

| 特征         | 传统强化学习 (RL)                             | Decision Transformer (DT)                            |
| ---------- | --------------------------------------- | ---------------------------------------------------- |
| **核心范式**   | **优化 (Optimization)**：寻找一个最优策略来最大化未来回报。 | **序列建模 (Sequence Modeling)**：将RL视为一个条件生成问题。          |
| **核心工具**   | **价值函数 ($V, Q$)**：通过自举和迭代来学习，用于指导决策。    | **Transformer架构**：直接学习序列模式，无需显式价值函数。                 |
| **处理回报**   | 将**即时奖励(r)作为学习信号，来估计**未来的**期望回报(Q值)**。  | 将**未来回报和(Return-to-Go, $\hat{R}$)作为输入条件**，来**预测**动作。 |
| **学习目标**   | 最小化TD误差，或最大化策略性能（通过梯度）。                 | 最小化监督学习损失（如MSE或交叉熵），即模仿数据集中的行为。                      |
| **处理不确定性** | 通过 **探索（Exploration）** 来减少对价值估计的不确定性。   | **不探索**。直接学习数据集中所有行为模式（好的和坏的）。                       |
| **决策方式**   | **基于价值的决策**：`a = argmax Q(s,a)`。        | **基于条件的生成**：`a = model(..., R̂, s)`。                 |

**承接点**：

现在，让我们总结一下传统RL的“世界观”，以便看清DT是如何“降维打击”的：

1. **核心是优化**：传统RL的所有努力，都是为了通过复杂的数学工具（贝尔曼方程、策略梯度）来**优化**一个策略，使其在未来获得最大回报。这是一个**前瞻性**的、**探索性**的、**控制论**式的问题。
2. **奖励是驱动力**：`reward` 是唯一的学习信号，所有价值和策略的更新都源于它。
3. **价值是核心中间产物**：无论是Q值还是V值，都是为了解决优化问题而创造出来的**中间变量**。学习和估计这些价值是任务的重中之重。

传统RL的整个大厦都建立在**通过迭代和自举来估计价值**这一地基上。在离线RL中，由于无法与环境交互来纠正错误的估计，这个地基变得非常不稳固，导致整个大厦摇摇欲坠。

**Decision Transformer则完全跳出了这个框架：**

* **它不优化**，它只**模仿**。
* **它不把奖励当驱动力**，而是把 **“期望的回报”当成一个查询指令** 。
* **它不需要价值这个中间产物**，它直接学习 **(指令, 状态) → 动作** 的端到端映射。

Decision Transformer的聪明之处在于，它直接放弃了这个地基，说：“我们不盖楼了，我们直接学习一本《建筑模式百科全书》”。它把RL问题从一个动态的、需要不断评估和优化的控制问题，转换成了一个静态的、基于已有数据的模式匹配问题。

当你理解了传统RL是如何费尽心机地去**估计**和**优化**时，你就能深刻体会到，DT通过把问题转化为**给定目标，模仿最优行为**的序列建模问题，是多么的简洁和巧妙。

***

## Decision Transformer: Reinforcement Learning via Sequence Modeling (2021)

* **输入 (Input)**：一个由最近K个时间步组成的轨迹序列，每个时间步包含三个元素：**未来回报和（Return-to-Go）**、**状态（State）和上一步的动作（Action）**。其中，未来回报和是模型要达成的“目标”。
* **输出 (Output)**：在当前状态下，为了实现输入的目标回报，模型应该执行的**下一个动作**。
* **解决的任务 (Task Solved)**：**离线强化学习（Offline Reinforcement Learning）**。它将传统的强化学习问题（通过试错和价值估计来优化策略）重新定义为一个**条件序列建模问题**。模型不再学习复杂的价值函数，而是像语言模型一样，学习“在给定目标（期望回报）和历史情境下，生成最合适的动作”的模式，从而避免了传统RL算法的不稳定性和复杂性。

这篇文章的核心思想是**将强化学习（RL）问题重新定义为一个序列建模（Sequence Modeling）问题**，从而摆脱了传统强化学习算法的复杂性，并借用了自然语言处理（NLP）领域中强大的Transformer架构。

### Motivation

传统强化学习方法，尤其是在离线（Offline RL）场景下，面临诸多挑战：

1. **不稳定性与复杂性**：像Q-learning或Actor-Critic这类基于**时序差分（Temporal Difference, TD）学习**的方法，依赖于“自举”（Bootstrapping），即用一个估算出的值（如Q值）来更新另一个估算出的值。这在数据分布与策略不匹配的离线环境中，容易导致误差累积和训练不稳定，也就是所谓的“死亡三角”（Deadly Triad）问题。
2. **处理分布外（Out-of-Distribution）数据困难**：离线RL使用一个固定的数据集进行训练，无法与环境交互产生新数据。当学习到的策略产生的行为与数据集中的行为差异很大时，价值函数的估计会非常不准确，导致策略越学越差。为了解决这个问题，现有方法通常需要引入复杂的机制，如策略约束（Policy Regularization）或价值悲观主义（Value Pessimism）。
3. **信用分配难题（Credit Assignment）**：在奖励稀疏或延迟奖励的任务中，传统的基于贝尔曼方程的方法需要将奖励信号一步步地反向传播，这既缓慢又低效，难以将最终的成功或失败归因于早期关键的动作。

作者们提出的新范式旨在绕过这些难题： **“我们能不能不学习价值函数，也不计算策略梯度，而是直接学习能够产生特定回报的动作序列？”**

这个想法的灵感来源于NLP中的大型语言模型（如GPT）。语言模型可以根据给定的前文（prompt），生成符合语境的后续文本。那么，我们是否可以把“期望的回报”作为一种“prompt”，让模型生成能够达成这个回报的“动作序列”呢？

这就是Decision Transformer的出发点：**将RL视为一个条件序列生成问题**，而不是一个策略优化问题。

### Architecture

Decision Transformer（DT）的架构非常简洁，它本质上是一个**自回归的、基于GPT架构的Transformer模型**。让我们结合论文中的图来理解其细节。

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/decision_transformer_architecture.png)

#### 1. 输入序列表示 (Input Sequence Representation)

这是DT最关键的创新点。传统的RL轨迹是 `(s₀, a₀, r₀, s₁, a₁, r₁, ...)`。DT对这个序列进行了巧妙的改造，使其适合序列建模。

DT处理的输入序列由 **回报-即时（Return-to-Go）** 、 **状态（State）** 和 **动作（Action）** 三种类型的令牌（Token）交错组成：

$$
\tau = (\hat{R}_1, s_1, a_1, \hat{R}_2, s_2, a_2, ..., \hat{R}_T, s_T, a_T)
$$

其中：

* `s_t`: 在时间步 t 的状态。
* `a_t`: 在时间步 t 采取的动作。
* `R̂` (Return-to-Go): 这是从当前时间步 t 开始，直到轨迹结束的所有未来奖励的总和，即

$$
\hat{R}_t = \sum_{t'=t}^{T} r_{t'}
$$

**注意** ：它不是过去的奖励，而是未来的累积奖励。在训练时，这是从数据集中计算出的“事后诸葛亮”式的信息。

#### 2. 令牌化与嵌入 (Tokenization and Embedding)

模型接收最近 `K` 个时间步的轨迹片段，总共 `3K` 个令牌。

1. **模态特定嵌入 (Modality-Specific Embeddings)**:
   * Return-to-Go (R̂)、State (s)、Action (a) 这三种不同类型的数据（模态）分别通过各自独立的线性层（或对于图像状态的CNN）映射到模型的嵌入维度。这允许模型以不同的方式处理这三种信息。
2. **位置编码 (Positional Encoding)**:
   * DT使用了一个与标准Transformer不同的位置编码。它不是为序列中的每个令牌分配一个唯一的位置编码，而是为**每个时间步timestep**学习一个嵌入。
   * 也就是说，在同一时间步 t 的 `R̂_t, s_t, a_t` 这三个令牌，会被加上**相同**的时间步嵌入 `pos_emb(t)`。这帮助模型理解这三个令牌是捆绑在一起的，共同描述了时间步 t 的情况。

#### 3. Causal Transformer

嵌入后的令牌序列被送入一个标准的**Causal Transformer**（即GPT风格的解码器）。“Causal”（因果）意味着在预测时间步 $t$ 的输出时，模型只能关注（attend to）时间步 $t$ 及之前的所有令牌，不能看到未来的信息。这通过**因果自注意力掩码Causal Self-Attention Mask**实现。

#### 4. 输出

模型的目标是预测下一个动作。具体来说，当输入序列直到`s_t` 时，模型会利用对应于 `s_t` 的输出嵌入，通过一个最终的线性层（Linear Decoder）来预测动作 `a_t`。

### 技术细节

#### 1. 训练过程 (Offline Training)

训练过程非常直观，完全是**监督学习**。

* **数据**：从一个固定的离线数据集中采样轨迹片段。这些数据可以来自专家、次优策略、甚至是随机策略。
* **目标**：给定一个序列 `(R̂₁, s₁, a₁, ..., R̂_t, s_t)`，模型被训练来预测序列中记录的真实动作 `a_t`。
* **损失函数**：
  * 对于连续动作（如OpenAI Gym），使用**均方误差损失（MSE Loss）**。
  * 对于离散动作（如Atari），使用**交叉熵损失（Cross-Entropy Loss）**。
* **关键点**：训练时，模型学习到了 **(回报-即时序列, 状态序列)** 与 **(动作序列)** 之间的关联。它学会了“哦，当期望的回报很高，并且我处于某个状态序列时，通常应该执行这样的动作序列”。

#### 2. 评估/推理过程 (Online Evaluation)

评估过程展示了DT如何作为决策模型工作。这是一个**自回归生成**的过程。

1. **初始化**:
   * 首先，我们需要给模型一个“指令”或“prompt”，即**目标回报（Target Return）**。例如，我们可以设定一个专家级别的分数作为初始的 R̂₁。
   * 从环境中获取初始状态 s₁。
2. **自回归生成循环**:
   * **第1步**: 将初始序列 R̂₁, s₁ 输入模型，预测出第一个动作 a₁。
   * **第2步**: 在环境中执行动作 a₁，得到新的状态 s₂ 和实际获得的奖励 r₁。
   * **第3步**: 更新目标回报。新的目标回报-即时为 R̂₂ = R̂₁ - r₁。这个逻辑非常直观：我已经实现了一部分回报，所以对未来的期望回报也相应减少。
   * **第4步**: 将新的令牌 (R̂₂, s₂) 追加到输入序列末尾，形成 (R̂₁, s₁, a₁, R̂₂, s₂)。
   * **第5步**: 将更新后的序列输入模型，预测下一个动作 a₂。
   * **重复**: 不断重复上述过程，直到结束。模型在每一步都基于历史和动态调整的未来期望回报来生成动作。

### 总结与贡献

**Decision Transformer**的主要贡献在于：

1. **范式转换**：成功地将强化学习问题形式化为**条件序列建模**，为RL研究开辟了一个全新的、更简洁的方向。
2. **架构简单有效**：直接利用了强大且可扩展的Transformer架构，无需为离线RL设计复杂的特定组件（如价值函数估计器、策略约束等）。
3. **性能卓越**：尽管模型和训练方法非常简单，但在多个具有挑战性的离线RL基准测试（如Atari, OpenAI Gym, Key-to-Door）上，其性能与当时最先进的（state-of-the-art）的专用离线RL算法相当，甚至更好。
4. **解决了传统RL的痛点**：通过避免TD学习和自举，DT天然地规避了误差累积和不稳定性问题。它通过学习序列的联合分布，而非优化一个不稳定的目标，来完成信用分配。

***

## Gato: A Generalist Agent (2022)

“A Generalist Agent”是DeepMind在2022年发布的一项里程碑式的工作，它展示了构建一个能够处理多种任务、多种数据模态和多种物理形态（embodiments）的通用人工智能体的可能性。下面将详细解释其动机、模型架构和关键技术细节。

* **输入 (Input)**：一个被序列化和标记化（tokenized）的**多模态数据序列**。这个序列可以包含历史的图像观测、机器人传感器读数、文本、以及采取过的动作。在推理时，通常会先输入一段任务“提示”（prompt），然后是当前的观测。
* **输出 (Output)**：一个代表**下一个动作**或**下一段文本**的词元序列。模型以自回归的方式逐个生成这些词元。
* **解决的任务 (Task Solved)**：成为一个**通用智能体（Generalist Agent）**。Gato旨在用**一个单一的、固定权重的神经网络**来完成极其广泛和多样的任务，包括玩游戏、图像描述、对话、以及控制真实世界的机械臂。它解决了传统AI模型“一个任务一个模型”的局限性，展示了通往更通用人工智能的一条可能路径。

### Motivation

Gato项目的核心动机源于对“通用性”的追求，其背后有多重驱动力：

* **借鉴语言模型的成功**：研究人员观察到，大规模语言模型（如GPT-3）通过在海量文本数据上进行训练，展现出了惊人的通用能力，能够通过少量提示（few-shot prompting）解决各种未曾专门训练过的文本任务。Gato的作者们希望将这种“单一模型、大规模数据、通用能力”的范式从纯文本领域扩展到更广泛的现实世界任务中，包括视觉、决策和物理控制。
* **追求“一个模型，多种用途”**：传统的强化学习或机器人学研究通常是“一个任务，一个模型”。每当任务、环境或机器人形态发生变化时，就需要重新设计和训练一个专门的模型。这种方法效率低下且扩展性差。Gato旨在创建一个单一的、拥有固定权重的神经网络，它能像一个“通用大脑”一样，根据不同的输入情境（context）执行截然不同的任务，例如玩雅达利游戏、为图片生成描述、进行对话、或控制真实机械臂堆叠积木。
* **统一数据表示**：实现通用性的一个关键前提是，模型必须能够处理来自不同来源、不同模态的数据。Gato的动机之一就是探索一种能够将所有类型的数据——无论是图像像素、文本词元、机器人关节力矩还是游戏手柄按键——都转化为一种统一格式（即序列化的词元/token），从而让一个单一的序列模型（Transformer）能够对其进行处理。
* **验证“规模定律”（Scaling Law）在通用智能体上的有效性**：在语言模型领域，增加模型参数量、数据量和计算量通常能带来性能的持续提升。Gato项目的一个重要动机是验证这一定律是否同样适用于包含控制和决策任务的通用智能体。他们假设，通过在一个极度多样化和大规模的数据集上训练一个足够大的模型，可以获得一个“能力全面”的智能体。

### Architecture

Gato的架构本质上是一个**解码器-自回归Transformer（Decoder-only Autoregressive Transformer）**，其设计思想是将所有问题都建模为“序列到序列”的预测任务。

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/GATO_general.png)

* **核心理念：万物皆为序列 (Everything is a Sequence)** Gato的架构基石是将所有输入和输出都序列化。一个任务的完整执行过程，包括观察（observation）、动作（action）和文本，都被转换成一个扁平化的词元（token）序列。 例如，一个控制任务的时间步(timestep)可能被表示为：`[图像块1, 图像块2, ..., 本体感受数据, '分隔符', 机器人动作]`。多个时间步连接起来，就构成了一个完整的片段（episode）序列。
* **主要组件**
  1. **数据标记器 (Tokenizer)**：这是将多模态数据转换为统一词元序列的关键模块。它根据数据类型采用不同的处理方式（详见技术细节部分）。
  2. **嵌入层 (Embedding Layer)**：将离散的词元ID转换为高维度的向量表示。对于图像块（patches），它使用一个ResNet模块来提取特征；对于其他词元（文本、离散或连续值），它使用一个可学习的查找表（lookup table）。
  3. **Transformer解码器 (Transformer Decoder)**：这是模型的核心，负责处理嵌入后的词元序列。Gato使用了1.2B参数的解码器-自回归模型，包含24个Transformer层。它通过自注意力机制（self-attention）来捕捉序列中词元之间的复杂关系，并基于前面的所有词元来预测下一个词元。
  4. **输出层 (Output Layer)**：在Transformer的最后一层之上，一个线性层将输出向量映射到词汇表大小的logits上，然后通过softmax函数得到下一个词元的概率分布。在推理时，通过从这个分布中采样来生成新的词元。

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/GATO_architecture.png)

* **工作流程（训练）**
  1. 从包含604个不同任务的大规模数据集中采样数据。
  2. 将这些多模态数据（如Atari游戏帧、机器人状态、文本对话等）通过标记器转换为扁平化的词元序列。
  3. 将这些序列打包成批次（batches）输入到Gato模型中。
  4. 模型以自回归的方式预测序列中的下一个词元。
  5. **关键点**：损失函数（交叉熵损失）只计算在**目标输出**上，即**文本**和**动作**词元。模型不被要求去预测观察数据（如图像），这大大简化了学习任务。
* **工作流程（部署/推理）**
  1. **提示 (Prompting)**：向模型提供一个任务的“演示”序列（例如，一个成功完成任务的片段），这为模型提供了上下文，使其知道要执行哪个任务。
  2. **自回归生成 (Autoregressive Generation)**：模型接收当前的观察数据（tokenized），并将其附加到历史序列的末尾。然后，模型逐个词元地生成（sample）代表“动作”的序列。
  3. **与环境交互**：一旦完整的动作序列被生成，它会被解码并发送到相应的环境（如游戏模拟器或机器人控制器）中执行。
  4. **循环往复**：环境返回新的观察数据，该数据被标记化并再次添加到历史序列中，模型继续生成下一个动作，如此循环。

### 技术细节

Gato的成功离不开一系列精巧的技术处理，尤其是数据表示和模型训练方面。

* **数据标记化 (Tokenization)**
  * **文本**：使用SentencePiece将文本编码为32000个子词（subwords）的词汇表。
  * **图像**：将图像分割成16x16像素的不重叠块（patches），类似于Vision Transformer (ViT)的做法。这些块按光栅顺序排列。
  * **连续值**（如机器人关节角度、速度）：
    1. 首先使用μ律（mu-law）编码将其压缩到\[-1, 1]的范围。
    2. 然后将这个范围均匀离散化为1024个箱子（bins）。
    3. 最后将得到的整数ID平移到一个特定的范围（例如\[32000, 33024)），以避免与文本词元ID冲突。
  * **离散值**（如Atari游戏按键）：直接映射到\[0, 1024)范围内的整数。
* **序列化与顺序 (Serialization and Ordering)**
  * **时间步内顺序**：在一个时间步内，观察数据（observation tokens）首先按字典序排列，然后是分隔符，最后是动作数据（action tokens）。
  * **片段内顺序**：时间步按时间顺序排列。
  * 这种严格的顺序为模型提供了结构化的信息，使其能够理解观察与动作之间的因果关系。
* **嵌入与位置编码 (Embedding and Positional Encodings)**
  * **图像块嵌入**：每个16x16的图像块都通过一个小型ResNet块来生成一个特征向量，而不是简单的线性投影。
  * **位置编码**：Gato使用了两种至关重要的位置编码来提供时空信息：
    1. **补丁位置编码 (Patch Position Encodings)**：对于图像块，除了ResNet嵌入外，还额外添加了两个可学习的位置编码：一个表示该块在原始图像中的**行位置**，另一个表示**列位置**。这让模型知道图像块在全局图像中的空间位置。
    2. **局部观察位置编码 (Local Observation Position Encodings)**：在一个时间步内，每个观察词元（无论是图像块还是其他传感器读数）都会被赋予一个本地的位置索引（从0开始）。这个索引用于从一个可学习的嵌入表中查找相应的位置编码，并加到词元嵌入上。这让模型能够区分同一时间步内不同类型的观察数据。
* **训练细节 (Training Details)**
  *   **目标函数**：模型使用标准的自回归交叉熵损失进行训练。给定一个序列 `S`，其损失函数为：

      $$
      L(\theta, B) = - \sum_{b=1}^{|B|} \sum_{l=1}^{L} m(b, l) \log p_\theta (s_l^{(b)} | s_{1:l-1}^{(b)})
      $$

      其中 `m(b,l)` 是一个掩码函数，当第 `l` 个词元是**动作**或**文本**时，`m(b,l) = 1`，否则为0。这确保了模型只学习预测需要输出的内容。
  * **提示条件化 (Prompt Conditioning)**：为了帮助模型在没有明确任务ID的情况下区分不同的任务（例如，同样是机械臂，任务是“推”还是“抓”？），训练时有25%的序列会附带一个来自同一任务的“提示”片段。这个提示可以是任务成功片段的结尾（作为一种目标条件化），也可以是片段中的随机部分。
* **数据集 (Datasets)**
  * Gato的训练数据极其庞大和多样化，总共包含来自**604个不同任务**的数据，总计约1.5万亿（Trillion）个词元。
  * **控制任务**：包括DM Lab、Atari、BabyAI、Meta-World、DM Control Suite等模拟环境，以及真实的机器人堆叠任务。数据由专家强化学习智能体生成。
  * **视觉和语言任务**：包括大规模文本数据集（MassiveText）、图像-文本对数据集（ALIGN, LTIP, COCO Captions等）和视觉问答数据集（OKVQA, VQAv2）。

总而言之，Gato是一个雄心勃勃的尝试，它通过将所有任务和模态都统一到序列预测的框架下，成功地训练出了一个具有广泛通用能力的单一智能体。其核心贡献在于证明了**序列化**、**大规模多模态数据**和**Transformer架构**相结合，是通往通用人工智能体的一条可行路径。

***

## ViNT: A Foundation Model for Visual Navigation (2023)

* **输入 (Input)**：
  * **主要输入**：一个代表**导航目标**的图像，以及机器人当前和过去几个时刻的**视觉观测图像**。
  * **适应新任务时**：目标可以被替换为其他模态，如GPS坐标或高级指令（"左转"）。
* **输出 (Output)**：
  1. 一个预测的**未来动作序列**（以相对航点形式表示）。
  2. 一个预测的**动态距离**（到达目标所需的预估时间步数）。
* **解决的任务 (Task Solved)**：构建一个**通用的视觉导航基础模型**。VINT旨在解决机器人领域的“碎片化”问题，即模型难以在不同的机器人、环境和任务间泛化。通过在异构数据上预训练，VINT可以**零样本泛化**到新的机器人和环境中，并能通过轻量级微调**快速适应**全新的导航任务（如GPS导航），而无需从头训练。

### Motivation

这项研究的动机源于当前机器学习领域的趋势和机器人领域的特定挑战。

* **借鉴基础模型（Foundation Models）的成功**：在自然语言处理（NLP）和计算机视觉（CV）领域，像GPT和CLIP这样的大规模预训练模型（即“基础模型”）取得了巨大成功。它们在海量、多样化的数据上进行预训练，学习到通用的、强大的表示能力。然后，这些模型可以通过零样本（zero-shot）迁移、提示（prompt-tuning）或少量数据微调，高效地适应各种下游任务，显著降低了为每个特定任务从零开始训练模型所需的数据量。
* **解决机器人领域的碎片化问题**：与NLP和CV不同，机器人领域面临着“碎片化”的巨大挑战。具体体含：
  * **环境多样性**：室内、室外、公路、越野等环境的外观和物理特性千差万别。
  * **平台多样性**：轮式机器人、足式机器人、无人机、汽车等，它们的动力学、传感器配置（相机焦距、视野、安装位置）和动作空间各不相同。
  * **任务多样性**：从简单的到达目标点，到复杂的遵循GPS路径、执行语言指令等。
* **核心研究问题**：由于这种碎片化，很难将在一个特定机器人/环境下收集的数据直接用于训练另一个差异巨大的机器人。这导致了机器人模型通常是“专才”而非“通才”。因此，作者提出了一个核心问题：**一个用于移动机器人的基础模型需要具备哪些要素？**
* **VINT的目标**：VINT (Visual Navigation Transformer) 就是作者对这个问题的回答。他们旨在创建一个**通用的视觉导航基础模型**，该模型：
  1. 在一个包含多种机器人平台、环境和行为的大规模、异构数据集上进行预训练。
  2. 能够**零样本泛化**到新的机器人和环境中，直接完成导航任务。
  3. 能够通过高效的微调或类似“提示”的机制，**快速适应**新的任务形式（如GPS导航、高级指令导航），而无需从头训练。

总而言之，VINT的动机是将在其他领域被验证成功的基础模型范式引入到机器人视觉导航中，以克服机器人领域的碎片化挑战，创建一个可复用、可扩展、泛化能力强的通用导航策略。

### Architecture

VINT的核心是一个基于Transformer的架构，专为视觉导航任务设计。其设计目标是高效、灵活，并能处理跨机器人平台的异构数据。模型的整体流程如Figure 2所示。

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/ViNT_architecture.png)

* **输入 (Input)**：
  * **当前和历史观测 (Current and Past Observations)**：机器人当前时刻和过去 `P` 个时刻（论文中`P=5`）的视觉观测图像 `Ot-P:t`。这些图像为模型提供了时序上下文信息。
  * **目标观测 (Goal Observation)**：一张代表导航终点的图像 `os`。
* **预处理和令牌化 (Tokenization)**：
  * **观测编码器 (Observation Encoder)**：使用一个EfficientNet-B0 (`ψ`) 卷积神经网络，将每一帧历史和当前观测图像独立编码成一个512维的特征向量，称为“观测令牌”（observation token）。
  * **目标融合编码器 (Goal Fusion Encoder)**：作者发现，如果将目标图像和当前观测图像分开独立编码（即“后期融合”），模型性能不佳。这是因为导航任务的关键在于理解**当前状态与目标的相对关系**，而不仅仅是目标本身。因此，他们设计了一种“目标融合”（Goal Fusion）机制：
    1. 将当前观测图像 `Ot` 和目标图像 `os` 沿通道维度拼接（stacking），形成一个6通道的图像张量。
    2. 将这个拼接后的张量输入一个**独立的、专门的**EfficientNet-B0 (`φ`)，生成一个512维的“目标令牌”（goal token）。这个令牌同时包含了当前状态和目标的信息，能够更好地捕捉它们的差异。
* **Transformer骨干网络 (Transformer Backbone)**：
  * **序列构建**：将 `P+1` 个观测令牌和1个目标令牌组合成一个长度为 `P+2` 的令牌序列。
  * **位置编码**：为序列中的每个令牌添加位置编码，以保留其时序信息。
  * **注意力处理**：将带有位置编码的令牌序列输入一个**解码器式（decoder-only）的Transformer**。该Transformer包含4个注意力层，每层有4个头（multi-head attention）。它能够对序列中所有令牌进行全局注意力计算，捕捉观测、历史和目标之间的复杂依赖关系。
* **输出头 (Output Heads)**：
  * Transformer的输出被送入一个MLP（多层感知机）中，用于预测两个任务：
    1. **未来动作序列 (Future Actions)**：预测未来 `H` 个时间步（论文中`H=5`）的动作 `â`。为了实现“跨机器人平台”的通用性，动作空间被设计为 **与具体机器人解耦（embodiment-agnostic）** 的相对航点（relative waypoints），并根据机器人的最大速度进行归一化。在部署时，一个特定于机器人的底层控制器负责跟踪这些航点。
    2. **动态距离 (Dynamical Distance)**：预测一个标量 `d`，表示从当前状态到达目标状态所需的**时间步数**。这比简单的欧氏距离更能反映机器人的实际可达性。

### 技术细节

#### 训练

*   **训练目标**：VINT采用监督学习（模仿学习）的方式进行训练。其损失函数是一个最大似然目标，旨在让模型的预测尽可能接近数据集中的真实标签。

    $$
    L_{VINT} = \mathbb{E}_{\tau,t,d} [\log p(\hat{a}|f(\psi(o)_{t:t-P}, \phi(o_t, o_s))) + \lambda \log p(d|f(\psi(o)_{t:t-P}, \phi(o_t, o_s)))]
    $$

    该公式表示，模型需要同时最大化预测出正确动作序列 `â` 的概率和预测出正确动态距离 `d` 的概率。`λ` 是一个平衡两项损失的超参数。
* **数据采样**：训练时，从数据集中随机采样一段轨迹，在轨迹中随机选择一个时间点 `t` 作为当前状态，并选择 `t` 之后的某个未来时间点的图像作为目标图像 `os`。
* **异构数据集**：VINT的成功很大程度上归功于其训练数据的多样性。数据集包含超过100小时的真实世界导航数据，来自8种不同的机器人平台（如TurtleBot、Jackal、Spot四足机器人、ATV全地形车等），覆盖了办公室、走廊、郊区、越野小径等多种环境。

#### 长距离导航与探索 (Long-Horizon Navigation & Exploration)

VINT本身只能处理短期的图像目标导航。为了实现长距离导航和在未知环境中探索，作者将其与一个**基于拓扑图的物理A\*搜索算法**相结合。

![](https://cdn.jsdelivr.net/gh/UnderTurrets/ImageHosting/Computer_Vision/\[assets]visual_navigation/ViNT_Long_horizon_navigation.png)

* **拓扑图 (Topological Graph)**：机器人在移动过程中动态构建一个环境的拓扑图 `M`。图中的节点是关键位置的观测图像，边则表示节点间的可达路径，边的权重由VINT预测的动态距离决定。
* **子目标生成 (Subgoal Generation)**：这是此框架的一个关键创新。为了决定下一步探索方向，系统需要生成一系列候选的子目标。作者使用了一个**条件扩散模型 (Conditional Diffusion Model)**，该模型以当前观测 `ot` 为条件，生成一系列**看起来像未来可能场景**的图像 `os`。这些生成的子目标图像既多样又通常是物理可达的，远优于随机采样。
* **执行循环 (Execution Loop)**：
  1. **生成**：使用扩散模型，根据当前观测 `ot` 生成多个候选子目标图像。
  2. **接地**：使用VINT模型处理每个候选子目标，预测到达它们的动作和距离。
  3. **评分**：使用一个启发式函数 `h` 对这些候选子目标进行评分。这个启发式函数可以很简单（如到最终目标GPS点的欧氏距离），也可以很复杂（如一个基于卫星地图预测的 learned heuristic）。
  4. **选择**：A\*规划器结合拓扑图中的已知路径成本和启发式评分，选择最优的子目标。
  5. **执行**：使用VINT策略导航到被选中的子目标。
  6. **更新**：将新到达的位置加入拓扑图，并重复此过程。

#### 适应下游任务 (Adaptation to Downstream Tasks)

VINT的架构设计使其能非常灵活地适应新的任务，特别是那些不由图像定义目标的新模态。

* **全模型微调 (Full Model Fine-tuning)**：对于与预训练任务相似但在新环境中的任务（如在CARLA模拟器中驾驶），可以直接用少量新数据对整个VINT模型进行微调，能快速提升性能。
* **模态适应（Soft-Prompting）**：对于目标形式完全不同的任务（如GPS坐标导航、"左转/右转"指令导航），作者采用了一种类似“软提示”的方法：
  1. **冻结主体**：冻结预训练好的VINT模型的大部分参数，特别是Transformer骨干网络。
  2. **替换目标编码器**：移除原始的“目标融合编码器” `φ`。
  3. **引入新提示网络**：引入一个全新的、轻量级的神经网络 `ϕ`（例如一个小型MLP）。
  4. **学习新映射**：这个 `ϕ` 网络的输入是新的目标模态（如2D坐标、指令的one-hot编码），输出是一个512维的向量。这个向量的维度与原始的目标令牌完全相同。
  5. **注入Transformer**：将 `ϕ` 输出的“伪目标令牌”直接输入到被冻结的Transformer中，就像它原来处理图像目标令牌一样。
  6. **高效训练**：在下游任务的数据上，只训练这个轻量级的提示网络 `ϕ`，从而用极少的数据和计算成本让VINT适应全新的任务。

#### 涌现行为 (Emergent Behaviors)

在大规模异构数据上训练后，VINT表现出了一些未被显式编程的、有益的“涌现行为”。

* **隐式避障**：即使给VINT一个无效或无法到达的目标（例如，墙后面的图像），它并不会盲目撞墙，而是倾向于执行安全的、无碰撞的探索行为。这表明模型学到了通用的“安全导航”先验。
* **隐式偏好**：模型在导航时会自发地倾向于在道路中央或走廊中央行驶，即使训练数据中包含许多次优的、摇摆的轨迹。这表明模型从多样的数据中“提炼”出了更优的导航策略。
* **动态鲁棒性**：尽管只在离线数据上训练，VINT在真实部署时能够有效规避动态行人等障碍物，并成功到达目标点。
