WeHelp
PyTorch 是建置、訓練、佈署現代人工智慧、深度學習、神經網路模型的核心開發套件。
  1. 簡介、安裝、快速開始
  2. Tensor 張量
  3. 定義資料集、載入器
  4. 神經網路簡介
  5. PyTorch 定義模型
  6. PyTorch 激勵函式
  7. PyTorch 損失函式
  8. PyTorch 優化器
  9. 二元分類模型範例
PyTorch 激勵函式
## 一、激勵函式的用途 激勵函式(Activation Function)通常加在神經網路層與層之間,主要用途是: 1. **引入非線性能力** 如果所有層都只使用線性函式,即使堆疊很多層,整個網路仍可化簡成單一線性函式,無法學習複雜關係。 2. **控制神經元輸出範圍** 某些激勵函式會將輸出限制在特定範圍,例如 Sigmoid 的輸出介於 0 和 1 之間。 3. **協助模型學習不同類型的問題** 例如: - ReLU 常用於隱藏層 - Sigmoid 常用於二元分類輸出 - Softmax 常用於多分類輸出 --- ## 二、常見的激勵函式 ### 1. ReLU ReLU\(x\)=max\(0,x\) 特點: - 負值輸出為 0 - 正值保留 - 計算簡單、訓練速度快 - 深度學習中非常常見 - 可能產生「死亡 ReLU」問題,即某些神經元長期輸出 0 PyTorch: ```python nn.ReLU() ``` --- ### 2. Sigmoid Sigmoid\(x\)=1/\(1+e^\(-x\)\) 特點: - 輸出範圍為 \(0\) 到 \(1\) - 常用於二元分類 - 較容易產生梯度消失問題 PyTorch: ```python nn.Sigmoid() ``` --- ### 3. Softmax Softmax 會將一組輸出轉換成總和為 1 的機率分布,常用於多分類問題。 PyTorch: ```python nn.Softmax(dim=1) ``` 不過若使用 `nn.CrossEntropyLoss()`,通常**不需要在模型最後手動加入 Softmax**,因為 `CrossEntropyLoss` 內部已經包含相關處理。 --- # 三、PyTorch 中加入激勵函式的方法 在 PyTorch 中,常見有兩種方式。 ## 方法一:使用 `nn.Sequential` ```python import torch.nn as nn model = nn.Sequential( nn.Linear(10, 32), nn.ReLU(), nn.Linear(32, 2) ) ``` 這表示: ```text 輸入 10 維 → 全連接層,輸出 32 維 → ReLU → 全連接層,輸出 2 維 ``` --- ## 方法二:在 `forward()` 中明確呼叫 ```python import torch import torch.nn as nn class MyModel(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(10, 32) self.relu = nn.ReLU() self.fc2 = nn.Linear(32, 2) def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) return x ``` --- # 四、範例一:使用 ReLU 的多層感知器 以下是一個適合處理表格資料或向量資料的多層感知器,用於三分類問題。 ```python import torch import torch.nn as nn class MLPClassifier(nn.Module): def __init__(self, input_dim=20, num_classes=3): super().__init__() self.network = nn.Sequential( nn.Linear(input_dim, 64), nn.ReLU(), nn.Linear(64, 32), nn.ReLU(), nn.Linear(32, num_classes) ) def forward(self, x): return self.network(x) # 建立模型 model = MLPClassifier(input_dim=20, num_classes=3) # 建立一筆輸入資料,只示範模型結構與前向傳播 x = torch.randn(1, 20) # 模型輸出為三個分類的 logits output = model(x) print(model) print("輸出形狀:", output.shape) ``` 輸出形狀為: ```text torch.Size([1, 3]) ``` 這個模型在兩個隱藏層中使用了 `ReLU`。最後一層沒有加入 Softmax,因為分類模型通常會將 logits 交給損失函式處理。 --- ## 五、補充:使用函式形式加入激勵函式 除了 `nn.ReLU()`,也可以使用 `torch.nn.functional`: ```python import torch.nn.functional as F def forward(self, x): x = self.fc1(x) x = F.relu(x) x = self.fc2(x) x = F.gelu(x) return x ``` 簡單比較: | 寫法 | 特點 | |---|---| | `nn.ReLU()` | 可放入 `nn.Sequential`,適合建立模型結構 | | `F.relu(x)` | 在 `forward()` 中彈性使用,適合需要條件判斷或自訂流程的模型 | 總結而言,激勵函式是神經網路能夠學習非線性關係的關鍵元件。實務上通常會在隱藏層使用 ReLU、LeakyReLU 或 GELU,而輸出層則依任務選擇是否使用 Sigmoid 或 Softmax。
相關學習地圖、教學課程
Python 人工智慧
建議完成「Python 資料工程」教程後,繼續學習以下課程。