1. Self-Attention?
ViT 的核心不是"把图像切成 patch"这么简单。
图像切成 patch 只是第一步。真正让 ViT 能够建模图像全局关系的,是 Transformer Encoder 中的 Self-Attention。在 CNN 中,图像信息通常通过卷积层逐步传播。一个像素或者一个局部区域想要和远处区域发生关系,往往需要经过多层卷积堆叠。而在 Self-Attention 中,所有 token 之间都可以直接计算关系。如果放到 ViT 中理解:
每个图像 patch 都是一个 token;
Self-Attention 会计算每个 patch 和其他 patch 的关系;
模型根据这些关系重新聚合图像信息。
也就是说,Self-Attention 让 ViT 不再只能从局部一步步看图,而是可以直接比较图像中任意两个 patch 之间的联系。这就是它和 CNN 最核心的区别之一。
2. 从一个简单例子理解 Attention
在正式讲公式之前,我们先用一个简单例子理解 Attention。假设一句话是:
我 喜欢 计算机 视觉
这句话中有 4 个 token。当模型处理"视觉"这个词时,它可能需要关注前面的"计算机",因为"计算机视觉"是一个整体概念。当模型处理"喜欢"这个词时,它可能需要关注"我",因为"我"是动作的发出者。所以,Attention 的核心思想可以简单理解为:当前 token 在更新自己的表示时,不是只看自己,而是会根据相关性去关注其他 token。
换句话说,每个 token 都会问一个问题:在当前上下文中,我应该重点关注哪些 token?这个"关注程度"就是 attention weight。
3. Query、Key、Value 是什么?
Self-Attention 中最容易让人困惑的三个概念就是:
Query
Key
Value
它们通常简写为:
Q, K, V
很多初学者第一次看到这三个名字会觉得很抽象。其实可以用"检索信息"的方式来理解。
3.1 用搜索来理解 Q、K、V
假设你在搜索引擎中输入一个问题:
Vision Transformer 是什么?
这个问题就类似于 Query。搜索引擎会拿你的问题和网页中的关键词、标题、内容进行匹配,这些被匹配的信息可以类比为 Key。最后,搜索引擎返回给你的具体网页内容,可以类比为 Value。所以可以简单理解为:
Query:我想找什么?
Key:我有什么特征可以被匹配?
Value:如果匹配上了,我能提供什么信息?
放到 Self-Attention 中,每个 token 都会生成自己的 Query、Key 和 Value。
3.2 在 token 中理解 Q、K、V
假设输入有 4 个 token:
token_1, token_2, token_3, token_4
每个 token 都会通过不同的线性层生成三个向量:
Q:用来查询其他 token
K:用来被其他 token 匹配
V:真正被聚合的信息内容
例如,当 token_1 想更新自己的表示时,它会用自己的 Query 去和所有 token 的 Key 做匹配。匹配分数越高,说明 token_1 越应该关注那个 token。然后再根据这些分数,对所有 token 的 Value 做加权求和。这就是 Self-Attention 的核心过程。