← M04 深度學習 M04 深度學習

M04.03|CNN 卷積神經網路:讓 AI 學會看圖

CNN 不是一次看整張圖 — 它像用放大鏡一小塊一小塊地掃描

L1-AI基礎知識-CNN基礎 L2-AI技術應用-影像處理模型
CNN 卷積神經網路 影像辨識 深度學習 電腦視覺
📋

本講學習重點

卷積運算和全連接層有什麼本質差異?
濾波器(卷積核)學到的是什麼?
最大池化層的作用是什麼?
CNN 的特徵階層是怎麼從低階到高階的?
ResNet 的殘差連接解決了什麼問題?

卷積運算(Convolution): - 一個小的濾波器(如 3×3 或 5×5)在輸入圖片上滑動(sliding window) - 每次滑動到一個位置,就把濾波器和對應的圖片區域做內積(element-wise 相乘再求和) - 輸出一張「特徵圖(Feature Map)」,標示濾波器響應的強度位置 - 相比全連接層,卷積層具有平移不變性和局部連接性,大幅減少參數量 濾波器(Filter / Kernel): - 卷積層包含多個濾波器,每個濾波器負責偵測一種視覺特徵 - 低層濾波器:邊緣、顏色梯度、紋理 - 高層濾波器:眼睛、鼻子、車輪等語意結構 池化層(Pooling Layer): - 最大池化(Max Pooling):在一個區域內取最大值 - 作用:降低特徵圖的空間維度(壓縮資訊)、增強位置的不變性 - 常見配置:2×2 最大池化,步幅 2,讓特徵圖縮小為原來的 1/4 特徵階層(Feature Hierarchy): 低層(淺層)→ 邊緣、顏色 中層 → 紋理、形狀組合 高層(深層)→ 物體部件、語意概念 經典架構簡介: - LeNet(1998):首個實用 CNN,用於手寫數字辨識,5 層 - AlexNet(2012):Deep Learning 復興的里程碑,引入 ReLU 和 Dropout,8 層 - ResNet(2015):殘差連接解決梯度消失,讓 100+ 層網路成為可能

📌 CNN 的核心思想是用「局部感受野 + 參數共享」取代全連接,讓網路高效處理圖片資料。 卷積層學習視覺特徵,池化層壓縮空間資訊,多層堆疊形成從低階到高階的特徵階層。 LeNet 開創 CNN 先河,AlexNet 引爆深度學習復興,ResNet 突破深度限制。 台灣半導體業已廣泛採用 CNN 進行晶圓缺陷偵測,大幅提升良率與檢測效率。
CNN 卷積神經網路:讓 AI 學會看圖

🎙️ Podcast(中文)

0:00 / 0:00

一句話搞懂

CNN(卷積神經網路)用一個個小的「濾波器」在圖片上滑動掃描,每個濾波器負責偵測一種視覺特徵(邊緣、紋理、形狀),多層疊加後從簡單到複雜地學出高階語意特徵,讓 AI 能辨識圖片中的物件,而不需要人工設計「辨識眼睛要看哪些像素」的規則。


白話解說

為什麼普通神經網路無法處理圖片

想像你要辨識一張 256×256 的彩色(RGB)圖片。這張圖片實際上是一個 256×256×3 = 196,608 個數值的矩陣(每個像素有紅、綠、藍三個值)。

如果用普通的全連接神經網路(所有神經元之間全部相連),第一個隱藏層若有 1,000 個神經元,光這一層就需要 196,608 × 1,000 = 1.97 億個權重。一張圖片就需要 1.97 億個參數,這還只是第一層,後面還有更多層。這帶來兩個致命問題:

  1. 參數量爆炸:記憶體不夠存,訓練資料不夠學
  2. 無法利用圖片的空間結構:全連接層把每個像素都當作獨立特徵,完全忽略了「相鄰像素之間有關聯」這個圖片最基本的性質——一隻眼睛是由幾千個相鄰像素共同構成的,不是幾千個隨機分散的獨立點

CNN 正是為了解決這兩個問題而設計的。


卷積運算:用放大鏡掃描圖片

卷積(Convolution)的核心概念是:不要一次看整張圖,而是用一個小的「濾波器(Filter / Kernel)」在圖片上滑動,每次只看一個小區域

一個 3×3 的濾波器長什麼樣子?

濾波器是一個小矩陣,裡面的數字是通過訓練學習得到的(訓練前隨機初始化):

