圖塊嵌入(patch embedding)
圖塊嵌入是影像進入 Transformer 的那道門。Transformer 只看得懂「一串寬度固定的向量」;而影像是一個二維的像素格。圖塊嵌入把兩者接起來:它把影像切成一格格小方塊,再把每一塊變成一個符合所需寬度的向量。你可以想成:先替一幅馬賽克拍照,然後用一串數字「條碼」來描述每一塊磚——整幅畫就變成一列條碼,Transformer 可以依序讀取。
在機制上,取一張尺寸為 H x W、有 C 個通道的影像,以及選定的圖塊邊長 P。把它切成 N = (H/P) x (W/P) 個互不重疊的圖塊。把每個圖塊攤平成長度為 P·P·C 的向量(每個像素與通道首尾相接排成一列),再乘上一個共享的可學習權重矩陣,把 P·P·C 個數字映射降到嵌入維度 D(再加一個偏置)。同一個矩陣套用在每一個圖塊上,所以這個投影在所有位置之間是共享的,這正好等同於一個步長等於卷積核大小的卷積濾波器。
這個等價性值得直白地講明:圖塊嵌入完全等同於一個卷積核大小與步長皆等於 P 的二維卷積。多數實作為了速度,乾脆就用一個 kernel=stride=P 的 Conv2d 層。這是整個模型中唯一一處消化影像原始二維結構的地方;經過這一步之後,模型看到的只剩下一組沒有順序的 D 維詞元,這也正是為什麼位置資訊必須另外加進去的原因。
有兩個設計旋鈕很關鍵。圖塊大小 P 決定了序列長度、進而決定了計算量:把 P 減半會讓詞元數 N 變成四倍,而由於注意力成本隨 N² 成長,注意力成本大約會變成十六倍——圖塊愈小、細節愈精,但代價陡升。又因為這個投影是線性且共享的,它無法刻畫圖塊內部超出「線性摘要」的任何結構;有些混合模型會把它換成幾層卷積(一個「卷積莖/convolutional stem」),以注入一點局部性並穩定早期訓練。
因為圖塊格必須剛好鋪滿影像,輸入解析度通常得是 P 的整數倍。在微調時更換解析度也會改變位置嵌入的數量,這正是為什麼 ViT 在餵入不同影像尺寸時,要對位置嵌入做內插。