60 秒回答模板

ViT 的输入处理可以按公式讲。给一张 H x W x C 的图片,patch 大小是 P x P,如果 H 和 W 都能被 P 整除,那么 patch 数量是 (H / P) * (W / P)。每个 patch 原始展平维度是 P * P * C,然后通过一个线性层投影到模型隐藏维度 D,成为一个 patch token。以题目里的 224 x 224 x 3 图片和 14 x 14 patch 为例,水平方向有 224 / 14 = 16 个 patch,垂直方向也是 16 个,所以一共有 16 * 16 = 256 个 patch;每个 patch 展平维度是 14 * 14 * 3 = 588,投影后变成 D 维 token。如果模型使用 CLS token,最终 sequence length 是 256 + 1 = 257;如果不使用 CLS token,就只是 256。之后会给这些 token 加位置编码,再送入 Transformer Encoder。回答时要把 patch 数量和 patch 展平维度分开,很多人会把 588 误认为序列长度。

考点 序列长度公式
难度 真实面经题
回答目标 讲清机制、训练与评估取舍

深入解析

01

先给通用公式

对 H x W x C 的图像,patch size 为 P x P 时,patch 数量是 (H / P) x (W / P),前提是图像尺寸能被 P 整除。如果不能整除,需要 resize、padding 或裁剪。

02

代入 224 和 14

224 / 14 = 16,所以横向 16 个 patch,纵向 16 个 patch,总 patch 数是 16 x 16 = 256。这个 256 才是 patch token 的数量,也就是不加特殊 token 时的 sequence length。

03

每个 patch 要展平再投影

每个 14 x 14 x 3 patch 展平后长度是 588,但 Transformer 通常不会直接用 588 作为固定隐藏维度,而是通过线性投影映射成 D 维 embedding,例如 768 维或其他模型维度。

04

CLS token 会让长度加一

如果 ViT 使用 CLS token 做全局表征,就在 patch token 前加一个可学习 token,sequence length 从 256 变成 257。如果使用平均池化或其他聚合方式,可能不加 CLS token。

05

位置编码不可少

Transformer 本身不具备天然空间顺序感,所以要给 patch token 加位置编码,告诉模型每个 patch 在原始图片里的位置。二维空间通常会被展平成一维序列,但位置编码仍然承载空间信息。

06

复杂度随 patch 数增长

Self-Attention 的计算和 token 数平方相关。patch 越小,token 数越多,细节更丰富但计算更贵;patch 越大,token 数少但细节可能丢失。这个取舍是 ViT 输入设计的重要点。

易错点

  • 把 14 x 14 x 3 = 588 当成 sequence length。
  • 忘记分别计算横向和纵向 patch 数,直接用 224 / 14 得出 16。
  • 忽略 CLS token,应该答 257 的场景只答 256。
  • 认为 patch 展平后直接进入 Transformer,不需要线性投影到 hidden size。
  • 没有说明位置编码,导致 patch 序列失去空间位置信息。
  • 忽略 patch size 对 attention 复杂度和细节保留的影响。

面试官追问

如果 patch size 是 16,224x224 图像的 sequence length 是多少?

224 / 16 = 14,所以 patch 数是 14 x 14 = 196;如果加 CLS token,则总长度是 197。

patch 展平维度和模型 hidden size 必须相等吗?

不必相等。展平维度是 P x P x C,之后会通过线性投影映射到模型 hidden size D。

patch 越小一定越好吗?

不一定。patch 小会保留更多细节,但 token 数增加,self-attention 成本按平方增长;patch 大更省计算,但可能丢细粒度信息。

为什么需要位置编码?

patch 展平成序列后,Transformer 需要额外位置信息才能区分上、下、左、右等空间关系,否则相同 patch 集合的排列信息会丢失。