跳轉到

1989 - 楊立昆卷積網路(手寫數字辨識的卷積神經網路)#

案件摘要#

1989 年,Yann LeCun(楊立昆,1960– ) 在 AT&T 貝爾實驗室, 把反向傳播(見 1986-反向傳播復興.md)套上卷積的幾何直覺—— 卷積神經網路(CNN, Convolutional Neural Network)誕生:

\[ \boxed{\text{卷積(掃描)+ 池化(摘要)+ 反向傳播(學習)= 看得懂的機器}} \]

CNN 的三大支柱: - 卷積層:一個小核(kernel)在圖像上滑動掃描,偵測局部特徵; - 池化層:把小區域壓縮成一個值——位置微移也不影響判斷; - 參數共享:同一組核掃描整張圖——參數量暴減,泛化力暴增。

\[ \text{conv}(I, K)_{ij} = \sum_{u,v} I_{i+u,\,j+v}\, K_{uv} \quad\text{(核 K 在圖像 I 上滑動)} \]

實際任務:手寫數字辨識——AT&T 的支票自動辨識與 美國郵政的郵遞區號(ZIP code)辨識——神經網路第一次大规模商業落地。

前因 -- 為什麼會有這個案子#

  • 福島邦彥的新認知機(1980): Kunihiko Fukushima 的 Neocognitron(新認知機, 見 1980-福島新認知機.md)模仿視覺皮層的層級結構: 簡單細胞(S:偵測特徵)→ 複雜細胞(C:容忍位移)。 LeCun 自承受其啟發:新認知機有卷積的結構,卻沒有反向傳播—— 權重靠自我組織調整,學不動、學不準。
\[ \text{Neocognitron(1980):結構} + \text{back-prop(1986):學習} \xrightarrow{\text{LeCun(1989)}} \text{CNN}. \]
  • Hubel–Wiesel 的視覺皮層(1959–1962): David Hubel 與 Torsten Wiesel 在貓的視覺皮層發現: 簡單細胞對特定方向的邊緣反應(像一個小卷積核!); 複雜細胞對同方向邊緣反應但位置不拘(像池化!)—— 兩人獲 1981 年諾貝爾生理醫學獎:
\[ \text{神經科學(1959)} \xrightarrow{\text{福島(1980)}} \text{LeCun(1989)}. \]
  • 反向傳播的成熟(1986): Rumelhart–Hinton–Williams 1986 年的論文讓多層網路可訓練; 但全連接網路對圖像參數爆炸:
\[ \text{100} \times \text{100 像素} \times \text{1000 隱藏單元} = 10^8 \text{ 個權重——學不完、也泛化不了} \]

問題:如何讓網路「知道」圖像的空間結構?——卷積的答案。 - 商業需求:支票與郵遞區號: 1980 年代末,美國銀行的支票與郵政的 ZIP code 需要自動辨識 手寫數字——十個數字(0–9)、無限種筆跡。 LeCun 在 1988 年加入貝爾實驗室,把卷積結構與反向傳播焊接—— CNN 正是為這個案子量身訂做。

線索與推理 -- 數學式、程式、理論#

第一條線索:卷積運算——掃描與偵測#

卷積(這裡指離散的「滑動內積」):

\[ \text{conv}(I, K)_{ij} = \sum_{u=0}^{k-1}\sum_{v=0}^{k-1} I_{i+u,\,j+v}\, K_{uv} + b \]
  • \(I\) :輸入圖像(如 \(8\times 8\) ); \(K\) : \(k\times k\) 的小核(如 \(3\times 3\) );
  • 輸出是特徵圖(feature map):每個位置標示「這裡有沒有核要找的特徵」;
  • 核 = 可學習的參數:反向傳播會自動調整核的數值——
\[ \boxed{\text{核不是設計的,是學出來的(edge?曲線?從資料自己長出來)}} \]
  • 一層可以有多個核 → 多張特徵圖 → 層級式特徵: 邊緣(第一層)→ 紋理(第二層)→ 部件(第三層)→ 物件。

第二條線索:參數共享的意義#

全連接:每個像素連每個隱藏單元——每個連接有自己的權重; 卷積:同一個核掃描所有位置——

\[ \text{參數量:} \underbrace{n^2 \cdot m}_{\text{全連接}} \quad\longrightarrow\quad \underbrace{k^2 \cdot m}_{\text{卷積(共享)}} \quad (n^2 = 64 \to k^2 = 9) \]

