很常聽到深度學習,但到底是在學些什麼?今天來跟我一起學習一個重要的概念:
多層感知機(MLP, Multi-Layer Perceptron)是最基礎的神經網路之一。它雖然簡單,卻是許多進階模型的基礎,例如 CNN(卷積神經網路) 和 Transformer(變換器)(某論文),用於處理自然語言模型。在寫這篇學習筆記不知道睡著幾次,如果以錯誤請不吝指教。
我會先從了解 MLP 的數學原理開始,了解知道神經網路的本質跟運作方式,並使用 PyTorch 來訓練一個 MLP 模型來辨識手寫數字 MNIST。🏗️ 1. 深度學習的神經網路:MLP 的基本架構
MLP 是一種前饋式神經網路(Feedforward Neural Network),至少包含三層:
- 輸入層(Input Layer):接收輸入資料。
- 隱藏層(Hidden Layers):透過神經元進行非線性變換。
- 輸出層(Output Layer):產生最終的分類或回歸結果。
每個神經元的輸出計算如下:
y=f(Wx+b)
其中:
- x 是輸入
- W是權重矩陣
- b是偏差(bias)
- f是活化函數(activation function)
借用這支影片來解釋,整個過程
But what is a neural network? | Deep learning chapter 1




呼~有點累了,小總結
🧠 神經網路中的權重(Weight)
在神經網路中,每個神經元都會接收輸入,然後透過權重(Weight)進行加權運算,最後經過活化函數(如 Sigmoid)產生輸出。
👉 可以把 權重(Weight) 想成決定「每個輸入有多重要」,而 Bias 則是「調整基準值」,讓神經網路有更多自由度來學習不同的模式
- 權重(Weight) 決定輸入數值對神經元的影響程度。
- 矩陣運算 讓神經網路能夠處理多個輸入並自動學習關係。
- Sigmoid 活化函數 會壓縮輸出到 0 到 1之間,確保輸出合理,特別適合二元分類問題。
- 如果沒有 bias,神經元的輸出只能受輸入影響。
- 在學習過程中,權重(Weight)和 Bias 都會被優化,找到最佳組合來提升模型表現。

這是神經元的計算方式,權重跟偏差都是用矩陣計算
💡神經元何時 Active?
每個神經元會接收來自前一層的輸入,經過加權計算(Weight) 和 偏差(Bias),然後透過活化函數(Activation Function)決定是否「開燈」(活化)。
數學上,神經元的計算公式:

🔥 什麼時候神經元會被活化?(以 Sigmoid為例子)
🚦 規則Sigmoid:可以設定0.6以上才活化
- 輸出範圍是 0 到 1,但不會完全變成 0 或 1,只會趨近於它們。
- 適合二元分類問題,因為輸出可以解讀成「機率」。

⚡ 2. 活化函數(Activation Function)
MLP 需要活化函數來引入非線性,否則模型只是單純的線性變換(像 y = mx + b)。常見的活化函數有:
- Sigmoid函數(適合輸出範圍 0-1),每個神經元壓縮在0-1
- ReLU(Rectified Linear Unit)(目前最常見);它的輸出範圍是 0 到無限,不受限於 0~1。
- Tanh(雙曲正切函數):範圍-1~+1
一般選擇:
- 隱藏層:目前技術大多使用 ReLU
- 輸出層:
- 分類問題:Softmax
- 回歸問題:線性輸出
🔄 為什麼神經網路需要反向傳播(Backpropagation)?
🧠 1. 神經網路學習的核心目標
我們希望神經網路能夠學習到最適合的權重(Weight)和偏差(Bias),讓它對輸入的資料做出最準確的預測。
為了達成這個目標,我們需要:
- 計算模型的預測結果與真實值的差距(Loss, 損失)
- 調整權重,讓損失變小
- 不斷重複這個過程,直到模型表現穩定
這時候,「反向傳播」就派上用場了!🚀
🔍 2. 什麼是反向傳播?
反向傳播(Backpropagation) 是一種用來計算梯度(Gradient)的方法,它告訴我們該如何調整每個權重與偏差,讓模型表現變好。
簡單來說,反向傳播的目標是讓「損失(Loss)」變小,它的核心步驟如下:
- 前向傳播(Forward Pass):
- 輸入資料 x 經過神經網路,產生預測值 y。
- 計算預測值和真實值 y之間的誤差(Loss)。
- 反向傳播(Backward Pass):
- 透過鏈鎖律(Chain Rule),計算損失對每個權重的偏導數(梯度)。
- 使用 梯度下降(Gradient Descent) 來更新權重,讓模型預測得更準確。
- 影片說明
- 預期的輸出應該是1.00,前一層輸出0.66,再前一層(L-1)輸出0.48。我們需要他每一層的損失是小的。
- 每一個神經元的計算受前一層的 Weight 和 Bias 影響
- 為了方便理解,我們把下一個神經元計算的值取叫z

