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 人工智慧