LeNet
LeNet 可以說是發明了我們今天所使用的卷積神經網路(convolutional neural network)的架構。由 Yann LeCun 與同事在 1980 年代後期開發,並於 1998 年精煉成著名的 LeNet-5,它的設計目的是辨識銀行支票與郵件信封上的手寫數字。其核心洞見是:你不應該把一張 28x28 的影像攤平成 784 個數字的扁平清單,再餵給一個通用的全連接(fully-connected)網路,因為那樣會丟掉「鄰近像素彼此相關」以及「同一個數字無論出現在頁面哪個位置都長得一樣」這兩件事。取而代之,LeNet 讓小型可學習的濾鏡在影像上滑動(卷積),把結果縮小但保留最強的反應(池化,當時稱為次取樣 subsampling),最後才用一般的全連接層做出最終的類別判斷。
這種「先卷積、再池化、最後全連接」的模板,正是後續每一個 CNN 都繼承下來、定義整個類型的範式。LeNet-5 具體堆疊如下:一個產生數個特徵圖(feature map)的卷積層、一個把空間尺寸減半的平均池化(次取樣)層、再一個卷積、再一個池化,接著兩到三個全連接層,最後以 10 路輸出對應數字 0 到 9。它使用 tanh 與 sigmoid 這類擠壓型非線性(當時 ReLU 尚未成為標準)、使用平均池化而非最大池化,並以反向傳播(backpropagation)端到端訓練。以今天的標準來看它非常迷你,大約只有六萬個參數,然而它在 MNIST 上達到低於百分之一的錯誤率,並在 1990 年代被商業部署,處理了美國相當大比例的支票。
LeNet 之所以具有歷史樞紐地位,在於它一次展示了三個歷久不衰的想法:局部感受野(每個神經元只看一小塊區域)、權重共享(同一個濾鏡在每個位置重複使用,這正是讓網路具備平移意識並大幅削減參數量的關鍵),以及特徵的層級結構(早期層偵測邊緣與筆畫,後期層把它們組裝成類似數字的形狀)。這三個想法,正是 AlexNet、VGG 與 ResNet 後來放大數個數量級所依憑的東西。LeNet 證明了原理;它只是必須等待大約十五年,直到大型標註資料集與 GPU 出現,才讓這個原理得以延伸到真實照片上。
演算示意:一張 32x32 的灰階數字進入 LeNet-5;conv1(六個 5x5 濾鏡)產生六張 28x28 的圖;2x2 次取樣得到六張 14x14 的圖;conv2(十六個 5x5 濾鏡)得到十六張 10x10 的圖;次取樣得到十六張 5x5 的圖;這 400 個值流經 120 個再 84 個單元的全連接層,進入 10 個輸出,每個數字一個。
別假設 LeNet 在每個細節上都長得像現代 CNN。它使用平均池化與 tanh/sigmoid,而非最大池化與 ReLU,而且它的第二個卷積層為了節省計算,只連接到前一層特徵圖中人工挑選的一個子集合,這是一種工程上的折衷,後來的全連接做法讓它變得沒有必要。