照片就是一張數字網格
把任意一張數位照片放得足夠大,畫面就會化解成一個個微小的彩色方塊。每個方塊就是一個像素(pixel,即「影像元素」),而在電腦眼裡它根本不是顏色,而是一個度量亮度的數字。在灰階影像裡,一個像素就是單一數值,按慣例從 0(黑)到 255(白),中間一切都是某種灰。於是一張 1000×1000 的照片,不過是一百萬個這樣的數字排成網格:一行行、一列列的亮度而已。那裡面沒有「貓」,也沒有「天空」——只有一張巨大的強度數值表。
彩色的原理一模一樣,只是疊了起來。一個彩色像素通常是三個數字——它發出多少紅光、綠光和藍光——因為人眼有三類顏色感受器,把這三種原色混合起來就能重現我們能看到的大多數顏色。所以一張彩色照片其實是三張網格相互疊放:一張管紅、一張管綠、一張管藍。這些疊起來的網格就叫通道(channel)。
從網格到張量
你已經熟悉這條「形狀」的階梯:單個數是純量,一排數是向量,一張網格是矩陣,而軸更多的東西就是張量。灰階影像恰好就是一個矩陣——高 × 寬。彩色影像再上一層:高 × 寬 × 3 個通道——一個有三條軸的張量。這正是流入每個視覺模型的標準形狀,而把軸的順序擺對(通道在前還是通道在後)是這份工作裡每天都要做、卻毫不光鮮的一環。
實踐中我們很少一次只處理一張圖。我們會把許多影像堆成一個批次(batch),在最前面再添一條軸,於是真正在訓練中流動的張量是 批次 × 高 × 寬 × 通道。這個四維的數字塊才是真正的「輸入」——而你之前學過的每一層、每一次矩陣乘法和卷積,無非都是在對這個塊做算術、重塑它的形狀。
grayscale shape = (H, W) # one value per pixel color shape = (H, W, 3) # red, green, blue stacked batch shape = (N, H, W, 3) # N images flowing together # a single pixel in a color image is just three numbers: img[120, 64] = [231, 76, 60] # reddish: high R, low G, low B
一條「邊緣」究竟是什麼?
孤立的原始像素幾乎毫無用處——知道像素 (120, 64) 偏紅,並不能告訴你這張圖畫的是什麼。你能提取的第一個有用東西是邊緣(edge):亮度在相鄰像素間驟然變化的地方。把目光掃過一張「桌上有個馬克杯」的照片,杯子與背景的界線,正好就是數字跳變的地方。一條邊緣,無非是相鄰像素之間一處很大的局部*差異*。
你可以用一個微小的滑動視窗來找邊緣——一張小小的權重網格,讓它在影像上滑過,邊滑邊做乘法再相加。把權重設計成:像素有差異處視窗輸出大值、平坦處輸出近零,你就有了一個邊緣偵測器。這個滑動視窗運算*就是*一次卷積,它的輸出是一張新網格,叫特徵圖,哪裡出現那種模式,它就在哪裡「亮」起來。幾十年裡,工程師都是手工設計這些小濾波器——Sobel、Canny——因為判定什麼才算有用的特徵,本身就是一門手藝。
卷積網路悄然帶來的革命,是不再手工設計這些濾波器,而是去*學*它們。每個視窗裡的權重都變成由梯度下降調節的參數。疊上幾層,網路就建起一座層級:第一層學到邊緣和色塊,下一層把邊緣組合成角點和紋理,再下一層組合成眼睛、車輪和葉片,最頂層組合成完整的物體。邊緣不過是這座階梯最底下的一級——而關鍵在於,機器是自己發現它的。
為什麼視覺是真的難
真正的難處在這裡。單一一個物體——比如某一隻特定的貓——可以產生幾乎無限多張完全不同的像素網格。把它移近,每個數字都變了。旋轉它、調暗燈光、讓一把椅子遮住它一半、把背景從草地換成雪地——每一次,原始張量都變得面目全非,可你的大腦卻瞬間斷定「是同一隻貓」。電腦必須學會:一個穩定的概念(「貓」)藏在多得驚人的像素排布背後。這道橫在原始像素與含義之間的鴻溝,叫做語意鴻溝(semantic gap),跨越它就是視覺的全部難題。
數字會讓這一點變得鮮活。一張並不算大的 224×224 彩色圖就有超過 15 萬個原始數值,而所有可能影像構成的空間浩瀚得無法想像——可其中只有薄得難以置信的一小片,看起來像是真實存在的東西。模型必須從相對少得可憐的一堆樣本裡,把這片巨大空間中「有意義」的區域切割出來——這正是你早先見過的維度災難的一副面孔。它竟然行得通,原因在於真實影像並不隨機:它們充滿結構——鄰近像素彼此相關、邊緣連成線條、紋理不斷重複——而像卷積這樣恰當的歸納偏置,正好把這種結構事先嵌了進去。
本階的其餘部分如何由此搭建
本階接下來的一切,都立在你現在擁有的這幅圖景上:影像是張量、特徵是分層學來的、而核心的敵人是「變化」。說出畫面裡那個唯一的主導物體,是影像分類;給每個物體畫一個框、說出它*在哪*,就成了物件偵測;給每一個像素都貼上標籤,就成了分割。後面的指南還會重新審視卷積這一假設本身——視覺 Transformer丟掉了滑動視窗,把影像切成一塊塊小補丁,讓注意力機制自己決定什麼和什麼有關。
有兩個實用習慣會貫穿始終。第一,既然「變化」是敵人,那我們就在訓練時故意製造更多變化——翻轉、裁剪、改色、旋轉影像,好讓模型學會忽略那些其實無關緊要的變化;這就是資料增強,也是讓視覺模型變得穩健的最廉價辦法之一。第二,幾乎沒人會從零訓練:人們往往從一個已經在巨型帶標註資料集 ImageNet 上訓練好的網路出發,再去適配它——這正是你早先見過的遷移學習招式,它讓一個小資料集得以站在一個龐大資料集的肩膀上。