Backpropagation calculus | DL4
📊 3. 用數學範例解釋反向傳播
大概了解概念就好,這裡好難QQ
假設我們的神經網路只有一個神經元,活化函數使用 Sigmoid:
y=σ(Wx+b)
(1) 計算前向傳播
假設:
- 輸入值 x=1.5x = 1.5x=1.5
- 權重 W=0.8W = 0.8W=0.8
- 偏差 b=0.2b = 0.2b=0.2


(2) 反向傳播
我們的目標是減少損失(Loss),所以要調整 W 和 b。
透過鏈鎖律(Chain Rule),計算權重 W的梯度:

也用計算偏差 b 的梯度
補充
🔍 什麼是鏈鎖律?
鏈鎖律(Chain Rule) 是微積分的一個重要公式,它告訴我們如何計算一個函數的複合函數的導數。
數學上,如果一個變數 z 依賴於 y,而 y 又依賴於 x,那麼需用鏈鎖律

👉 簡單來說,就是「一層一層地把梯度傳遞回去」,因為損失函數 L 並不是直接與所有權重 W 相關,而是通過中間變數(例如神經元的輸出)相連。
(3) 使用梯度下降來更新權重
假設學習率(Learning Rate)η=0.1\eta = 0.1η=0.1:

模型的權重和偏差都變得更好,讓下一次的預測會更接近 1.0!
🔑 4. 為什麼反向傳播很重要?
✅ 讓模型自動學習最佳權重
👉 透過梯度下降,神經網路可以「找到最好的數字」,讓它的預測越來越準確。
✅ 不需要人工設計規則
👉 在傳統機器學習(如 SVM)中,可能需要手動調整特徵,而神經網路透過反向傳播自動學習適合的特徵。
✅ 適用於大規模數據與深度網路
👉 反向傳播可以計算多層神經網路的梯度,讓像 GPT、BERT 這類的超大型 AI 模型得以訓練。
🎯 總結
- 神經網路的目標是學習最適合的權重與偏差,使預測誤差最小化。
- 反向傳播透過鏈鎖律,計算損失對每個權重的影響(梯度)。
- 透過梯度下降,我們可以逐步調整權重,讓模型變得更準確。
- 這個過程會不斷重複,直到模型收斂,達到最佳預測能力!
🖥️ 4. PyTorch 實作:用 MLP 訓練 MNIST
讓我們用 PyTorch 訓練一個 MLP 來辨識手寫數字 MNIST。MLP 的模型可以用 Torch.nn 這個函式庫練習。
步驟 (以下為ChatGPT 提供,我的電腦集體不夠,無法訓練QQ)
- 載入 MNIST 數據集
- 建立 MLP 模型
- 設定損失函數與優化器
- 訓練模型
- 驗證模型準確度
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 1. 載入 MNIST 數據集
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
# 2. 定義 MLP 模型
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.fc1 = nn.Linear(28*28, 128) # 第一層
self.fc2 = nn.Linear(128, 64) # 第二層
self.fc3 = nn.Linear(64, 10) # 輸出層(10 類別)
self.relu = nn.ReLU()
def forward(self, x):
x = x.view(-1, 28*28) # 展平成一維
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.fc3(x)
return x
model = MLP()
# 3. 設定損失函數與優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 4. 訓練模型
epochs = 5
for epoch in range(epochs):
for images, labels in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item():.4f}')
# 5. 驗證準確率
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'測試集準確率: {100 * correct / total:.2f}%')
🎯 5. MLP 的應用與進階學習
雖然 MLP 是最簡單的神經網路之一,但它已經可以解決許多數據分類問題,例如:
- 手寫數字識別(如 MNIST)
- 股票市場預測(時間序列數據)
- 垃圾郵件分類(自然語言處理)
如果想進一步學習,可以探索:
- CNN(卷積神經網路):影像處理的進階方法
- RNN(遞迴神經網路):適用於時間序列或自然語言處理
- Transformer:現代 NLP 模型的基礎
✅ 結論
MLP 是深度學習的起點,透過 PyTorch,你可以快速實作並理解它的運作原理。希望這篇文章幫助你稍微了解神經網路的名詞!
如果你對 MLP 或 PyTorch 有任何問題,歡迎留言討論!💬🚀