濾波器(偵測垂直邊緣的範例):
┌─────────────────┐
│  1   0  -1     │
│  2   0  -2     │
│  1   0  -1     │
└─────────────────┘

卷積運算的過程:

把這個 3×3 的濾波器放在圖片的左上角,和圖片對應的 3×3 區域做「內積」:

圖片區域(部分):           濾波器:
┌──────────────────┐       ┌─────────────────┐
│ 50   52   80    │       │  1   0  -1      │
│ 55   54   85    │   ×   │  2   0  -2      │
│ 48   50   82    │       │  1   0  -1      │
└──────────────────┘       └─────────────────┘

計算:
(50×1 + 52×0 + 80×(-1))
+ (55×2 + 54×0 + 85×(-2))
+ (48×1 + 50×0 + 82×(-1))
= (50 + 0 - 80) + (110 + 0 - 170) + (48 + 0 - 82)
= -30 + (-60) + (-34)
= -124  ← 輸出特徵圖在這個位置的值

然後把濾波器向右移動一格,對下一個 3×3 區域重複同樣的計算……一直滑動到整張圖片都掃描完為止。最終輸出的就是一張特徵圖(Feature Map),記錄了這個濾波器在圖片每個位置的「響應強度」。

如果這個濾波器偵測的是「垂直邊緣」,那麼特徵圖上數值很大的位置,就是圖片中存在垂直邊緣的地方。

關鍵洞察——參數共享(Parameter Sharing)

同一個濾波器的 9 個數字,被用來掃描整張圖片的每一個位置。一個 3×3 的濾波器只有 9 個參數,卻能處理整張 256×256 的圖片。相比全連接層的 1.97 億個參數,卷積層大幅縮減了參數量,同時讓網路學到的特徵具有平移不變性——不管一條垂直線出現在圖片的左上角還是右下角,同一個濾波器都能偵測到它。

一個卷積層通常包含多個濾波器(如 64 個或 128 個),每個濾波器負責偵測不同的視覺模式,輸出多張特徵圖,堆疊在一起形成「多通道特徵圖」。


池化層:壓縮資訊,保留重要特徵

卷積層輸出的特徵圖依然很大(例如一張 256×256 的圖片,用 3×3 濾波器卷積後輸出 254×254 的特徵圖)。池化層(Pooling Layer)的作用是對特徵圖進行降維壓縮,保留最重要的資訊,同時縮小後續層的計算量。

最大池化(Max Pooling) 是最常見的做法:

把特徵圖切分成不重疊的小區域(通常是 2×2),在每個小區域中只取最大值,丟棄其餘三個值:

卷積後的特徵圖(部分,4×4):
┌────────────────────────────┐
│  3   7  │  2   5          │
│  1   4  │  8   6          │  2×2 最大池化
├─────────┼─────────────────┤  ──────────────────→
│  9   2  │  1   3          │
│  6   8  │  4   7          │
└────────────────────────────┘

池化後的特徵圖(2×2):
┌────────────┐
│  7  │  8  │
├─────┼──────┤
│  9  │  7  │
└────────────┘

面積縮小為原來的 1/4(寬和高各縮小一半)。

池化層的兩個作用:

  1. 降低計算量:特徵圖縮小,後續層的計算量成比例減少
  2. 增加平移不變性:如果某個特徵向左或向右移動了 1 個像素,最大池化後的輸出往往不變,讓網路對物件的精確位置不那麼敏感

特徵階層:從像素到語意

CNN 最強大的特性是隨著網路深度增加,學到的特徵從低階到高階,從簡單到複雜

這個「特徵階層(Feature Hierarchy)」是 CNN 在影像辨識上大幅優於傳統方法的根本原因:

輸入圖片(原始像素)
    ↓
第一個卷積層:學習「低階特徵」
    → 邊緣(水平邊、垂直邊、45 度斜邊)
    → 顏色梯度
    → 點、端點
    ↓
第二個卷積層:學習「中階特徵」(由低階特徵組合而成)
    → 角落、交叉點
    → 特定紋理(格紋、條紋)
    → 簡單形狀(圓弧、線段組合)
    ↓
第三個卷積層:學習「高階特徵」
    → 眼睛、鼻子的形狀
    → 輪子、車窗的結構
    → 特定物體的局部外觀
    ↓
全連接層:整合高階特徵,輸出分類結果
    → 「這是一隻貓」/ 「這是一輛車」

