M04.03|CNN 卷積神經網路:讓 AI 學會看圖
CNN 不是一次看整張圖 — 它像用放大鏡一小塊一小塊地掃描
本講學習重點
卷積運算(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+ 層網路成為可能
🎙️ Podcast(中文)
一句話搞懂
CNN(卷積神經網路)用一個個小的「濾波器」在圖片上滑動掃描,每個濾波器負責偵測一種視覺特徵(邊緣、紋理、形狀),多層疊加後從簡單到複雜地學出高階語意特徵,讓 AI 能辨識圖片中的物件,而不需要人工設計「辨識眼睛要看哪些像素」的規則。
白話解說
為什麼普通神經網路無法處理圖片
想像你要辨識一張 256×256 的彩色(RGB)圖片。這張圖片實際上是一個 256×256×3 = 196,608 個數值的矩陣(每個像素有紅、綠、藍三個值)。
如果用普通的全連接神經網路(所有神經元之間全部相連),第一個隱藏層若有 1,000 個神經元,光這一層就需要 196,608 × 1,000 = 1.97 億個權重。一張圖片就需要 1.97 億個參數,這還只是第一層,後面還有更多層。這帶來兩個致命問題:
- 參數量爆炸:記憶體不夠存,訓練資料不夠學
- 無法利用圖片的空間結構:全連接層把每個像素都當作獨立特徵,完全忽略了「相鄰像素之間有關聯」這個圖片最基本的性質——一隻眼睛是由幾千個相鄰像素共同構成的,不是幾千個隨機分散的獨立點
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 個像素,最大池化後的輸出往往不變,讓網路對物件的精確位置不那麼敏感
特徵階層:從像素到語意
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 |
請找出至少兩個設計問題,並說明應如何修改。