卷積神經網絡 (Convolutional Neural Networks, CNN)

卷積神經網絡 (Convolutional Neural Network,CNN) 是一種專門用於處理網格狀數據(如影像、音訊、時間序列)的前饋神經網絡。本筆記聚焦於 CNN 的基本原理與關鍵組件,並附帶 TensorFlow/Keras 實作範例。
CNN 基本原理與架構
CNN 的核心設計靈感來自生物視覺皮層,透過局部連接和權重共享機制,有效提取輸入數據的空間層次特徵。典型 CNN 架構包含卷積層、池化層與全連接層。
CNN 基本原理
卷積層 (Convolution Layer)
卷積層是 CNN 的核心,負責從輸入數據中提取局部特徵,當卷積層接收圖片時,圖片可以用張量表示。例如,(5 × 2 × 3) 代表一張5 × 2張量、有 3 個通道(例如 RGB 三個顏色通道)的圖片。

卷積核(Kernel / Filter)
是小型矩陣,用來檢測圖片的特徵,例如邊緣或紋理。它會在圖片上滑動(進行卷積運算),並產生 特徵圖(Feature Map),這個卷積核的大小定義皆為開法者設計。
特徵圖 (Feature Map)
卷積核滑動計算後輸出的結果,每個特徵圖對應一個卷積核所檢測到的特徵模式。
步幅(Stride)
指的是卷積核每次滑動的距離,越大的步幅會讓輸出圖變小,但計算更快,較小的步幅則能保留更多細節。
填充 (Padding)
在輸入特徵圖邊緣添加零值,以控制輸出尺寸。常見有 "valid"(不填充)和 "same"(填充以保持尺寸不變)。
激活函數 (Activation Function)
在CNN中不管是在卷積層,或是全連接層,都有不同的函數可以處理不同問題,例如ReLU函數可以讓神經網絡能夠學習複雜的模式,解決梯度消失問題,使模型能夠學習更深層的特徵。
非線性激活函數(ReLU)
ReLU 函數將負數輸出為零,正數保持不變,即保留正數,讓模型能夠學習到更複雜的特徵,解決梯度消失問題。

池化層 (Pooling Layer)
池化層的作用是 降低特徵圖的維度,減少計算量並提升模型的泛化能力。也有專案選擇不加池化層,以保留更多資訊特徵,取決於開發考量。
最大池化(Max Pooling)
最大池化選擇範圍內的最大值,以保留最重要的特徵,可以想像找出圖片最顯眼的特徵表現。
平均池化(Average Pooling)
平均池化則計算範圍內數值的平均值,例如圖片的色塊柔邊處理,適用於某些需要平滑處理的情境。
全連接層 (Fully Connected Layer)
在卷積神經網路中,全連接層負責將經過多次卷積與池化操作提取的空間特徵轉換為最終的分類或回歸輸出

輸入層(Input Layer)
在特徵進入全連接層之前,必須將三維的特徵圖(高度 × 寬度 × 通道數)轉換為一維向量。這一過程稱為展平 (Flatten) ,因此輸入層也是展平層 (Flatten Layer),是連接卷積層與全連接層的必要步驟。
例如,一個尺寸為 7×7×64(如高度 × 寬度 × 通道數) 的特徵圖經過展平後,會變成一個長度為 7×7×64 = 3136 的一維向量。
隱藏層(Hidden Layers)

隱藏層由多個神經元(節點)組成,每個神經元與前一層的所有節點相連,形成全連接結構。這種密集連接允許網路學習輸入特徵之間複雜的非線性關係。
每個神經元的輸出計算表示為
- W 為權重矩陣 (設計權重矩陣大小)
- f(x) 為激活函數(如 Sigmoid、Softmax)
- X 為輸入矩陣 (如 Flatten特徵向量所輸入)
- b 為偏置項 (調整參數)
- y 為輸出結果 (使用函數來分類)
多層隱藏層的堆疊能讓網路學習更加抽象的高階特徵,增強模型的表達能力。
輸出層(Output Layer)

輸出層是最後一層全連接層,其神經元數量通常對應任務的類別數(分類)或輸出維度(回歸)。輸出層的激活函數選擇取決於具體任務
多分類問題 (Multi-class Classification)
使用 Softmax 函數,將神經元的原始輸出(logits)轉換為各類別的概率分佈
其中 為類別總數, 表示樣本屬於第 類的預測概率,所有 之和為 1。結果
二元分類問題 (Binary Classification)
使用 Sigmoid 函數,將單個神經元的輸出壓縮到 (0, 1) 區間,表示為正類的概率
前向傳播(Forward Propagation)
前向傳播指的是從輸入層→隱藏層→輸出層的一個流程,最終得到預測輸出的完整流程,每一層的輸出都是下一層的輸入。
損失函數 (Loss Function)
損失函數也稱為成本函數,用於量化模型預測值 與真實標籤 之間的差距。在訓練過程中,損失值隨每個訓練週期(Epoch)記錄,是評估模型當前性能、引導參數優化的關鍵指標。
在Tensorflow模型每次(Epoch )訓練階段完成時可以看到損失函數,透過觀察損失函數變化,顯示模型當前的訓練狀況,損失函數每次結果越小則模型表現越佳。
Epoch 1/10
240/240 - 52s - loss: 0.5044 - accuracy: 0.8526 - val_loss: 0.1444 - val_accuracy: 0.9571 - 52s/epoch - 217ms/step
根據任務類型,常見的損失函數包括:
-
交叉熵損失 (Cross-Entropy Loss):分類任務的標準選擇,衡量預測概率分佈與真實分佈的差異。
-
均方誤差 (Mean Squared Error, MSE):回歸任務常用,計算預測值與真實值之差的平方的平均。
-
平均絕對誤差 (Mean Absolute Error, MAE):另一種回歸損失,對異常值較不敏感。
反向傳播與梯度優化 (Backpropagation & Optimization)
前向傳播得到預測和損失後,反向傳播過程啟動。其核心是利用鏈式法則,從輸出層開始,反向計算損失函數對網路中每一個參數(權重 和偏置 )的梯度。
梯度 (Gradient)
梯度表示成
梯度 (Gradient) 是一個向量,其每個分量是損失函數對應某個參數的偏導數 。它指出了在當前參數點上,損失函數最陡峭的上升方向。在優化中,我們需要沿著梯度的反方向(下降方向)更新參數。
以及一個梯度的例子