這個特徵階層不是人工設計的——是網路在大量圖片的訓練中自動學到的。2013 年,MIT 的研究人員用 Zeiler & Fergus 的方法視覺化 AlexNet 不同層學到的特徵,第一次讓人們「看見」CNN 在想什麼,證實了這個特徵階層的確存在,不是理論推測。


經典架構簡介

LeNet(1989/1998):CNN 的先祖

由 Yann LeCun 設計,最初用於辨識手寫數字(MNIST 資料集,60,000 張 28×28 的手寫 0~9 圖片)。

架構:卷積層 → 池化層 → 卷積層 → 池化層 → 全連接層 × 2(總共 5 層)

歷史意義:LeNet 在 1990 年代被美國銀行大規模用於支票上手寫數字的自動辨識,是最早真正商業化的深度學習應用。但受限於當時的計算能力,LeNet 只能處理小圖片(28×28),無法擴展到更複雜的場景。

AlexNet(2012):深度學習的復興宣言

由 Krizhevsky、Sutskever 和 Hinton 在 2012 年的 ImageNet 競賽(ILSVRC)中提出,以 15.3% 的 Top-5 錯誤率大幅領先第二名的 26.2%,震驚整個電腦視覺界。

主要創新

  • ReLU 激活函數:解決了深層網路的梯度消失問題,使 8 層以上的訓練成為可能
  • Dropout:隨機讓部分神經元失效,有效緩解過擬合
  • GPU 訓練:第一個大規模在 GPU 上訓練的 CNN,比 CPU 快 40 倍
  • 資料增強(Data Augmentation):翻轉、裁切、色彩調整,人工擴充訓練資料

歷史意義:AlexNet 標誌著深度學習在電腦視覺的全面勝利,之後幾年 ImageNet 競賽幾乎完全由深度學習方法包辦,傳統手工特徵方法(SIFT、HOG)被迅速淘汰。

ResNet(2015):突破深度的殘差革命

微軟亞洲研究院的何愷明(Kaiming He)提出,在 2015 年 ImageNet 競賽中以 3.57% 的 Top-5 錯誤率(低於人類的 5.1%)刷新紀錄,首次在影像分類任務上超越人類。

核心問題:為什麼不能直接疊更多層?

理論上,網路越深應該能學到越複雜的特徵。但實驗發現,超過 20 層後,深層網路的訓練準確率反而比淺層網路更低。原因是梯度在 20+ 層的反向傳播中逐漸消失,前面的層根本得不到有效的學習訊號。

殘差連接(Residual Connection)的解決方法

在每個「殘差塊(Residual Block)」中,加入一條「捷徑(Shortcut)」,直接把輸入跳過幾層連接到輸出:

正常的深層網路:

輸入 x → [卷積層] → [激活] → [卷積層] → 輸出 F(x)

ResNet 的殘差塊:

輸入 x ─────────────────────────────── x(捷徑)
         ↓                              ↓
         [卷積層] → [激活] → [卷積層]    +
                                        ↓
                             輸出 F(x) + x

這條捷徑讓梯度可以「跳過」中間層直接傳回去,解決了梯度消失問題,使得訓練 50 層、101 層、甚至 152 層的網路成為可能。

影響:ResNet 的殘差連接思想至今仍是幾乎所有現代深度學習架構(包括 Transformer)的標配設計。

架構 年份 層數 Top-5 錯誤率 主要創新
LeNet 1998 5 - CNN 基礎結構,手寫辨識
AlexNet 2012 8 15.3% ReLU、Dropout、GPU 訓練
VGGNet 2014 16/19 7.3% 小卷積核(3×3)深堆疊
GoogLeNet 2014 22 6.7% Inception 模組,多尺度並行卷積
ResNet 2015 152 3.57% 殘差連接,超越人類
DenseNet 2016 201 3.46% 每層連接所有前面層

應用場景

台灣半導體業的晶圓缺陷偵測

台灣半導體產業佔全球晶圓代工市場超過 60%,晶圓生產的良率(Yield Rate)直接決定生產成本。傳統的晶圓缺陷檢測依賴人工目視或規則式光學影像處理,速度慢且容易遺漏細微缺陷。

台積電、聯電等公司已大規模導入 CNN 進行自動化缺陷偵測,作法如下:

任務設定

  • 輸入:自動光學檢測機台(AOI, Automated Optical Inspection)拍攝的高解析度晶圓影像
  • 輸出:缺陷位置標定(目標偵測)+ 缺陷類型分類(如粒子污染、刮傷、蝕刻異常、光阻殘留)

