5.9 KiB
5.9 KiB
1. 传统激活函数
(1) Sigmoid
• 公式:
\
\sigma(x) = \frac{1}{1 + e^{-x}}
\ $$
• **输出范围**:`(0, 1)`
• **特点**:
• 将输入压缩到概率区间,常用于二分类输出层。
• **缺点**:
◦ 梯度消失问题(输入绝对值较大时,导数趋近于0)。
◦ 计算复杂,不适合深层网络。
• **代码示例**:
```python
layers.Dense(64, activation='sigmoid')
```
#### **(2) Tanh(双曲正切函数)**
• **公式**:
$$\
\tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} = \frac{e^{2x}}{e^{2x} + 1} - 1
\ $$
• **输出范围**:`(-1, 1)`
• **特点**:
• 输出对称分布,中心化数据更易训练。
• 梯度消失问题仍存在,但比 Sigmoid 好。
• **适用场景**:
• 循环神经网络(RNN)、双向 LSTM。
• **代码示例**:
```python
layers.LSTM(128, activation='tanh')
```
---
### **2. 改进型 ReLU 系列**
#### **(1) Leaky ReLU**
• **公式**:
$$\
f(x) = \begin{cases}
x & \text{if } x > 0 \\
\alpha x & \text{if } x \leq 0
\end{cases}
\ $$
• \( \alpha \):泄漏系数(通常取 `0.1`)。
• **特点**:
• 解决 ReLU 的“死亡神经元”问题,允许负值区域有微小梯度。
• **代码示例**:
```python
class LeakyReLU(tf.keras.layers.Layer):
def __init__(self, alpha=0.1, **kwargs):
super().__init__(**kwargs)
self.alpha = alpha
def call(self, inputs):
return tf.maximum(inputs, self.alpha * inputs)
model.add(LeakyReLU(alpha=0.2))
```
#### **(2) Parametric ReLU(PReLU)**
• **公式**:
$$\
f(x) = \max(0, x + a \cdot x)
\ $$
• \( a \):可学习的参数(而非固定系数)。
• **特点**:
• 自动调整负区间的斜率,增强模型表达能力。
• **代码示例**:
```python
from tensorflow.keras.layers import PReLU
model.add(PReLU())
```
#### **(3) ELU(指数线性单元)**
• **公式**:
$$\
f(x) = \begin{cases}
x & \text{if } x > 0 \\
\alpha (e^{x} - 1) & \text{if } x \leq 0
\end{cases}
\ $$
• \( \alpha \):平滑系数(通常取 `1`)。
• **特点**:
• 在负区间输出平滑曲线,减少梯度噪声。
• **代码示例**:
```python
layers.ELU(alpha=1.0)
```
#### **(4) Swish**
• **公式**:
$$\
f(x) = x \cdot \sigma(x) = \frac{x}{1 + e^{-x}}
\ $$
• **特点**:
• 自动归一化输出,类似于 Sigmoid,但梯度更平滑。
• 在 Google 的多项任务中表现优异。
• **代码示例**:
```python
layers.Swish()
```
---
### **3. 平滑型激活函数**
#### **(1) Softmax**
• **公式**:
$$\
\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}}
\ $$
• **输出范围**:`(0, 1)`(概率分布)。
• **特点**:
• 常用于多分类输出层,强制输出为概率形式。
• **代码示例**:
```python
layers.Dense(10, activation='softmax')
```
#### **(2) Softsign**
• **公式**:
$$\
f(x) = \frac{x}{1 + |x|}
\ $$
• **输出范围**:`(-1, 1)`。
• **特点**:
• 输出对称且平滑,比 Sigmoid 计算更快。
• **代码示例**:
```python
layers.Softsign()
```
---
### **4. 循环网络专用激活函数**
#### **(1) Tanh(已介绍)**
• **适用场景**:
• RNN、LSTM、GRU 的隐藏层,输出范围 `(-1, 1)` 有助于稳定训练。
#### **(2) Hard Sigmoid**
• **公式**:
$$\
f(x) = \max(0, \min(1, \frac{x + 1}{2}))
\ $$
• **特点**:
• 计算高效,近似 Sigmoid,常用于嵌入式设备。
---
### **5. 其他特殊激活函数**
#### **(1) Softmax Cross-Entropy with Logits**
• **公式**:
$$\
H(y, \hat{y}) = -\sum_{i} y_i \log(\hat{y}_i)
\ $$
• **特点**:
• 结合 Softmax 和交叉熵,数值稳定且高效。
• **代码示例**:
```python
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
```
#### **(2) SiLU(Sigmoid Linear Unit)**
• **公式**:
$$\
f(x) = x \cdot \sigma(x)
\ $$
• **特点**:
• 线性和非线性的平滑结合,类似 Swish。
---
### **6. 激活函数选择指南**
| **任务类型** | **推荐激活函数** | **理由** |
|--------------------|--------------------------------------|----------------------------------------|
| **二分类输出层** | Sigmoid、Softmax | 输出概率形式。 |
| **多分类输出层** | Softmax | 强制归一化为概率分布。 |
| **隐藏层(通用)** | ReLU、Leaky ReLU、Swish | 平衡性能与计算效率。 |
| **RNN/序列模型** | Tanh、ELU | 稳定梯度传播,缓解长程依赖问题。 |
| **需要平滑输出** | Softsign、Softmax | 输出连续且可解释。 |
| **嵌入式设备** | Hard Sigmoid、ReLU6 | 计算快速,硬件友好。 |
---
### **7. 高级技巧**
#### **(1) 自定义激活函数**
```python
class CustomActivation(tf.keras.layers.Layer):
def __init__(self, name='custom_act', **kwargs):
super().__init__(name=name, **kwargs)
def call(self, inputs):
return tf.nn.relu(inputs) * 0.5 + 0.5 # 示例:缩放 ReLU
model.add(CustomActivation())
```
#### **(2) 混合激活函数**
在复杂模型中,不同层使用不同激活函数(如 CNN 使用 ReLU,RNN 使用 Tanh)。
---
### **总结**
• **ReLU 及其变种**(如 Leaky ReLU、Swish)是大多数深层网络的首选。
• **Sigmoid/Tanh** 适用于特定场景(如分类输出层、循环网络)。
• **平滑函数**(如 Softmax)在需要概率输出时必不可少。