類別詞元(class token, [CLS])
類別詞元是你接在圖塊序列最前面、額外的可學習向量,它唯一的任務就是匯集整張影像的摘要。沒有任何一個圖塊詞元是掛上「這張圖是什麼?」這個單一答案的自然位置——每個圖塊都綁在某一個地點上。於是,ViT 借用了 NLP 裡 BERT 的點子,在最前面多加一個不屬於任何圖塊的格子;當它流過注意力層時,可以自由地從每個圖塊蒐集資訊,而它的最終狀態就成了整張影像的全域描述子。
具體來說,它是一個單一的 D 維參數向量(常寫成 x_class 或 [CLS]),對每張影像都相同,並由反向傳播學得。它被放在序列的第 0 個位置、配給自己的位置嵌入,並經過與圖塊完全相同的注意力與 MLP 層處理——它在計算上並不特別,只在角色上特別。在最後一個編碼器區塊之後,你取出類別詞元的輸出向量,過層正規化與一個小小的線性分類頭,就得到類別的 logits。圖塊的輸出在分類時通常被丟棄。
有一個與之競爭的設計:不用類別詞元,而是直接把所有圖塊輸出取平均(全域平均池化,global average pooling, GAP)再分類。GAP 往往能追平甚至略勝類別詞元,且消除了一點小小的不對稱,因此有好幾個現代 ViT 乾脆完全拿掉類別詞元。類別詞元之所以留存,部分是出於對 BERT 的歷史忠實,部分是因為它提供了一個乾淨的向量,方便下游任務讀取、也方便視覺化模型「在看哪裡」(它對圖塊的注意力)。
一個微妙的重點:類別詞元一開始是個固定、不含內容的向量,所以它要變成好的摘要,唯一的辦法就是去注意(attend to)那些圖塊——它扮演的是一個「學到的查詢(query)」,把整條序列匯集起來。這也是為什麼它對圖塊的注意力權重,常被當成一張顯著性圖(saliency map)——雖然並不完美:它顯示了這個摘要決定去傾聽哪些區域。
把類別詞元的注意力當作解釋很誘人,卻不可靠:原始注意力略過了殘差路徑與 MLP,又跨多層混在一起。像注意力滾動(attention rollout)或以梯度為基礎的方法能給出更忠實的圖。另外,在像 DINO 這類模型裡,類別詞元的注意力異常乾淨——那是訓練方式的性質,並非對所有 ViT 都成立的保證。