一、激活函数是什么?
激活函数(Activation Function)用来决定神经元的输出。简单来说,神经网络每一层的输出会先做一次线性变换(如加权求和),然后经过激活函数处理,得到最终输出。激活函数的最大作用是引入非线性,使神经网络可以拟合复杂的函数关系。如果没有激活函数,整个网络只是线性变换的叠加,无法解决复杂问题。
二、常见激活函数详解
1. Sigmoid(S型激活函数)
公式:
[
f(x) = \frac{1}{1 + e^{-x}}
]
输出范围: (0, 1)
优点:
- 输出可以看作概率,常用于二分类输出层。
- 形式简单,历史悠久。
缺点:
- 容易饱和,梯度消失(输入很大或很小时梯度趋近于0)。
- 输出不是以0为中心,影响收敛速度。
- 计算复杂(涉及指数运算)。
2. Tanh(双曲正切激活函数)
公式:
[
f(x) = \tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}
]
输出范围: (-1, 1)
优点:
- 以0为中心,收敛更快。
- 非线性能力强。
缺点:
- 仍然存在梯度消失问题。
- 计算复杂。
3. ReLU(Rectified Linear Unit,线性整流函数)
公式:
[
f(x) = \max(0, x)
]
输出范围: [0, +∞)
优点:
- 计算简单,收敛快。
- 解决了梯度消失问题(大部分区域梯度为1)。
缺点:
- “死亡ReLU”问题:当输入为负时,梯度为0,神经元可能永远不激活。
- 输出不是以0为中心。
4. Leaky ReLU(带泄漏的ReLU)
公式:
[
f(x) = \begin{cases}
x & x \geq 0 \
\alpha x & x < 0
\end{cases}
]
其中 (\alpha) 通常取0.01。
优点:
- 解决了“死亡ReLU”问题,负区间也有微小梯度。
缺点:
- 仍然不是以0为中心。
5. ELU(Exponential Linear Unit)
公式:
[
f(x) = \begin{cases}
x & x \geq 0 \
\alpha (e^x - 1) & x < 0
\end{cases}
]
(\alpha)为超参数。
优点:
- 负区间有更平滑的输出,收敛速度快。
缺点:
- 计算稍复杂。
6. Softmax(多分类激活函数)
公式:
[
f(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}
]
输出范围: (0, 1),且所有输出之和为1。
优点:
- 常用于多分类的输出层,输出可解释为概率。
三、激活函数对比与选择建议
| 激活函数 | 非线性 | 输出区间 | 是否以0为中心 | 是否梯度消失 | 计算复杂度 | 典型应用场景 |
|---|---|---|---|---|---|---|
| Sigmoid | 是 | (0, 1) | 否 | 易 | 高 | 二分类输出层 |
| Tanh | 是 | (-1, 1) | 是 | 易 | 高 | 隐藏层 |
| ReLU | 是 | [0, ∞) | 否 | 少 | 低 | 隐藏层,卷积网络 |
| Leaky ReLU | 是 | (-∞, ∞) | 否 | 少 | 低 | 隐藏层 |
| ELU | 是 | (-α, ∞) | 是 | 少 | 中 | 隐藏层 |
| Softmax | 是 | (0, 1) | 否 | 无 | 高 | 多分类输出层 |
四、激活函数的实际应用建议
- 隐藏层优选ReLU及其变种:ReLU简单高效,收敛快,是当前默认首选。Leaky ReLU、ELU用于进一步改善性能。
- 输出层选择:
- 二分类:用Sigmoid。
- 多分类:用Softmax。
- 回归任务:通常不用激活函数或者用线性激活。
- 深层网络注意梯度消失:越深的网络越容易出现梯度消失,需选合适的激活函数,并配合BatchNorm等技术。
- 实验调优:实际应用中,激活函数的选择可以通过实验调优。
五、常见激活函数代码实现(PyTorch)
import torch
import torch.nn as nn
# ReLU
relu = nn.ReLU()
output = relu(torch.tensor([-1.0, 0.0, 2.0]))
# Leaky ReLU
leaky_relu = nn.LeakyReLU(0.01)
output = leaky_relu(torch.tensor([-1.0, 0.0, 2.0]))
# Sigmoid
sigmoid = nn.Sigmoid()
output = sigmoid(torch.tensor([-1.0, 0.0, 2.0]))
# Tanh
tanh = nn.Tanh()
output = tanh(torch.tensor([-1.0, 0.0, 2.0]))
# Softmax
softmax = nn.Softmax(dim=0)
output = softmax(torch.tensor([1.0, 2.0, 3.0]))
六、激活函数的历史与发展
- 早期神经网络多用Sigmoid和Tanh,因其非线性特性。
- 随着深度学习发展,ReLU及其变种成为主流,极大提升了训练速度和效果。
七、激活函数的数学特性
- 可微性:大多数激活函数都要求可微,便于反向传播求梯度。
- 非线性:引入非线性,使神经网络能拟合复杂函数。
- 饱和区间:如Sigmoid、Tanh在极端值时梯度趋近于0,导致梯度消失。
八、激活函数的创新方向
近年来还出现了如Swish、Mish等新型激活函数,表现优异:
- Swish: (f(x) = x \cdot sigmoid(x))
- Mish: (f(x) = x \cdot \tanh(\ln(1 + e^x)))
它们在某些深度网络上有更好的效果,但计算复杂度略高。
九、激活函数在不同网络结构中的应用
-
前馈神经网络(MLP)
- 隐藏层:常用
ReLU、Leaky ReLU、Tanh等。 - 输出层:二分类用
Sigmoid,多分类用Softmax,回归任务一般不用激活函数或用线性激活。
- 隐藏层:常用
-
卷积神经网络(CNN)
- 卷积层和全连接层通常用
ReLU及其变种。 - 输出层同上,分类用
Softmax。
- 卷积层和全连接层通常用
-
循环神经网络(RNN/LSTM/GRU)
- 内部门结构常用
Sigmoid和Tanh。 - 输出层根据任务选择激活函数。
- 内部门结构常用
-
生成对抗网络(GAN)
- 判别器输出层常用
Sigmoid(二分类)。 - 生成器隐藏层常用
ReLU或Leaky ReLU,输出层根据生成任务选择(如Tanh用于生成[-1,1]区间的图像像素)。
- 判别器输出层常用
十、激活函数选择技巧与调优建议
- 网络层数较浅时
Sigmoid和Tanh可以胜任,但ReLU通常更快。
- 网络层数较深时
- 强烈推荐
ReLU或Leaky ReLU,避免梯度消失。 - 可配合
Batch Normalization层,进一步缓解梯度消失问题。
- 强烈推荐
- 对输出有特殊要求时
- 回归任务不加激活或用线性激活。
- 生成特定区间数据时选
Tanh或自定义激活。
- 实验调整
- 可以尝试新型激活函数(如
Swish、Mish),有时能获得更好效果,但要关注计算资源和收敛速度。
- 可以尝试新型激活函数(如
十一、激活函数性能对比实验(简单说明)
实际使用时,可以通过如下方式对比不同激活函数的效果:
- 训练速度:如
ReLU通常收敛更快。 - 最终准确率/损失:部分新型激活函数能提升模型精度。
- 稳定性:如
Leaky ReLU能减少“死亡神经元”现象。 - 是否易于实现和部署:
ReLU、Leaky ReLU等实现简单,Swish、Mish计算量略大。
十二、激活函数与归一化的协同作用
在深度学习中,归一化层(如BatchNorm、LayerNorm)常和激活函数配合使用:
- 归一化层可以缓解激活函数带来的梯度消失问题,特别是在使用
Sigmoid、Tanh时。 - 归一化层也能让
ReLU等激活函数在训练时表现更稳定。
十三、前沿激活函数介绍
1. Swish
[
f(x) = x \cdot sigmoid(x)
]
- 由Google提出,兼具ReLU的高效性和Sigmoid的平滑性。
- 在某些模型上表现优于ReLU。
2. Mish
[
f(x) = x \cdot \tanh(\ln(1 + e^x))
]
- 在图像分类等任务上有较好表现。
- 非线性更强,梯度流更稳定。
3. GELU(Gaussian Error Linear Unit)
[
f(x) = x \cdot \Phi(x)
]
其中(\Phi(x))为标准正态分布的累积分布函数。
- Transformer等模型中常见,效果优异。
十四、激活函数的自定义与扩展(PyTorch示例)
如果你有特殊需求,可以自定义激活函数:
import torch
import torch.nn as nn
class Swish(nn.Module):
def forward(self, x):
return x * torch.sigmoid(x)
class Mish(nn.Module):
def forward(self, x):
return x * torch.tanh(torch.nn.functional.softplus(x))
# 使用自定义激活函数
swish = Swish()
mish = Mish()
x = torch.tensor([-1.0, 0.0, 2.0])
print(swish(x))
print(mish(x))
十五、常见激活函数的图像展示(建议在Jupyter或Matplotlib中画图)
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5, 5, 100)
plt.figure(figsize=(10,6))
plt.plot(x, 1/(1+np.exp(-x)), label='Sigmoid')
plt.plot(x, np.tanh(x), label='Tanh')
plt.plot(x, np.maximum(0, x), label='ReLU')
plt.plot(x, np.where(x>0, x, 0.01*x), label='Leaky ReLU')
plt.plot(x, x * 1/(1+np.exp(-x)), label='Swish')
plt.legend()
plt.title("常见激活函数曲线")
plt.show()
十六、总结
激活函数是深度学习模型的核心之一,决定了模型能否有效地学习复杂的非线性关系。实际应用中,建议优先使用ReLU及其变体,输出层根据任务类型选择Sigmoid或Softmax。如需进一步提升性能,可以尝试Swish、Mish等新型激活函数。
激活函数是神经网络的“灵魂”,决定了模型的表达能力和训练效率。实际应用中优先选用ReLU及其变种,输出层根据任务类型选择合适函数。对于更高性能需求,可以尝试新型激活函数,并结合归一化等技巧优化训练过程。
1356

被折叠的 条评论
为什么被折叠?