為什麼共享是對的? - 平移等變性(translation equivariance):貓在圖的左邊或右邊, 偵測「貓耳朵」的核應該是同一個:

\[ \text{conv}(T_x I, K) = T_x\, \text{conv}(I, K) \]
  • 統計的理由:一個「邊緣偵測器」在圖像的任何位置都該有用——
\[ \boxed{\text{空間共享 = 歸納偏置(inductive bias)= 用更少的資料學到更多}} \]

第三條線索:池化——平移不變的摘要#

最大池化(max pooling):把 \(2\times 2\) 小區域壓成最大值:

\[ \text{pool}(F)_{ij} = \max_{u,v \in \{0,1\}} F_{2i+u,\,2j+v} \]
  • 特徵圖:核在哪裡偵測到特徵,位置敏感;
  • 池化之後:特徵在附近哪個位置出現都算數——
\[ \boxed{\text{卷積:平移等變} \xrightarrow{\text{pooling}} \text{平移不變(invariance)}} \]
  • Hubel–Wiesel 的複雜細胞正是這個性質;手寫數字也正需要它: 每個人的「7」寫法不同、位置微移——辨識不能苛求像素級對齊。

Python:卷積前向傳播——特徵偵測#

# 8x8 圖案:十字 vs 方塊
cross = [[0]*8 for _ in range(8)]
for i in range(8):
    cross[i][3] = cross[i][4] = 1
    cross[3][i] = cross[4][i] = 1

square = [[0]*8 for _ in range(8)]
for i in range(2, 6):
    for j in range(2, 6):
        square[i][j] = 1

# 兩個 3x3 捲積核(特徵偵測器)
K = {
    "水平邊緣核": [[-1,-1,-1],[0,0,0],[1,1,1]],
    "垂直邊緣核": [[-1,0,1],[-1,0,1],[-1,0,1]],
}

def conv2d(I, Kk):
    """conv(I, K):3x3 核在 8x8 輸入上滑動(valid 卷積,步幅 1)"""
    n = len(I)
    out = [[0.0]*(n-2) for _ in range(n-2)]
    for i in range(n-2):
        for j in range(n-2):
            s = 0.0
            for u in range(3):
                for v in range(3):
                    s += I[i+u][j+v]*Kk[u][v]
            out[i][j] = s
    return out

