Skip to content

CNN 與 ViT:一張圖怎麼變成模型的輸入|CMU 10-423 第 5 堂

2026年9月30日1 分鐘
TL;DR語言模型先把文字變成 token,影像模型也需要把畫素整理成可運算的表示。

查詞與收藏

正在載入查詞工具…

🌏 English version

影片狀態:錄影需登入或課程授權。 本文依公開投影片與作業整理,數值例子為本站補充,不是課堂逐字稿。

語言模型先把文字變成 token,影像模型也需要把畫素整理成可運算的表示。CNN 用共享的區域性濾波器掃過圖,ViT 則把圖切成 patches,再用 Transformer 整合。本篇用同一張小圖比較兩條資料流,並把 BERT 的雙向 attention 放在正確位置;不把三個名字排成模型清單就當成教完。

先備是第 2 堂的 attention 與矩陣維度。不熟卷積時,先把它當成「每個小視窗做相同的加權和」;下面算過一次,再回到感受野與參數共享。

一個濾波器走完一張小圖

以下為本站自擬例子。灰階圖是四列 [1,2,3,4]、[5,6,7,8]、[9,10,11,12]、[13,14,15,16]。用 2×2 的全一 kernel、stride=2、不 padding、bias=0,輸出大小是 (4−2)/2+1=2,結果為 2×2。

左上視窗的值是 1、2、5、6,加總為 14;右上是 3、4、7、8,得到 22;左下是 9、10、13、14,得到 46;右下是 11、12、15、16,得到 54。輸出因此是 [14,22;46,54]。同一個 kernel 重複作用四次,參數不是四份。

深度學習框架常實作的是不翻轉 kernel 的 cross-correlation,習慣仍稱 convolution。全一 kernel 剛好不受翻轉影響;若換不對稱權重,就要按框架的定義計算,不能混用兩個慣例。

多通道影像會把每個視窗在所有輸入通道上的加權結果相加,再形成一個輸出通道。若 RGB 圖用一個 2×2 filter,權重有 2×2×3=12 個,另加一個 bias;不是每個 RGB 通道各自得到最後的分類分數。

局部性與感受野是架構選擇

CNN 的區域性連線與共享權重帶來對影象的歸納偏好。移動一個 pattern,濾波器可在新位置偵測到它;但 padding、stride 與邊界會影響精確的平移性質。多層卷積逐步擴大感受野。stride=1 的兩層 3×3 卷積,中心輸出在原圖上可依賴 5×5 範圍,而不是 6×6。

pooling 或 stride 減少空間解析度,有助整合特徵與降低成本,但也可能丟掉精細位置資訊。因此分類適合的壓縮,不一定適合逐畫素預測。

同一張圖切成 ViT tokens

仍用 4×4 灰階圖、patch=2×2,不重疊,就有四個 patches。把每個 patch 攤平成四維向量,例如左上是 [1,2,5,6],再用共享線性層投影成 d 維 token。這一步不是直接拿四個畫素當四個 token,而是一個 patch 變成一個 token。

若 d=3,patch projection 的權重是 4×3=12 個,加 3 個 bias。四個 tokens 形成 [4,3],加上位置表示,若模型使用 class token,再變成 [5,3]。單頭全 attention 的配對矩陣是 5×5,不是 16×16。其他讀出方式也可不用 class token,不能把它當所有影像 Transformer 的必要條件。

如果 patch 改成 1×1,影像 tokens 從 4 增至 16,含 class token 的 attention 配對數從 25 增至 289。更細 patch 可能保留細節,但增加序列成本;模型不是免費得到更高解析度。

BERT 的雙向不是拿來偷看答案

BERT 是 encoder-only Transformer 的典型例子,讓每個輸入位置讀左右兩邊的內容,適合建立整段表示。masked language modeling 先遮掉部分輸入,再預測被遮掉的 token,因此可以使用左右可見的上下文。它跟下一 token 自回歸訓練的遮罩與標籤位置不同。

ViT 的影像表示常使用雙向 self-attention,因為完整圖片在輸入時已經可見。不能因此把一個雙向文字 encoder 直接套在未移位的下一 token 目標上,那會讓模型讀到應該預測的內容。可見資訊必須依任務定義,而不是隻看「Transformer」這個名稱。

變式題與答案

8×8 RGB 圖、patch=2×2、embedding=6、使用一個 class token:有 16 個影像 tokens,每個原始 patch 12 維,投影權重 12×6=72 個,加 6 個 bias;完整序列 17 個 tokens,單頭分數矩陣 17×17。

原 4×4 灰階卷積例子若 stride 改成 1,不 padding,輸出是幾乘幾?答案是 3×3。左上結果仍是 14,但相鄰視窗會重疊。能計算 token 數、參數數與可見範圍,就能接下來比較:分類表示怎麼被拿去做 GAN 與擴散生成。

上一篇|下一篇|系列總覽

課程影片來源

官方錄影入口位於 SCS Panopto。匿名資料夾未載入並提示登入;這表示未取得公開播放內容,不代表沒有錄影。原音與字幕須依課程授權存取。

參考資料