CNN 架構選擇:通常基於 ResNet 或 EfficientNet 的骨幹網路,搭配目標偵測頭(如 Faster R-CNN 或 YOLO),進行端對端的缺陷定位與分類。

訓練資料策略

  • 缺陷樣本本來就稀少(良率 99%+ 時,缺陷圖片遠少於正常圖片)
  • 解法:資料增強(旋轉、翻轉、亮度調整)+ 合成缺陷生成(用 GAN 產生人造缺陷圖片增加訓練樣本)

業務效益(以某 12 吋廠為例)

指標 傳統方式 CNN 自動偵測 改善幅度
缺陷偵測速度 每片晶圓約 20 分鐘人工審查 每片晶圓約 3 秒 400 倍提速
偵測準確率 ~85%(熟練工人) ~98% +13 個百分點
缺陷分類類型 5~8 種(人眼辨識上限) 30+ 種 分類粒度大幅提升
良率提升 基線 +0.3~0.8 個百分點 每年節省億元以上成本

半導體缺陷偵測是 CNN 在工業視覺(Industrial Vision)領域最具代表性的台灣應用,展示了 CNN 在高精度、高速度、規模化影像分析場景的核心優勢。


常見誤區

誤區一:CNN 的「卷積」就是把圖片模糊化(像 Photoshop 的模糊濾鏡)

初學者聽到「濾波器」這個詞,常聯想到圖片處理軟體的模糊、銳化等效果。確實,Sobel 邊緣偵測、高斯模糊等傳統影像處理都是卷積運算的一種形式——但那些濾波器是人工設計的固定數值。CNN 的根本差異在於:它的濾波器數值是通過訓練資料學習出來的,不是人工設計的。訓練前,濾波器是隨機初始化的數字;訓練後,每個濾波器自動學到「對這個任務有用的特徵偵測器」。CNN 會用模糊類的濾波器嗎?會——如果任務需要的話,訓練過程會自動學到。但它同樣會學到人工難以設計的複雜特徵偵測器。

誤區二:池化層一定會讓準確率下降,所以應該避免使用

直覺上,池化丟棄了資訊(4 個值只保留 1 個),好像一定會讓模型表現更差。但這個直覺只看到了一面。池化帶來兩個實際好處:一是大幅減少後續層的計算量(2×2 最大池化讓特徵圖縮小 75%),讓網路能夠在有限計算資源內堆疊更多卷積層,而更深的網路能學到更高階的特徵;二是增加了對物件位置的容忍性,讓模型更容易泛化到新圖片。現代架構(如 ResNet)有時用步幅卷積(Strided Convolution)取代池化層,效果相近,但傳統池化層的作用並不是單純的「資訊損失」。

誤區三:CNN 只能用來辨識圖片,和其他 AI 任務無關

CNN 最廣為人知的應用是影像辨識(Image Classification),但它的適用範圍遠不止於此。凡是資料具有「局部空間結構」的場景,CNN 都有潛在的應用價值:一維卷積(1D-CNN)被用在時序訊號分析(心電圖異常偵測、製造業振動感測器的故障診斷);二維卷積被用在醫學影像分析(CT 掃描腫瘤偵測)、文件版面分析、衛星遙測影像分析;甚至在自然語言處理(NLP)的早期,TextCNN 用卷積在文字上滑動偵測 n-gram 模式,在情感分析上取得不錯的結果(後來被 Transformer 超越)。理解 CNN 的核心原理(局部連接 + 參數共享 + 特徵階層),比死記「CNN 是圖片用的」更重要。


小練習

練習一:理解卷積運算的輸出大小

一張輸入圖片尺寸為 32×32,使用一個 5×5 的卷積核,步幅(Stride)為 1,不填充邊界(Padding = 0)。

(1) 卷積後輸出的特徵圖尺寸是多少? (2) 如果改用步幅 2,輸出特徵圖的尺寸是多少? (3) 這一層卷積核共有多少個可學習的參數(假設只有 1 個濾波器,輸入是單通道灰階圖)?

計算公式提示:輸出大小 = ⌊(輸入大小 - 卷積核大小) / 步幅⌋ + 1