def pool2(m):
    """2x2 最大池化:取每塊最大值 → 平移不變的粗略摘要"""
    n = len(m)
    out = [[0.0]*(n//2) for _ in range(n//2)]
    for i in range(0, n, 2):
        for j in range(0, n, 2):
            out[i//2][j//2] = max(m[i][j], m[i][j+1], m[i+1][j], m[i+1][j+1])
    return out

def show(m, title):
    print(title)
    for row in m:
        print("  " + " ".join(f"{v:4.0f}" for v in row))

print("輸入圖案:")
show(cross, "十字:")
show(square, "方塊:")

for name, Kk in K.items():
    fc = conv2d(cross, Kk)
    fs = conv2d(square, Kk)
    show(pool2(fc), f"\n十字 × {name} → 特徵圖(6x6)→ 2x2 最大池化(3x3):")
    show(pool2(fs), f"方塊 × {name} → 特徵圖(6x6)→ 2x2 最大池化(3x3):")

print("\n偵探的結論:同一組核(參數共享)掃描兩種圖案,")
print("特徵圖的數值分佈不同——十字在垂直邊緣核下上臂/下臂對稱,")
print("方塊只在頂/底兩列出現強響應;池化之後位置微移也不影響判斷。")
輸出:
輸入圖案:
十字:
     0    0    0    1    1    0    0    0
     0    0    0    1    1    0    0    0
     0    0    0    1    1    0    0    0
     1    1    1    1    1    1    1    1
     1    1    1    1    1    1    1    1
     0    0    0    1    1    0    0    0
     0    0    0    1    1    0    0    0
     0    0    0    1    1    0    0    0
方塊:
     0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0
     0    0    1    1    1    1    0    0
     0    0    1    1    1    1    0    0
     0    0    1    1    1    1    0    0
     0    0    1    1    1    1    0    0
     0    0    0    0    0    0    0    0
     0    0    0    0    0    0    0    0

十字 × 水平邊緣核 → 特徵圖(6x6)→ 2x2 最大池化(3x3):
     3    1    3
     3    1    3
     0    0    0
方塊 × 水平邊緣核 → 特徵圖(6x6)→ 2x2 最大池化(3x3):
     2    3    2
     0    0    0
    -1   -3   -1

十字 × 垂直邊緣核 → 特徵圖(6x6)→ 2x2 最大池化(3x3):
     3    3    0
     1    1    0
     3    3    0
方塊 × 垂直邊緣核 → 特徵圖(6x6)→ 2x2 最大池化(3x3):
     2    0   -1
     3    0   -3
     2    0   -1

偵探的結論:同一組核(參數共享)掃描兩種圖案,
特徵圖的數值分佈不同——十字在垂直邊緣核下上臂/下臂對稱,
方塊只在頂/底兩列出現強響應;池化之後位置微移也不影響判斷。
同一組核、兩種圖案、兩種指紋——特徵圖的數值分佈就是 卷積網路用來分辨物件的證據——LeCun 把這件事做到真實的手寫數字上。

結案 -- 後果與影響#

  • 商業落地(1989–1995):
\[ \boxed{\text{神經網路第一次大规模商業應用}} \]

1990s AT&T 支票辨識系統讀取全美10–20% 的銀行支票; 美國郵政(USPS)的 ZIP code 手寫辨識上線—— CNN 從實驗室走進每天的日常生活。 - LeNet-5 的定型(1998): LeCun 等人發表 Gradient-Based Learning Applied to Document Recognition—— LeNet-5 定型:卷積 → 池化 → 卷積 → 池化 → 全連接 → 輸出:

\[ \text{輸入 32×32} \to \text{C1 卷積} \to \text{S2 池化} \to \text{C3 卷積} \to \text{S4 池化} \to \text{FC} \to \text{10 類} \]

這是 2012 年之前所有 CNN 的原型。 - MNIST 資料集(1998): LeCun 把 NIST 的手寫數字整理成 MNIST——

\[ \text{60,000 訓練 + 10,000 測試張手寫數字圖像} \]

機器學習界的「果蠅」——此後二十年,幾乎每個新演算法都在 MNIST 上驗明正身。 - AlexNet 的爆發(2012): 1990 年代 SVM 等方法一度讓 CNN 失寵;LeCun 持續堅持:

\[ \text{LeNet-5(1998)} \xrightarrow{\text{GPU + 大數據 + ReLU}} \text{AlexNet(2012)} \]

2012 年 AlexNet 用更深的卷積網路橫掃 ImageNet(見 2012-亞歷克斯AlexNet.md)—— 深度學習革命正式點火,CNN 成為電腦視覺的標準配備。 - 2018 圖靈獎: LeCun 與 Hinton、Bengio 同獲 2018 年圖靈獎—— 表揚「深度學習的概念與工程突破」(見 ../資訊科學/2018-深度學習三巨頭.md)。

\[ \text{貝爾實驗室的卷積(1989)} \xrightarrow{30\text{ 年}} \text{資訊科學的聖杯}. \]
  • 歷史定位:卷積網路是機器的視覺皮層—— 從 1989 年的支票辨識,到今天的自駕車、臉部辨識、醫學影像, 機器「看」世界的方式都是同一個:
\[ \text{掃描(卷積)} + \text{摘要(池化)} + \text{層級(深度)} = \text{視覺的一切}. \]

關鍵人物與文獻#

  • Y. LeCun(楊立昆):Backpropagation Applied to Handwritten Zip Code Recognition(1989);Gradient-Based Learning Applied to Document Recognition(LeNet-5, 1998);2018 圖靈獎。
  • K. Fukushima:Neocognitron(1980)——卷積結構的先驅(LeCun 自承的啟發)。
  • D. Hubel、T. Wiesel:視覺皮層的簡單/複雜細胞(1959–1962,1981 諾貝爾獎)——CNN 的神經科學原型。
  • D. E. Rumelhart、G. E. Hinton:反向傳播(1986)——CNN 的訓練引擎。
  • A. Krizhevsky、I. Sutskever、G. E. Hinton:AlexNet(2012)——CNN 的革命爆發。
  • 相關案件:1986-反向傳播復興.md、1980-福島新認知機.md、2012-亞歷克斯AlexNet.md、../資訊科學/2018-深度學習三巨頭.md、../資訊科學/1936-圖靈機.md。