深度學習 (Deep Learning) 是一種基於人工神經網絡的機器學習技術,旨在從大量數據中學習抽象特徵表示。其核心是通過多層非線性轉換(即「深度」結構)來自動提取數據的高層特徵,從而實現複雜任務(如圖像識別、自然語言處理)。
深度學習的核心概念:
- 神經網絡:由神經元組成的數學模型,模仿生物神經網絡的信息處理方式。
- 多層結構:包括輸入層、隱藏層(多層)、輸出層,隱藏層越多,模型表達能力越強。
- 自動特徵提取:通過訓練,模型能自動從數據中學習相關特徵,而不需要人工設計。
- 大規模數據和算力:深度學習的成功依賴於大量標記數據和強大的計算資源(如 GPU)。
# 可使用目錄功能快速確認要閱覽的主題
快速比較 DNN、CNN 與 RNN
CNN 和 RNN 都基於 DNN 的全連接層設計進行改進,但更針對特定數據類型(空間數據和序列數據)進行優化:
- CNN 保留 DNN 的非線性特徵學習能力,但加入卷積層以降低參數數量並專注於空間結構。
- RNN 保留 DNN 的多層結構特性,但加入循環結構以建模時間依賴性。
兩者都是 DNN 的進化版本,針對特定問題進行優化,解決了 DNN 在特定領域的不足。
CNN 和 RNN 對 DNN 進行的改進,專注於特定數據結構的優化設計。這些模型的成功表明,深度學習並非僅僅依賴「深」,而是需要針對具體問題設計合適的架構。
DNN 深度神經網絡(Deep Neural Network)
定義
DNN 是一種具有多層結構的人工神經網絡(ANN),通常包含輸入層、多個隱藏層 和輸出層。其目的是通過多層非線性轉換,自動提取數據的特徵,並用於分類、迴歸等任務。
簡單來說,DNN 是對基本神經網絡(FNN)的擴展,增加了隱藏層的數量,從而能處理更複雜的問題。
常見應用場景
- 分類任務
- 客戶流失預測(Churn Prediction)。
- 醫療診斷(例如是否患有某種疾病)。
- 迴歸任務
- 多輸出問題
- 預測同時影響多個變數的情境(例如廣告效果的多維評估)。
基本結構
- 輸入層(Input Layer)
- 負責接收原始數據特徵。
- 每個神經元對應數據的一個特徵,例如數值型數據中的每一列。
- 隱藏層(Hidden Layers)
- 通過激活函數引入非線性能力,允許網絡學習複雜的模式。
- 層數越多,表達能力越強,但計算成本和過擬合風險也越高。
- 輸出層(Output Layer)
- 負責輸出模型的結果,例如:分類問題:每個類別對應一個輸出神經元。迴歸問題:輸出單一值或多個值。
工作原理
- 前向傳播(Forward Propagation)
- 輸入數據依次通過每一層神經元的權重計算、偏置加成和激活函數,生成輸出。
- 數學表達:
- 其中:z(l):第 l 層的線性組合。
- W(l):第 l 層的權重矩陣。
- b(l):偏置項。
- σ:激活函數。
- 損失計算(Loss Calculation)
- 通過損失函數衡量模型預測與真實值的誤差。
- 常見損失函數:
- 分類問題:交叉熵損失(Cross-Entropy Loss)。
- 迴歸問題:均方誤差(Mean Squared Error, MSE)。
- 反向傳播(Backpropagation)
- 通過鏈式法則計算每層權重和偏置的梯度。
- 更新權重與偏置以減少損失,優化過程通常使用梯度下降(Gradient Descent)。
- 權重更新
- 使用優化器(如 Adam、SGD 等)更新權重和偏置。
優點與挑戰
優點:
- 高表達能力:能從數據中學習複雜的模式和非線性關係。
- 自動特徵提取:減少人工特徵工程的需求。
- 應用廣泛:適用於分類、迴歸、多輸出問題。
挑戰:
- 過擬合風險:模型可能記住訓練數據的細節而忽略通用性。
- 梯度消失問題:深層網絡中,早期層的梯度可能變得極小。
- 計算資源需求高:需要強大的硬件支持(如 GPU)。
- 需要大量數據:小樣本可能導致模型性能欠佳。
Python 範例:簡單 DNN
構建 DNN 非常容易,常見的深度學習框架包括:
- TensorFlow/Keras:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([
Dense(64, activation='relu', input_shape=(input_dim,)),
Dense(32, activation='relu'),
Dense(output_dim, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=32)
- PyTorch:
import torch
import torch.nn as nn
class DNN(nn.Module):
def __init__(self, input_dim, output_dim):
super(DNN, self).__init__()
self.fc1 = nn.Linear(input_dim, 64)
self.fc2 = nn.Linear(64, 32)
self.fc3 = nn.Linear(32, output_dim)
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.fc3(x)
return x
model = DNN(input_dim, output_dim)
CNN 卷積神經網絡(Convolutional Neural Network)
定義
卷積神經網絡(CNN)是一種專門用於處理結構化數據(特別是圖像)的深度學習模型。CNN 通過卷積運算和特徵提取的方式,從圖像中學習局部模式和層次化特徵,廣泛應用於圖像分類、目標檢測、語音識別等領域。
常見應用場景
- 圖像分類
- 手寫數字識別(MNIST)。
- 圖像標籤分類(如 CIFAR-10、ImageNet)。
- 目標檢測
- 偵測圖像中的物體及其位置(如 YOLO、Faster R-CNN)。
- 語音處理
- 語音情緒分析。
- 語音識別(與 RNN 或 Transformer 結合)。
- 醫學影像分析
- CT/MRI 圖像的腫瘤檢測。
- 醫學影像分類與分割。
- 自駕車
基本結構
- 輸入層(Input Layer)
- 負責接收數據,通常是高維圖像數據,例如彩色圖像的大小是 H×W×C(高度×寬度×通道數,例如 224×224×3)。
- 特徵:
- 高度(Height):圖像的垂直像素數。
- 寬度(Width):圖像的水平像素數。
- 通道(Channel):如 RGB 圖像有 3 個通道,灰度圖像有 1 個通道。
- 卷積層(Convolutional Layer)
- 功能:從圖像中提取局部特徵。
- 運算:
- 使用一組「卷積核」(filters/kernels)在輸入數據上滑動,計算點積來生成特徵圖(Feature Map)。
- 每個卷積核專注於學習不同的模式,例如邊緣、線條或紋理。
數學公式:
- 其中:
- Z 是特徵圖。
- W 是卷積核(權重矩陣)。
- X 是輸入數據。
- b 是偏置項。
- 重要參數:
- 卷積核大小(Filter Size):如 3×3、5×5。
- 步長(Stride):每次滑動的步長,步長越大,特徵圖尺寸越小。
- 填充(Padding):為保留輸出尺寸,是否在輸入周圍補零。
- 激活函數(Activation Function)
- 功能:引入非線性特性,讓模型能學習複雜的模式。
- 常用函數:
- ReLU(Rectified Linear Unit):常用於卷積層,計算簡單,效果良好。
- 池化層(Pooling Layer)
- 功能:通過降維減少特徵圖大小,降低計算量並增強模型的平移不變性。
- 種類:
- 最大池化(Max Pooling):取池化窗口內的最大值。
- 平均池化(Average Pooling):取池化窗口內的平均值。
- 超參數:
- 窗口大小(如 2×2)。
- 步長(通常與窗口大小相同)。
- 全連接層(Fully Connected Layer, FC Layer)
- 功能:將提取的特徵映射到輸出空間,用於分類或回歸。
- 輸出層:通常用於輸出最終結果:
- 二分類:單一輸出節點,激活函數為 Sigmoid。
- 多分類:多個輸出節點,激活函數為 Softmax。
工作原理
- 輸入圖像
- 將原始圖像數據輸入 CNN,經過歸一化處理(例如將像素值縮放到 [0,1])。
- 卷積層提取特徵
- 第一層卷積提取低層特徵,如邊緣、線條。
- 更深層的卷積提取高階特徵,如形狀、物體部件。
- 池化層降維
- 多層卷積與池化
- 通過堆疊多層卷積和池化層,逐漸提取更抽象、更高級的特徵。
- 全連接層輸出結果
優點與挑戰
優點:
- 特徵自動提取:CNN 能自動學習特徵,而不需要手工設計。
- 局部感知:卷積層專注於局部模式,如圖像中的邊緣、角點。
- 參數共享:同一卷積核在整個圖像上滑動,顯著降低參數數量。
- 平移不變性:池化層幫助模型對輸入的平移和局部變化具有穩定性。
挑戰:
- 計算量大:需要大量計算資源(尤其是處理高分辨率圖像時)。
- 過擬合風險:深層模型容易過擬合,需要正則化和數據增強技術。
- 數據需求高:CNN 需要大量標註數據來訓練。
Python 範例:簡單 CNN
以下是一個使用 Keras 構建的簡單 CNN 模型範例:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
model = Sequential([
Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(64, 64, 3)),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(units=128, activation='relu'),
Dense(units=10, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
RNN 遞歸神經網絡(Recurrent Neural Network)
定義
RNN 是一類專為處理序列數據設計的神經網絡,它可以利用數據中的時間順序信息,讓網絡對當前輸入和之前的狀態進行建模。因此,RNN 非常適合處理像時間序列、語言數據、音頻信號等帶有上下文或依賴關係的數據。
核心思想:RNN 在時間維度上引入了循環結構,允許隱藏層的輸出影響下一步的計算,形成「記憶」效果。
常見應用場景
- 自然語言處理(NLP)
- 情感分析(Sentiment Analysis)。
- 語言建模(Language Modeling)。
- 機器翻譯(Machine Translation)。
- 時間序列分析
- 語音識別
- 生成任務
基本結構與工作原理
RNN 的結構包含以下部分:
- 輸入層(Input Layer)
- 每個時間步(time step)輸入一個序列中的數據。例如:
- 單詞序列:每個時間步是一個單詞的詞向量。
- 時間序列數據:每個時間步是一個觀測值。
- 數據結構:
- 隱藏層(Hidden Layer)
- 遞歸關係:隱藏層的輸出同時依賴於當前輸入和上一時間步的隱藏狀態。
其中:
- h(t):當前時間步的隱藏狀態。
- h(t−1):上一時間步的隱藏狀態。
- x(t):當前時間步的輸入。
- Wh、Wx:權重矩陣。
- b:偏置向量。
- f:激活函數(如 Tanh 或 ReLU)。
- 隱藏狀態的作用:儲存序列的「記憶」,幫助模型理解上下文。
- 輸出層(Output Layer)
- 對每個時間步 t 的隱藏狀態 h(t) 生成對應的輸出 o(t):
- g:輸出層的激活函數(例如 Softmax 或線性函數)。
- 輸出形式因任務而異:
- 序列到序列(Sequence-to-Sequence):輸出與輸入具有相同長度。
- 序列到標籤(Sequence-to-Label):輸出為一個標籤(例如情感分類)。
工作流程
- 前向傳播(Forward Propagation)
- 將序列數據分時間步輸入。
- 每個時間步的輸出依賴當前輸入和之前的隱藏狀態。
- 將最後或全部隱藏狀態作為輸出。
- 損失計算
- 根據真實標籤計算損失,例如:分類問題:交叉熵損失。回歸問題:均方誤差(MSE)。
- 反向傳播(Backpropagation Through Time, BPTT)
- 通過時間反向計算每個時間步的梯度,更新權重和偏置。
優點與挑戰
優點:
- 上下文建模:通過隱藏狀態,RNN 能捕捉序列中的上下文依賴性。
- 序列處理能力強:適合處理變長輸入或輸出,例如自然語言處理(NLP)和時間序列預測。
挑戰:
- 梯度消失與梯度爆炸:
- 當序列過長時,早期時間步的梯度可能過小(梯度消失)或過大(梯度爆炸)。
- 解決方法:使用改進版本(如 LSTM 和 GRU)。
- 長期依賴建模困難:
- 基本 RNN 難以有效捕捉序列中長距離的依賴關係。
- 計算成本高:
Python 範例:簡單 RNN
以下是一個使用 TensorFlow/Keras 實現簡單 RNN 的範例:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense
model = Sequential([
SimpleRNN(50, activation='tanh', input_shape=(100, 1)),
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()