🚀 從零開始理解神經網路深度學習 MLP

更新於 發佈於 閱讀時間約 13 分鐘

很常聽到深度學習,但到底是在學些什麼?今天來跟我一起學習一個重要的概念:

多層感知機(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

raw-image
raw-image
raw-image
raw-image



呼~有點累了,小總結

🧠 神經網路中的權重(Weight)

在神經網路中,每個神經元都會接收輸入,然後透過權重(Weight)進行加權運算,最後經過活化函數(如 Sigmoid)產生輸出

👉 可以把 權重(Weight) 想成決定「每個輸入有多重要」,而 Bias 則是「調整基準值」,讓神經網路有更多自由度來學習不同的模式

  • 權重(Weight) 決定輸入數值對神經元的影響程度。
  • 矩陣運算 讓神經網路能夠處理多個輸入並自動學習關係。
  • Sigmoid 活化函數 會壓縮輸出到 0 到 1之間,確保輸出合理,特別適合二元分類問題。
  1. 如果沒有 bias,神經元的輸出只能受輸入影響。
  2. 在學習過程中,權重(Weight)和 Bias 都會被優化,找到最佳組合來提升模型表現。
這是神經元的計算方式,權重跟偏差都是用矩陣計算

這是神經元的計算方式,權重跟偏差都是用矩陣計算


💡神經元何時 Active?

每個神經元會接收來自前一層的輸入,經過加權計算(Weight)偏差(Bias),然後透過活化函數(Activation Function)決定是否「開燈」(活化)。

數學上,神經元的計算公式:

raw-image

🔥 什麼時候神經元會被活化?(以 Sigmoid為例子)

🚦 規則Sigmoid:可以設定0.6以上才活化

  • 輸出範圍是 0 到 1,但不會完全變成 0 或 1,只會趨近於它們。
  • 適合二元分類問題,因為輸出可以解讀成「機率」
raw-image

2. 活化函數(Activation Function)

MLP 需要活化函數來引入非線性,否則模型只是單純的線性變換(像 y = mx + b)。常見的活化函數有:

  1. Sigmoid函數(適合輸出範圍 0-1),每個神經元壓縮在0-1
  2. ReLU(Rectified Linear Unit)(目前最常見);它的輸出範圍是 0 到無限,不受限於 0~1。
  3. Tanh(雙曲正切函數):範圍-1~+1

一般選擇:

  • 隱藏層:目前技術大多使用 ReLU
  • 輸出層
    • 分類問題:Softmax
    • 回歸問題:線性輸出

🔄 為什麼神經網路需要反向傳播(Backpropagation)?

🧠 1. 神經網路學習的核心目標

我們希望神經網路能夠學習到最適合的權重(Weight)和偏差(Bias),讓它對輸入的資料做出最準確的預測。

為了達成這個目標,我們需要:

  1. 計算模型的預測結果與真實值的差距(Loss, 損失)
  2. 調整權重,讓損失變小
  3. 不斷重複這個過程,直到模型表現穩定

這時候,「反向傳播」就派上用場了!🚀


🔍 2. 什麼是反向傳播?

反向傳播(Backpropagation) 是一種用來計算梯度(Gradient)的方法,它告訴我們該如何調整每個權重與偏差,讓模型表現變好。

簡單來說,反向傳播的目標是讓「損失(Loss)」變小,它的核心步驟如下:

  1. 前向傳播(Forward Pass):
    • 輸入資料 x 經過神經網路,產生預測值 ​y。
    • 計算預測值和真實值 y之間的誤差(Loss)。
  2. 反向傳播(Backward Pass):
    • 透過鏈鎖律(Chain Rule),計算損失對每個權重的偏導數(梯度)。
    • 使用 梯度下降(Gradient Descent) 來更新權重,讓模型預測得更準確。
  3. 影片說明
  • 預期的輸出應該是1.00,前一層輸出0.66,再前一層(L-1)輸出0.48。我們需要他每一層的損失是小的。
  • 每一個神經元的計算受前一層的 Weight 和 Bias 影響
  • 為了方便理解,我們把下一個神經元計算的值取叫z
raw-image

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
raw-image
raw-image


(2) 反向傳播

我們的目標是減少損失(Loss),所以要調整 Wb

透過鏈鎖律(Chain Rule),計算權重 W的梯度:

raw-image


也用計算偏差 b 的梯度

補充

🔍 什麼是鏈鎖律?

鏈鎖律(Chain Rule) 是微積分的一個重要公式,它告訴我們如何計算一個函數的複合函數的導數

數學上,如果一個變數 z 依賴於 y,而 y 又依賴於 x,那麼需用鏈鎖律

raw-image


👉 簡單來說,就是「一層一層地把梯度傳遞回去」,因為損失函數 L 並不是直接與所有權重 W 相關,而是通過中間變數(例如神經元的輸出)相連。

(3) 使用梯度下降來更新權重

假設學習率(Learning Rate)η=0.1\eta = 0.1η=0.1

raw-image

模型的權重和偏差都變得更好,讓下一次的預測會更接近 1.0


🔑 4. 為什麼反向傳播很重要?

讓模型自動學習最佳權重

👉 透過梯度下降,神經網路可以「找到最好的數字」,讓它的預測越來越準確。

不需要人工設計規則

👉 在傳統機器學習(如 SVM)中,可能需要手動調整特徵,而神經網路透過反向傳播自動學習適合的特徵

適用於大規模數據與深度網路

👉 反向傳播可以計算多層神經網路的梯度,讓像 GPT、BERT 這類的超大型 AI 模型得以訓練。


🎯 總結

  1. 神經網路的目標是學習最適合的權重與偏差,使預測誤差最小化。
  2. 反向傳播透過鏈鎖律,計算損失對每個權重的影響(梯度)。
  3. 透過梯度下降,我們可以逐步調整權重,讓模型變得更準確。
  4. 這個過程會不斷重複,直到模型收斂,達到最佳預測能力!


🖥️ 4. PyTorch 實作:用 MLP 訓練 MNIST

讓我們用 PyTorch 訓練一個 MLP 來辨識手寫數字 MNIST。MLP 的模型可以用 Torch.nn 這個函式庫練習。

步驟

  1. 載入 MNIST 數據集
  2. 建立 MLP 模型
  3. 設定損失函數與優化器
  4. 訓練模型
  5. 驗證模型準確度
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 有任何問題,歡迎留言討論!💬🚀

留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這篇文章提供關於Git分支(Branch)和合併(Merge)的進階教學,包含建立分支、在不同分支修改檔案、合併分支以及處理合併衝突等步驟,並輔以圖文說明,適合初學者學習。
這篇文章提供 Git 版本控制系統的完整教學,從基礎概念到進階操作,包含圖文並茂的步驟說明和範例,讓讀者可以快速上手並應用於團隊協作及 GitHub Pages 部署網站。
這篇文章介紹如何使用 Google Colaboratory 進行線性回歸的梯度下降練習,包含手刻梯度下降法和使用 scikit-learn 的方法,並探討學習率、數據標準化、NaN 值等問題與解決方案。另外介紹,Matplotlib 進行結果可視化。
線性回歸是一種預測模型,目標是找到一條最貼近數據點的直線。本文詳細介紹線性回歸的流程,包含收集資料、建立模型、計算誤差、優化模型和測試模型等步驟。重點闡述梯度下降法與損失函數的應用,並解釋學習率的影響、參數更新方式,以及如何透過梯度下降法逐步逼近損失函數的最低點。
本篇筆記介紹非監督式學習的三大類別:分群、關聯分析和降維,並深入說明其概念、演算法和應用場景。包含K-Means分群演算法、Apriori關聯分析演算法、PCA降維技術,以及強化學習的基礎概念。
深入探討監督式學習中的分類預測,涵蓋邏輯回歸、混淆矩陣、模型評估指標 (Accuracy, Precision, Recall, F1 Score)、ROC 曲線、AUC,以及 KNN、SVM 和 Naive Bayes 等分類演算法。還介紹決策樹、Bagging、Boosting 等集成學習方法。
這篇文章提供關於Git分支(Branch)和合併(Merge)的進階教學,包含建立分支、在不同分支修改檔案、合併分支以及處理合併衝突等步驟,並輔以圖文說明,適合初學者學習。
這篇文章提供 Git 版本控制系統的完整教學,從基礎概念到進階操作,包含圖文並茂的步驟說明和範例,讓讀者可以快速上手並應用於團隊協作及 GitHub Pages 部署網站。
這篇文章介紹如何使用 Google Colaboratory 進行線性回歸的梯度下降練習,包含手刻梯度下降法和使用 scikit-learn 的方法,並探討學習率、數據標準化、NaN 值等問題與解決方案。另外介紹,Matplotlib 進行結果可視化。
線性回歸是一種預測模型,目標是找到一條最貼近數據點的直線。本文詳細介紹線性回歸的流程,包含收集資料、建立模型、計算誤差、優化模型和測試模型等步驟。重點闡述梯度下降法與損失函數的應用,並解釋學習率的影響、參數更新方式,以及如何透過梯度下降法逐步逼近損失函數的最低點。
本篇筆記介紹非監督式學習的三大類別:分群、關聯分析和降維,並深入說明其概念、演算法和應用場景。包含K-Means分群演算法、Apriori關聯分析演算法、PCA降維技術,以及強化學習的基礎概念。
深入探討監督式學習中的分類預測,涵蓋邏輯回歸、混淆矩陣、模型評估指標 (Accuracy, Precision, Recall, F1 Score)、ROC 曲線、AUC,以及 KNN、SVM 和 Naive Bayes 等分類演算法。還介紹決策樹、Bagging、Boosting 等集成學習方法。
你可能也想看
Google News 追蹤
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 原始 Transformer 架構的 Transduction Process 使用編碼器堆疊、解碼器堆疊而用所有模型參數來表示參考序列,我們將該輸出序列稱為參考。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 Transformers for Natural Language Processing and Computer Vision, 2024 這本書中講 Decoder
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 接著來談 Transformer 架構中的 Feedforward Network (FFN): 其為全連接的神經網路架構 回顧 AI說書 - 從0開始 - 64
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 首先先展示 Transformer 的架構圖: 可以看到架構中不再出現 RNN 、 LSTM 、 CNN 等物件,因為 Recurrence 已被摒棄。
Thumbnail
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
大語言模型是一種特殊的神經網路,設計來理解,生成與回應人類的文本。 大語言模型是使用大量文本數據訓練的深度神經網路,其訓練使用的文本數據甚至包括了整個網路公開的文本。 大語言模型的「大」,體現於模型的參數個數以及其使用的訓練數據集。如此大的模型可以有百億甚至千億的參數。這些參數都是神經網
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
Thumbnail
延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣 訓練過程,比較圖 是不是CNN的效果比MLP還要好,
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 原始 Transformer 架構的 Transduction Process 使用編碼器堆疊、解碼器堆疊而用所有模型參數來表示參考序列,我們將該輸出序列稱為參考。
Thumbnail
本篇文章專注於消息傳遞(message passing)在圖神經網絡(GNN)中的應用,並以簡單的例子解釋了消息傳遞的過程和機制。
Thumbnail
本文主要筆記使用pytorch建立graph的幾個概念與實作。在傳統的神經網路模型中,數據點之間往往是互相連接和影響的,使用GNN,我們不僅處理單獨的數據點或Xb,而是處理一個包含多個數據點和它們之間連結的特徵。GNN的優勢在於其能夠將這些連結關係納入模型中,將關係本身作為特徵進行學習。
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 Transformers for Natural Language Processing and Computer Vision, 2024 這本書中講 Decoder
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 接著來談 Transformer 架構中的 Feedforward Network (FFN): 其為全連接的神經網路架構 回顧 AI說書 - 從0開始 - 64
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 首先先展示 Transformer 的架構圖: 可以看到架構中不再出現 RNN 、 LSTM 、 CNN 等物件,因為 Recurrence 已被摒棄。
Thumbnail
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
大語言模型是一種特殊的神經網路,設計來理解,生成與回應人類的文本。 大語言模型是使用大量文本數據訓練的深度神經網路,其訓練使用的文本數據甚至包括了整個網路公開的文本。 大語言模型的「大」,體現於模型的參數個數以及其使用的訓練數據集。如此大的模型可以有百億甚至千億的參數。這些參數都是神經網