看解答 **第 (1) 題:步幅 1,無填充** 使用公式:輸出大小 = (輸入大小 - 卷積核大小) / 步幅 + 1 ``` 輸出大小 = (32 - 5) / 1 + 1 = 27 / 1 + 1 = 28 ``` 輸出特徵圖尺寸:**28 × 28** **第 (2) 題:步幅 2,無填充** ``` 輸出大小 = ⌊(32 - 5) / 2⌋ + 1 = ⌊27 / 2⌋ + 1 = 13 + 1 = 14 ``` 輸出特徵圖尺寸:**14 × 14** 步幅增大讓輸出特徵圖大幅縮小,效果類似池化。現代網路有時用大步幅卷積取代池化層。 **第 (3) 題:可學習的參數數量** 一個 5×5 的卷積核在單通道(灰階)圖片上,有: ``` 5 × 5 = 25 個權重(卷積核的 25 個數值) + 1 個偏差值(每個濾波器有一個偏差值) = 26 個可學習的參數 ``` 相比之下,若用全連接層把 32×32=1,024 個像素連接到 28×28=784 個輸出神經元,需要 1,024 × 784 = **802,816 個參數**! 卷積層只用 26 個參數完成了全連接層需要 80 萬個參數才能完成的計算(雖然計算能力不完全等價),這正是 CNN 參數效率高的核心體現——**參數共享**使得同一個濾波器的 26 個數字被複用於圖片的每個位置。

練習二:CNN 架構設計判斷

以下是一個用於辨識台灣公路交通號誌(共 30 種不同號誌類別)的 CNN 架構設計,請找出其中的問題並提出修改建議:

原始設計:

層別 設定 輸出尺寸
輸入 64×64 彩色圖片(RGB) 64×64×3
卷積層 1 32 個 3×3 濾波器,步幅 1,Sigmoid 激活 62×62×32
最大池化 1 2×2,步幅 2 31×31×32
卷積層 2 64 個 3×3 濾波器,步幅 1,Sigmoid 激活 29×29×64
最大池化 2 2×2,步幅 2 14×14×64
全連接層 128 個神經元,ReLU 激活 128
輸出層 10 個神經元,Softmax 激活 10

請找出至少兩個設計問題,並說明應如何修改。

看解答 **問題一:卷積層使用 Sigmoid 激活函數(應改為 ReLU)** 如 M04-01 所說,Sigmoid 在深度網路隱藏層中有梯度消失問題——越靠近輸入層的卷積層,接收到的梯度越微弱,幾乎學不到有效特徵。現代 CNN 的隱藏層(包括卷積層)幾乎全面使用 ReLU 或其變種(Leaky ReLU、ELU)。 **修改**:卷積層 1 和卷積層 2 的激活函數改為 **ReLU**。 **問題二:輸出層神經元數量與任務不符(10 個神經元,但有 30 種號誌)** 任務是辨識 30 種交通號誌(30 類分類),但輸出層只設計了 10 個神經元。多分類任務的輸出層神經元數量必須等於類別數量,每個神經元輸出屬於該類別的機率,再由 Softmax 確保 30 個輸出機率加總為 1。 **修改**:輸出層改為 **30 個神經元,Softmax 激活**。 **補充問題(加分):最大池化後輸出尺寸計算不精確** 最大池化層 1 的輸入是 62×62,用 2×2 步幅 2: ⌊62/2⌋ = 31,輸出確實是 31×31(無法整除時的邊緣可能被截去,依實作而異)。 卷積層 2 的輸入是 31×31,用 3×3 卷積步幅 1: (31 - 3) / 1 + 1 = 29,輸出 29×29(正確)。 最大池化層 2 的輸入是 29×29,用 2×2 步幅 2: ⌊29/2⌋ = 14,輸出 14×14(正確,最後一行/列被截去)。 **修正後的正確設計:** | 層別 | 設定 | 輸出尺寸 | |------|------|---------| | 輸入 | 64×64 彩色圖片(RGB)| 64×64×3 | | 卷積層 1 | 32 個 3×3 濾波器,步幅 1,**ReLU** 激活 | 62×62×32 | | 最大池化 1 | 2×2,步幅 2 | 31×31×32 | | 卷積層 2 | 64 個 3×3 濾波器,步幅 1,**ReLU** 激活 | 29×29×64 | | 最大池化 2 | 2×2,步幅 2 | 14×14×64 | | 全連接層 | 128 個神經元,ReLU 激活 | 128 | | 輸出層 | **30 個神經元**,Softmax 激活 | **30** |

關鍵字自我檢核

✅ 卷積運算 ✅ 滑動視窗 ✅ 濾波器 ✅ 卷積核 ✅ 池化層 ✅ 特徵圖 ✅ 特徵階層 ✅ LeNet ✅ AlexNet ✅ ResNet ✅ 殘差連接