4.3 激活函数的目的
激活函数的目的(思考)
为什么神经网络需要激活函数。比如,没有激活函数的话,神经网络就只是线性变换的组合,无法处理复杂的非线性问题。所以激活函数的作用是引入非线性,让网络可以学习更复杂的模式。
ReLU和Sigmoid的具体函数形式。ReLU比较简单,就是max(0, x),但需要说明它的优缺点,比如缓解梯度消失,计算高效,但可能有神经元死亡的问题。Sigmoid的话,公式是1/(1 + e^{-x}),输出在0到1之间,适合二分类,但存在梯度消失的问题,尤其在深层网络中。
为什么选择这两种函数,或者它们适用的场景。比如ReLU在隐藏层常用,而Sigmoid多用于输出层做概率估计。
激活函数是神经网络中的核心组件之一,其目的是引入非线性特性,使网络能够学习和表示复杂的模式。以下是激活函数的核心作用及两种常见激活函数(ReLU、Sigmoid)的详细解释:
一、激活函数的目的
- 引入非线性
如果神经网络仅由线性变换(如矩阵乘法)组成,无论有多少层,其整体仍是线性模型,无法解决非线性问题(如异或分类、图像识别)。激活函数通过对线性输出施加非线性变换,使网络能够拟合任意复杂的函数。 - 控制输出范围
激活函数可以将神经元的输出映射到特定范围(如 [0,1]、[-1,1]),避免数值爆炸或消失。 - 稀疏激活
某些激活函数(如 ReLU)会使得部分神经元输出为零,从而减少参数依赖性,增强模型的鲁棒性。 - 梯度传递
激活函数的导数决定了反向传播中梯度的流动方式,直接影响训练效果(如**缓解梯度消失/爆炸问题**)。
二、常见激活函数详解
1. ReLU(Rectified Linear Unit)
- 函数形式: f(x)=max(0,x)f(x) = \max(0, x)f(x)=max(0,x)
或分段形式:
f(x)={xif x>00otherwisef(x) = \begin{cases}x & \text{if } x > 0 \\ 0 & \text{otherwise} \end{cases}f(x)={x0if x>0otherwise
- 特点:
- 计算高效:仅需判断输入是否大于零,无复杂运算。
- 缓解梯度消失:在正区间的梯度恒为 1,反向传播时梯度不会衰减。
- 稀疏性:负输入输出为零,使网络稀疏化,减少过拟合。
- 缺点:
- 神经元死亡:若大量神经元输出恒为零(如学习率过大时),梯度无法更新参数。
- 非零均值输出:可能导致后续层输入分布偏移。
- 适用场景:
隐藏层的默认选择(尤其深层网络),如图像分类、自然语言处理等。
2. Sigmoid(Logistic 函数)
- 函数形式: f(x)=11+e−xf(x) = \frac{1}{1 + e^{-x}}f(x)=1+e−x1
其输出范围为 (0, 1)。
- 特点:
- 平滑可导:梯度计算简单,导数可表示为:
f′(x)=f(x)(1−f(x))f'(x) = f(x)(1 - f(x))f′(x)=f(x)(1−f(x)) - 概率解释:输出值可视为概率(如二分类任务的输出层)。
- 缺点:
- 梯度消失:当输入绝对值较大时,梯度趋近于零,导致深层网络难以训练。
- 非零均值输出:导致后续层输入分布偏移,影响收敛速度。
- 输出范围敏感:易使神经元饱和,限制表达能力。
- 平滑可导:梯度计算简单,导数可表示为:
- 适用场景:
二分类任务的输出层(输出概率)、早期浅层网络(现逐渐被 ReLU 替代)。
三、激活函数对比
特性 | ReLU | Sigmoid |
---|---|---|
输出范围 | [0, +∞) | (0, 1) |
计算复杂度 | 极低(只需比较和取最大值) | 中(涉及指数运算) |
梯度特性 | 正区间梯度为 1,负区间为 0 | 梯度在极端值时趋近于 0 |
稀疏性 | 高(负输入被抑制) | 无 |
适用场景 | 隐藏层 | 输出层(二分类概率) |
四、其他常见激活函数
- Tanh(双曲正切函数)
- 函数形式: f(x)=ex−e−xex+e−xf(x) = \frac{ex - e{-x}}{ex + e{-x}}f(x)=ex+e−xex−e−x
- 输出范围:(-1, 1),零均值化,缓解 Sigmoid 的输出偏移问题,但仍有梯度消失问题。
- Leaky ReLU
- 函数形式:
f(x)={xif x>0αxotherwisef(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{otherwise} \end{cases}f(x)={xαxif x>0otherwise - 改进 ReLU 的“神经元死亡”问题(如设 (α=0.01\alpha=0.01α=0.01)),允许负区间的小梯度流动。
- Softmax
-
函数形式:f(xi)=exi∑j=1Kexjf(x_i) = \frac{e{x_i}}{\sum_{j=1}K e^{x_j}}f(xi)=∑j=1Kexjexi
-
用于多分类任务的输出层,将输出归一化为概率分布。
五、如何选择激活函数?
- 隐藏层:优先使用 ReLU 或其变种(如 Leaky ReLU、PReLU)。
- 输出层:
- 二分类任务:Sigmoid(输出概率)。
- 多分类任务:Softmax(输出概率分布)。
- 回归任务:通常不使用激活函数(或线性激活)。
- 特殊场景:
- RNN 中可能使用 Tanh(因零均值特性)。
- 需要稀疏性时使用 ReLU。
六、代码示例
import numpy as np
import matplotlib.pyplot as plt# ReLU
def relu(x):return np.maximum(0, x)# Sigmoid
def sigmoid(x):return 1 / (1 + np.exp(-x))# 可视化
x = np.linspace(-5, 5, 100)
plt.figure(figsize=(10, 4))plt.subplot(1, 2, 1)
plt.plot(x, relu(x), label='ReLU')
plt.title("ReLU Activation")
plt.grid(True)plt.subplot(1, 2, 2)
plt.plot(x, sigmoid(x), label='Sigmoid')
plt.title("Sigmoid Activation")
plt.grid(True)plt.show()
通过激活函数的合理选择,神经网络能够灵活地建模复杂数据关系,成为解决实际问题的强大工具。