NEWSIO+ 教育系列01 自己訓練一個 AI02 從照片還原 3D03 深度學習
主線 A · 模組 A1動手做 // 四個實驗台

從像素
到 分數

一張圖怎麼變成「貓 0.7、狗 0.2、船 0.1」?

電腦看到的不是貓,是一格一格 0 到 255 的數字。這個模組做最簡單的分類器:把每個像素乘上一個權重、加起來、變成每一類的分數,再把分數變成機率。最後看它什麼時候會失敗,為什麼要多疊一層。

SEC.01 / PIXELS

像素距離不等於語意距離

最直覺的分類法:拿新圖和訓練集裡每張圖比,看誰最像(nearest neighbor)。「像」用什麼量?最簡單是把對應像素相減、取絕對值、全部加起來。下面是兩隻 8×8 的動物,把貓往右推一格,看它和「原來的自己」距離多遠。

PROBE A / 把貓移一格動手做 // 按平移、變亮、翻轉

原本的貓 訓練集裡的那張

你動過的貓 新來的一張

訓練集裡的狗

動過的貓 ↔ 原本的貓(像素差總和)0
動過的貓 ↔ 狗—
nearest neighbor 會說它是
貓
同一隻貓只是移了一格,像素距離就比「貓和狗」還遠。像素空間的距離跟背景、亮度、位置的關係,比跟語意的關係大。這就是為什麼 nearest neighbor 在 CIFAR-10 上只有 38.6%(10 類隨便猜是 10%,人是 94%)。我們需要的不是「比像素」,而是對任務有用的不變性。
圖只是一格數字800×600 的彩色照片是 800×600×3 個 0 到 255 的整數。電腦從這裡開始,沒有別的。
同一個東西像素差很多視角、大小、變形、遮擋、光線、背景雜亂、同類之間的差異,每一項都讓像素大幅改變。
所以要「學」出比較的方法不比原始像素,而是先把圖變成對任務有用的表示。後面整門課都在講怎麼變。
細看 · 影像為什麼難、nearest neighbor 的數字

語意落差(semantic gap):影像在電腦裡是數字格,「貓」這個概念不在任何一格裡。講義列的七種困難:viewpoint variation、scale variation、deformation、occlusion、illumination、background clutter、intra-class variation。

k-nearest neighbors:不只看最近的一張,看最近的 k 張投票。CIFAR-10(50,000 張 32×32×3 的訓練圖、10 類)上用像素 L1 或 L2 距離的 kNN 約 38.6%,而用 L2 並不會比 L1 好:距離和背景、色調的相關比和內容的相關強。

為什麼這件事在 1966 年就開始:Minsky 給大學生 Sussman 的暑期作業是「把相機接上電腦,讓電腦描述看到什麼」。這個暑期作業花了五十年。

SEC.02 / LINEAR CLASSIFIER

線性分類器:每一類一張模板

換個做法:不存訓練集,只存每一類「一張模板」。分數 = 圖片的每個像素 × 模板對應位置的權重,全部加起來,再加一個偏移。f(x, W) = Wx + b。下面是講義裡那個四個像素、三個類別的玩具例子:改像素、改權重,看分數怎麼動。

PROBE B / 四個像素,三張模板動手做 // 改像素或權重
輸入 x(四個像素,0 到 1)
分數最高的是
—
樣本: 權重:
每張模板的四個權重可以畫回 2×2 的小圖(橘色是正、藍色是負)。「訓練好的」貓模板上面是正、下面是負,所以上面亮的圖分數高。這就是模板比對:線性分類器其實還是 nearest neighbor,只是每一類只留一張學出來的圖,距離換成內積。CIFAR-10 的 W 是 10 列 × 3072 行,每一列展開就是一張 32×32×3 的模糊模板。
三種看法,同一件事代數:Wx + b。模板:每類一張圖做內積。幾何:每類一條直線(高維是超平面),分數是到線的距離。
模板只有一張一匹左邊有頭的馬和右邊有頭的馬,會被平均成一張兩頭馬。線性模型的表達力就到這裡。
權重是「學」出來的這一節是手動調。怎麼自動調,就是 A2 和 A3 的全部內容。
細看 · 維度、bias trick、幾何觀點

維度:CIFAR-10 的一張圖拉直是 3072 個數字,x 是 3072×1;10 類,W 是 10×3072,b 是 10×1。輸出 10 個分數。

Bias trick:在 x 最後多補一個常數 1,把 b 併進 W 的最後一行,W 變成 10×3073。一次矩陣乘法取代「乘再加」。講義後面說「30,730 維的山坡」就是 10×3073。

幾何觀點:把每張圖當高維空間裡的一個點,每一類的 W 列是一條線,線上分數為 0,往箭頭方向線性增加、反方向線性減少。線性分不開的情況(例如同心圓、XOR)在 SEC.04。

SEC.03 / SOFTMAX & LOSS

分數變機率,機率變「不開心的程度」

分數是任意實數,不好比較也不好解釋。Softmax 做兩件事:先對每個分數取指數(都變正),再除以總和(加起來是 1)。Loss 只看正確那一類的機率:L = −log p正確類。機率 1 時 loss 是 0;機率越小,loss 越大。這個數字就是「模型對訓練集有多不開心」。

