深度学习中常见的激活函数分析
ReLU 是一个非常简单且常用的非线性激活函数。如果 x > 0,输出 x。如果 x <= 0,输出 0。ReLU 是一个简单、高效且强大的激活函数,极大地推动了深度学习的发展,尤其是在处理图像识别等视觉任务上取得了巨大成功。尽管它存在一些已知的缺点(尤其是神经元死亡问题),但通过改进版本或调整训练策略,这些问题可以在很大程度上得到缓解。目前,ReLU 和其改进版本仍然是构建神经网络的首选激活函数
好的,我们来详细讲解一下 ReLU(Rectified Linear Unit,修正线性单元) 激活函数。
1. 定义
ReLU 是一个非常简单且常用的非线性激活函数。它的定义非常直接:
f(x) = max(0, x)
也就是说,对于输入 x:
- 如果 x > 0,输出 x。
- 如果 x <= 0,输出 0。
2. 函数图像
ReLU 的图像非常容易想象:
- 对于 x < 0 的区域,函数图像是一条从负无穷到 0 的水平直线(y=0)。
- 对于 x >= 0 的区域,函数图像是一条斜率为 1 的直线,从 (0, 0) 开始,向右上方延伸。

(注:上图为示意,实际图像在 x<0 时是 y=0 的线)
3. 优点
ReLU 的受欢迎程度主要归功于它的几个显著优点:
- 计算简单,效率高: ReLU 的计算只需要一个比较和一个取最大值操作,计算速度非常快,不需要复杂的指数或三角函数计算。
- 缓解梯度消失问题: 这是 ReLU 最重要的优点之一。传统的激活函数如 Sigmoid 和 Tanh 在输入值较大或较小时,其导数会趋近于 0(梯度饱和),导致在深层网络中,前面层的梯度几乎为零,从而使得这些层的学习变得非常困难(梯度消失)。而 ReLU 在正区间(x>0)内的导数恒为 1,不会饱和,因此在训练深层网络时,梯度可以更有效地从前向后传播,加速训练过程。
- 促进稀疏激活: ReLU 会将所有负的输入都置为 0。这意味着在神经网络中,只有一部分神经元会被激活(输出非零值),其余大部分神经元输出 0。这种稀疏性有助于模型关注最重要的特征,有时也能起到正则化的效果,有助于防止过拟合。
4. 缺点和注意事项
尽管 ReLU 优点众多,但它也存在一些潜在的问题:
- 神经元死亡(Dying ReLU): 这是最常被提及的问题。当输入到 ReLU 神经元的值持续为负时,该神经元将始终输出 0,并且在反向传播中,其梯度也将为 0。如果这种情况持续发生,该神经元将停止更新,实际上从网络中“消失”了。这通常发生在输入数据的分布偏移或者初始化不当(例如,权重初始化过大导致输入值过小)的情况下。解决方法包括:
- 使用 Leaky ReLU、Parametric ReLU 等改进版本,它们在负输入时输出一个很小的斜率(非零),使得梯度不为零,神经元仍有微弱的更新。
- 改进初始化方法,避免权重过大导致输入值过小。
- 非对称性: ReLU 在正负区间具有不同的行为(正区间恒为 1,负区间恒为 0)。这可能导致网络学习到的特征偏向于正方向,或者使得网络的输出范围偏向于非负数(除非最后一层使用特定的激活函数,如 Sigmoid 或 Tanh)。
- 对负输入的处理: ReLU 会完全“丢弃”负输入,这有时可能不是最优的选择,尤其是在需要捕捉负值信息的任务中。
5. 使用场景
- ReLU 是目前深度学习领域,尤其是在卷积神经网络(CNN)中,使用最广泛的激活函数之一。
- 它适用于大多数需要引入非线性的场景。
- 对于需要输出负数的层(例如,靠近输出层的分类层,通常会使用 Sigmoid 或 Softmax),可以在前一层(比如隐藏层)使用 ReLU,然后在输出层使用合适的激活函数。
6. 其他基于 ReLU 的变体
为了解决 ReLU 的一些缺点,研究者提出了多种改进版本:
- Leaky ReLU: 在负输入区域,输出一个很小的斜率
a* x(通常a是一个很小的正数,如 0.01)。公式为:f(x) = max(a * x, x)。这使得即使输入为负,梯度也不会为零,缓解了神经元死亡问题。 - Parametric ReLU (PReLU): Leaky ReLU 的升级版,
a不是一个固定的值,而是每个神经元在训练过程中学习得到的参数。 - Exponential Linear Unit (ELU): 在负输入区域,输出一个平滑的指数函数
α * (eˣ - 1)(α是一个超参数,通常设为 1)。ELU 的优点是其均值趋近于零,并且在负区域也有平滑过渡,理论上可以缓解神经元死亡问题,使得输出更接近零,有助于训练。 - Scaled Exponential Linear Unit (SELU): 这是一种特殊的 ELU 变体,其参数
α和β被精心选择,使得激活函数本身具有自归一化(Self-Normalizing)的特性,有助于维持网络中激活值的均值和方差稳定。
总结
ReLU 是一个简单、高效且强大的激活函数,极大地推动了深度学习的发展,尤其是在处理图像识别等视觉任务上取得了巨大成功。尽管它存在一些已知的缺点(尤其是神经元死亡问题),但通过改进版本或调整训练策略,这些问题可以在很大程度上得到缓解。目前,ReLU 和其改进版本仍然是构建神经网络的首选激活函数之一。
Softmax 的定义
Softmax 是一个数学函数,常用于多分类问题中的机器学习和深度学习模型。给定一个 输入向量 ( z )(通常是模型的输出 logits),Softmax 函数将其转换为概率分布,使得所有输出的和为 1。具体公式如下:
Softmax 解决了什么问题?
-
将 logits 转换为概率:
- Softmax 提供了一种方法,将模型产生的任意实数 logits 转化为概率分布,这有助于理解模型的预测。因为输出值 ( p_i = \text{softmax}(z_i) ) 可以直接解释为“输入属于类别 ( i ) 的概率”。
-
多分类问题的适用性:
- 在多类别分类问题中,Softmax 函数能够为每个类别生成一个非负概率,这一点比简单的 sigmoid 函数更为适用,因为后者仅用于二分类问题。
-
归一化:
- Softmax 通过将 logits 押缩到 [0, 1] 范围内,并确保它们的总和为 1,解决了模型输出的数值不稳定性和不一致性的问题。这样,模型的输出更具有可比较性。
Softmax 的用途
-
分类问题:
- Softmax 在分类任务中广泛应用,例如图像分类、文本分类等。一般情况是在模型的最后一层使用 softmax 得到每个类别的预测概率。
-
多标签分类:
- 在多标签分类中,如果将多个 Softmax 组合使用,可以让模型同时预测多个标签。
-
策略梯度方法:
- 在强化学习中,Softmax 函数也被用来将算法的动作概率转换为随机选择的行为,生成策略。
-
自然语言处理:
- 在语言模型或者生成模型中,Softmax 用于生成下一个词的概率分布。
Softmax 相关实现
在深度学习框架(如 TensorFlow 和 PyTorch)中,Softmax 通常作为一个层被实现。以下是 PyTorch 中 Softmax 的示例:
import torch
import torch.nn.functional as F
# 假设输出 logits
logits = torch.tensor([1.0, 2.0, 3.0])
# 计算 softmax 概率
probabilities = F.softmax(logits, dim=0)
print(probabilities)
数值稳定性问题
在计算 Softmax 时,直接计算可能会导致 溢出 或 下溢出。因此,通常在实现时会使用“减去最大值”的技巧来保持数值稳定:
def stable_softmax(logits):
exp_logits = torch.exp(logits - torch.max(logits))
return exp_logits / exp_logits.sum(dim=0)
小结
Softmax 函数是一种将任意实数转换为概率分布的重要工具,广泛应用于多分类问题,提供了有力的方式来将模型的输出解释为相应类别的预测概率。其实现相对简单,但在实际应用中需注意数值稳定性以避免计算问题。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)