梯度下降(Gradient Descent)
是損失函數對參數的偏導數,目標是最小化損失函數(Cost Function),或預測值與真實值之間的誤差,讓模型的預測結果更接近真實值。
其中:
- 是當前的權重參數
- 是學習率(learning rate)
- L() 是損失函數對權重的梯度,表示當前權重對損失的影響

優化器 (Optimizer)
原始的梯度下降法存在收斂慢、易震盪等問題。實務中常使用更先進的優化器,例如:
-
隨機梯度下降 (SGD):每次使用一個批次 (Batch) 的數據計算梯度,速度更快並引入噪聲有助逃離局部最優。
-
Adam:結合了動量 (Momentum) 和自適應學習率的優點,是目前最常用的優化器之一。
-
RMSprop:自適應調整每個參數的學習率。
這些優化器在 TensorFlow/Keras 中可以通過 model.compile<span class="paren">(optimizer='adam')</span> 直接使用函數方法
訓練過程中常見問題
局部最小值和鞍點 ( Local minima and saddle points )
為了要達到模型最佳化,要解決凸點最佳化問題 (Convex optimization problems),目標是找到全局最小值 (global minimum),而不要被困在區域最小值 (local minimum)
梯度消失(Vanishing Gradient)
隨著神經網路的層層運算,某些層的梯度可能會越來越小,導致學習效果緩慢或停止,套用模擬神經元的設計構想,當部分權重參數趨近於零,為了解決這個問題使梯度從原本的線性問題調整為非線性問題。
解決方法:
-
使用 ReLU 及其變體(如 Leaky ReLU)作為激活函數,其導數在正區間恆為1,能有效緩解梯度消失。
-
使用批次正規化 (Batch Normalization),穩定層的輸入分佈,也能在某種程度上改善梯度流。
梯度爆炸 (Exploding gradients)
梯度逐漸變大,可能導致權重更新過大,模型不穩定,解決這部分問題則稱為降維(dimensionality reduction)。
訓練過程中的挑戰與緩解
局部最小值與鞍點
在高維非凸的損失函數曲面中,存在許多局部最小值 (Local Minima) 和鞍點 (Saddle Points)。優化算法可能被困在其中,無法到達更好的全局最小值 (Global Minimum)。

處理方法:
-
使用隨機梯度下降或其變體,批次更新引入的隨機性有助於跳出局部最優。
-
使用動量 (Momentum) 技術,使更新方向不僅考慮當前梯度,還累積歷史梯度,幫助衝過平坦的鞍點區域。
梯度消失 (Vanishing Gradient)
在深層網路中,梯度在反向傳播時可能因連續乘以小於1的數(例如來自 Sigmoid 函數的導數)而指數級縮小。這導致淺層網路的參數幾乎得不到有效更新,學習停滯。
解決方法:
-
使用 ReLU 及其變體(如 Leaky ReLU)作為激活函數,其導數在正區間恆為1,能有效緩解梯度消失。
-
採用殘差連接 (Residual Connections),如 ResNet 中的跳躍連接,讓梯度可以直接向後傳播。
-
使用批次正規化 (Batch Normalization),穩定層的輸入分佈,也能在某種程度上改善梯度流。
梯度爆炸 (Exploding Gradient)
與梯度消失相反,梯度可能因連續乘以大於1的數而指數級增大。這導致參數更新過大,模型變得極不穩定,損失值劇烈震盪甚至變成 NaN。
解決方法:
-
梯度裁剪 (Gradient Clipping):設定一個閾值,當梯度的範數超過該值時,將其等比例縮放。
-
謹慎的權重初始化(如 Xavier 或 He 初始化)。
-
同樣可以通過批次正規化來穩定訓練。
過擬合 (Overfitting)
當模型過於複雜或訓練數據不足時,模型可能完美擬合訓練集(訓練損失低),但在未見過的驗證集或測試集上表現不佳(驗證損失高)。
緩解策略:
-
在全連接層中使用 Dropout:在訓練時隨機“丟棄”(設為零)一部分神經元的輸出,防止神經元之間產生過強的依賴。
-
權重正則化:在損失函數中添加 L1 或 L2 正則化項,懲罰過大的權重值,鼓勵模型更簡單。
-
資料增強 (Data Augmentation):對訓練圖像進行隨機旋轉、翻轉、縮放等變換,人工增加訓練數據的多樣性。
-
Early Stopping:監控驗證集損失,當其不再下降時提前停止訓練。
參考文獻
Vector Calculus: Understanding the Gradient(n.d.). Better Explained. https://betterexplained.com/articles/vector-calculus-understanding-the-gradient/
3Blue1Brown: But what is a neural network?
What Is Gradient Descent? (n.d.). IBM. https://www.ibm.com/think/topics/gradient-descent
What is learning rate in machine learning?(n.d.). IBM. https://www.ibm.com/think/topics/learning-rate
An overview of gradient descent optimization algorithms(n.d.). ruder.io. https://www.ruder.io/optimizing-gradient-descent/