PROBE C / Softmax 與 cross-entropy動手做 // 拉分數,選正確答案
exp 的總和—
Cross-entropy loss = −log p正確—
SVM hinge loss(比較用)—
把 k 拉大:分數整個放大,機率變得更極端,loss 一直往 0 掉。但這不是模型變好,只是 W 變成 2W、3W。講義裡叫它「loss function 的 bug」:W 不唯一。修法是在 loss 加一項懲罰大權重,這就是 regularization,在 A3 和 B5 會回來。另外注意 SVM 的 hinge loss 在正確類領先超過 1 之後就「滿意」(loss 0),softmax 永遠不滿意。
指數讓分數都變正,而且拉開差距e² 是 7.4,e⁰ 是 1,e⁻¹ 是 0.37。差 1 分,機率差 2.7 倍。
Loss 只罰正確答案的機率其他類的機率不直接出現在公式裡,但它們分掉了總和,所以間接被罰。
剛開始時 loss 應該是 log(類別數)權重很小、分數全是 0,每類機率 1/C。10 類時 loss = 2.30。訓練第一步看到不是這個數,通常是哪裡寫錯了。
細看 · 公式、SVM 與 softmax 的差別、PyTorch 的坑
pi = esi / Σj esj  L = −Σj yj log pj = −log py (y 是 one-hot,只有正確類那一項不是 0)

Multinomial logistic regression:softmax 分類器的另一個名字。整個 batch 的 loss 是每個樣本 loss 的平均。

SVM(hinge)vs softmax:分數 [10, −2, 3]、第一類正確時,margin 1 的 SVM loss 已經是 0;分數改成 [10, 9, 9] 它還是 0,softmax 卻會罰得很重。SVM 是比較「局部」的目標:margin 滿足就不管細節;softmax 永遠想把正確類推更高。實務上兩者結果差不多。

PyTorch:nn.CrossEntropyLoss() 內部已經做了 softmax,餵 logits 就好,不要再自己加一層 softmax。二分類的 nn.BCELoss() 則要先過 sigmoid。

初始化時的 sanity check:W 小 → 分數都接近 0 → loss ≈ log C。CIFAR-10 是 ln 10 ≈ 2.303。B3 會把這個檢查放進訓練除錯流程。

SEC.04 / XOR

線性分不開的時候:多疊一層

線性分類器只能畫一條直線。有些資料一條直線怎麼畫都分不開,最有名的是 XOR:四個點,對角線同一類。1969 年 Minsky 和 Papert 證明單層感知機解不了它,神經網路研究沉寂了快二十年。解法是先用一層把資料「搬」到一個新空間,讓它在新空間裡變成線性可分。

PROBE D / 一條直線分得開嗎動手做 // 調直線,再打開隱藏層

輸入空間 (x₁, x₂)

隱藏層空間 (h₁, h₂) 打開隱藏層後才會出現

—
分對的點—
打開隱藏層後,左圖的決策區域變成折線,右圖是同一批點被兩個神經元搬到新座標 h₁ = ReLU(x₁ + x₂ − 0.5)、h₂ = ReLU(x₁ + x₂ − 1.5) 之後的位置:XOR 的四個點在新空間裡排成一直線上的三個位置,中間那個和兩端不同類,一條線就分得開。這裡隱藏層的權重是手工寫的;真實的網路會自己學出來,那是 A2 的事。
隱藏層 = 換一個座標系每個隱藏神經元偵測一個局部特徵,輸出層再組合這些特徵做決定。
沒有非線性,疊再多層都是一層兩個矩陣相乘還是一個矩陣。ReLU 這種「折一下」的函數是多層有用的必要條件,不是細節。
MLP 無所不在它很少單獨用,但它是 CNN 的全連接層、Transformer 的 FFN,幾乎所有現代架構的基本零件。
細看 · Perceptron、通用近似定理、為什麼要 activation

Perceptron(Rosenblatt,1954):加權和 + 門檻。真正的意義不在解了什麼問題,而是證明參數可以由資料的錯誤自動更新。限制:只能表示線性可分的問題。

XOR:(0,0)→0、(0,1)→1、(1,0)→1、(1,1)→0。四個點在平面上不存在任何一條直線能分開。這是線性模型的根本限制,不是參數沒調好。

通用近似定理:一層隱藏層(夠寬)的網路可以近似任意函數。但它只保證「表達能力存在」,沒說怎麼訓練出來。表達能力和可訓練性是兩回事,這個區分在後面每一次卡關和突破都會用到。

結合律:W₂(W₁x) = (W₂W₁)x。沒有 activation 的多層網路等價於一層。A2 的 2 層網路用 sigmoid;B2 整個模組在講 activation 怎麼選。

SEC.05 / MISCONCEPTIONS

常見誤解

這個模組最常被講錯的幾句話。

深度學習會自己找到正確的特徵,所以資料前處理不重要。模型學的是「最容易降低 loss 的訊號」,不保證那是你要的因果訊號。洩漏、捷徑、分佈偏移都會被它學走(B1)。
像素距離近就是同一類。像素距離跟背景、亮度、位置的關係比跟語意大。移一格的貓離自己比離狗遠。
多疊幾層線性層,模型就更強。線性層相乘還是線性。沒有 activation,一百層等於一層。
softmax 輸出的就是模型的「信心」。它是一個加起來等於 1 的分數分佈,把 W 乘 3 它就更「有信心」,但模型沒變。校準是可信任軸的題目。