跳至主要内容

Softplus:值得了解的平滑激活函数

本指南解释 Softplus 的数学特性、其优点与权衡、在 PyTorch 中的实现,以及何时从 ReLU 切换。
· 9分钟 阅读

使用 AI 探索

多年来,ReLU 一直是深度学习中的默认激活函数,这是有理由的——它简单且在大多数情况下效果良好。但当神经元在训练中开始输出 0 时,它们就会停止学习,梯度变为 0,反向传播无法更新其权重。在更深的网络中,这个问题会影响多个神经元,降低模型捕捉数据模式的能力。

通俗点说:您的网络不再学习了。

Softplus 提供了一种平滑且可微分的替代方案,能解决这一问题,同时保留了 ReLU 的大部分优点。它在正输入上近似 ReLU 的行为,但对负值给出非零梯度,从而使神经元在整个训练过程中保持活跃。

本文将介绍 Softplus 是什么、它在数学上与 ReLU 的对比,以及在何种情况下应优先选用它而不是其他激活函数。

如果您刚接触深度学习,请先查看我们的深度指南:神经网络中的激活函数。

什么是 Softplus 函数?

Softplus 是一种平滑的激活函数,可作为 ReLU 的可微近似。

该函数接受任意实数作为输入,并输出一个正值。Softplus 不像 ReLU 那样在 0 处有一个尖角;它在该过渡点平滑地弯曲。

其数学定义如下:

Softplus formula

其中:

  • x 为输入值
  • e 为欧拉常数(约为 2.718)
  • ln 为自然对数

对较大的正输入,Softplus 的输出接近输入本身;对负输入,它输出接近于 0 的正值而非 0。

Softplus 的导数

Softplus 的导数是逻辑Sigmoid 函数。

这意味着:

Softplus derivative

其中 σ(x) 是您很可能见过的 Sigmoid 函数。 

这一导数性质使 Softplus 在反向传播中需要平滑梯度流时非常有用。梯度永不降至 0,意味着神经元始终可以更新权重并持续学习。

极值处的行为

Softplus 在输入为大型正数或大型负数时表现不同。

对于较大的正值:

Softplus behavior for large positive values

对于较大的负值:

Image 4 - Softplus behavior for large negative values

这也是 Softplus 能很好近似 ReLU 的原因。当 x 为正且较大时,两者返回的值近似相同。

差异体现在负输入上。ReLU 对负输入输出严格为 0,而 Softplus 输出很小的正值。

这种细小差异可以避免神经元死亡问题。使用 Softplus 的神经元能够从负激活中恢复,因为其梯度从不完全消失。

数学与计算特性

Softplus 具有一些需要了解的数学特性,使其不仅仅是 ReLU 的平滑版本。

平滑性与可微性

Softplus 在每一点都可无限次求导。

这意味着您可以进行任意次数的求导且函数始终平滑。用数学术语说,它是解析函数。

而 ReLU 在 0 处有“折点”——一个导数不存在的尖角。这一不可导点会对假定梯度平滑的优化算法造成影响。

在深度学习中,当损失曲面平滑时,优化通常效果更好。如果您使用二阶优化方法或依赖梯度平滑过渡的算法,Softplus 能提供所需的平滑性。

数值稳定性

当输入很大时,计算指数会导致上溢问题。

深度学习框架通过一个 threshold 参数来处理。当输入超过该阈值时,函数会从计算对数切换为直接返回线性输出。

其工作方式如下:

  • 小输入:直接计算 Softplus
  • 超过阈值的大输入:直接返回输入

这可防止数值上溢,同时保持所需的行为。对于较大的正输入,Softplus 本就近似线性,因此这种切换对输出意义影响不大。

与其他函数的关系

Softplus 与其他一些激活函数和概率函数有关联。如下所示:

  • Sigmoid:如前所示,Softplus 的导数是 Sigmoid。这意味着 Softplus 是 Sigmoid 的积分,把两者的曲线形状联系起来就很容易理解。

  • LogSumExp:Softplus 实际上是 LogSumExp 的一个特例。对两个输入,有 LogSumExp(0, x) = ln(1 + e^x) = Softplus(x)。这将 Softplus 与机器学习中的数值稳定技巧联系起来。

  • Softmax:LogSumExp 是 Softmax 的基础,因此 Softplus 也有这种“血统”。两者都使用对数-指数技巧来保证数值稳定性。

  • Logit 函数:Logit 是 Sigmoid 的逆函数。由于 Sigmoid 是 Softplus 的导数,这三个函数在概率论中构成一个相互关联的家族。

  • 凸共轭:在凸分析中,Softplus 的凸共轭是负二元熵。这将 Softplus 与信息论和概率建模中使用的熵最大化原理联系起来。

如果您在使用概率模型或贝叶斯框架,这种与熵的关联使 Softplus 成为确保激活符合最大熵原则的自然选择。

使用 Softplus 的优势

Softplus 能解决 ReLU 处理不佳的一些特定问题。下面列出其中四点。

平滑且可微

Softplus 在曲线上的每一点都平滑。

这意味着在反向传播过程中,梯度连续流动,不会突然跳变或断裂。训练网络时,平滑的梯度流有助于更稳定的权重更新和更好的收敛表现。

ReLU 在 0 处的尖角可能导致梯度不连续。Softplus 则不存在这个问题。

防止神经元死亡

Softplus 从不会输出严格为 0 的值,即便输入是很大的负数。

这意味着每个神经元都能持续学习,因为梯度从不完全消失。使用 ReLU 时,一旦神经元开始输出 0,就可能永远卡在那儿——梯度为 0,权重更新无法推动它移动。

Softplus 提供了一张“安全网”。神经元可以从负激活中恢复,重新为网络做出贡献。

输出始终为非负

Softplus 保证任意输入的输出都为非负值。

当您构建需要正预测的模型时,这一点尤为重要。泊松回归 用于计数数据(客户、事件、点击),负值没有意义。生成式模型也常需要正输出来表示概率或强度。

更适合某些任务

某些任务受益于平滑、连续的激活行为。

具有平滑目标函数的回归任务更适合采用平滑激活。如果您要预测温度、价格或距离等连续值,Softplus 更符合数据的内在平滑性。

贝叶斯模型和概率框架也偏好平滑函数。在建模不确定性或处理概率分布时,Softplus 的连续导数使数学运算更简洁、更稳定。

在这些领域中,相较于 ReLU 的尖锐过渡,Softplus 能提供更好的理论保证与实际效果。

局限与权衡

在彻底放弃 ReLU 之前,您需要了解 Softplus 的一些局限。下面列出三点。

更高的计算成本

ReLU 仅使用一个简单的取最大操作:max(0, x)。

Softplus 需要计算指数与对数:ln(1 + e^x)。这些操作更慢,尤其是在包含成千上万个神经元的大型网络中需要执行数百万次时。

差异会被不断累积,从而增加训练时间。

收敛更慢

Softplus 的梯度更平滑,听起来不错。

但平滑不代表更快。ReLU 的急剧过渡会产生稀疏激活——许多神经元输出严格为 0。这种稀疏性有助于梯度在反向传播中更快地传播。

Softplus 则缺少这种稀疏性。每个神经元都会输出非零值,意味着计算更多,在深层结构中可能导致收敛更慢。

实践中不够常见

多年来,ReLU 一直主导深度学习领域。

这意味着围绕它的文档、问题/解决方案和各种资源更丰富。Softplus 没有得到同等对待。使用者较少,因此社区知识更少、Stack Overflow 的答案更少、采用它的预训练模型也更少。

选择 Softplus,意味着走一条支持更少、可能需要更多自行调试的道路。

PyTorch 中的 Softplus

PyTorch 对 Softplus 提供内置支持,并提供两个参数来控制其行为,使用起来非常方便。

供参考,我使用的 PyTorch 版本如下:

import torch
import torch.nn as nn

print(torch.__version__)

PyTorch version 2.8.0

基本用法如下:

# Create a Softplus activation function
softplus = nn.Softplus(beta=1, threshold=20)

# Apply it to some input
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
output = softplus(x)

print(output)

Softplus applied to a tensor

足够简单。不过这两个参数——beta 和 threshold——会改变函数的行为。我们来深入了解。

beta 参数

beta 参数控制 Softplus 曲线的平滑程度。

增大 beta 时,函数更陡峭,更接近 ReLU;减小它时,函数更平滑、过渡更缓。代码示例如下:

x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# Steeper activation (closer to ReLU)
softplus_steep = nn.Softplus(beta=2, threshold=20)
output_steep = softplus_steep(x)

# Smoother activation
softplus_smooth = nn.Softplus(beta=0.5, threshold=20)
output_smooth = softplus_smooth(x)

print("Softplus - Steeper activation")
print(output_steep)

print()

print("Softplus - Smoother activation")
print(output_smooth)

Tweaking the beta parameter

默认的 beta=1 适用于大多数情况。只有在需要针对特定任务微调激活的“锋利度”时,您才会调整它。

threshold 参数

threshold 参数用于防止大输入导致的数值上溢。

还记得计算 e^x 在 x 很大时会“爆炸”吗?当输入超过阈值时,PyTorch 会从计算完整的 Softplus 公式切换为直接返回输入值:

softplus = nn.Softplus(beta=1, threshold=20)

# Large input bypasses the exponential
large_input = torch.tensor([25.0])
print(softplus(large_input))

Tweaking the threshold parameter

默认的 threshold=20 适用于大多数场景。在这一点上,Softplus 已近似线性,因此切换并不会对结果造成实质影响。

何时使用 Softplus

当您需要用于优化的梯度平滑性时选择 Softplus。如果您在使用二阶优化方法或假定损失曲面平滑的算法,Softplus 能提供这些方法所依赖的连续导数。

在模型需要非负输出时使用它。计数数据、强度值和概率参数都必须保持为正。Softplus 可以自然而然地做到这一点,无需额外约束。

浅层网络 比深层网络更能从 Softplus 中受益。层数很少时,即便丢失一个神经元(死 ReLU 问题)也会伤害性能。Softplus 让所有神经元保持活跃并持续学习。

在概率模型与贝叶斯框架中也可选择 Softplus。其平滑梯度与熵的关联使数学操作更简洁。基于能量的模型也受益于 Softplus 的连续特性。

在需要解释连续梯度的模型中,Softplus 的表现更佳。如果您要分析网络对输入变化的响应或研究梯度流,连续的导数会比 ReLU 的尖锐过渡提供更清晰的洞见。

何时仍应使用 ReLU

别仅仅因为 Softplus 在纸面上看起来更好,或因为它是个“新潮”的选择就切换过去。

  • 大型、深层网络 使用 ReLU 训练更快。Softplus 的计算开销在数百层与数百万参数上会不断累积。ReLU 的稀疏性也有助于内存与速度。
  • 生产系统 往往偏好 ReLU,因为硬件优化常常针对它。在同样的硬件上,使用 Softplus 训练可能会慢 10–20%。
  • 标准计算机视觉与 NLP 任务 通常不会从 Softplus 中受益。社区多年来围绕 ReLU 优化了大量架构,切换激活函数意味着要重建这些经验。

对大多数项目,从 ReLU 起步。当遇到 Softplus 的特性能解决的具体问题时,再切换。

结论

简而言之,需要时 Softplus 为您提供一种平滑的 ReLU 替代方案。

它不会取代 ReLU 成为默认激活函数——也没有必要。Softplus 解决特定问题:浅层网络的神经元死亡、需要非负输出的模型,以及在优化中梯度平滑性很重要的任务。

您将以计算速度为代价,换来更好的数学性质。对大多数深度学习项目而言,ReLU 的简单与高速更占优。但在概率模型、贝叶斯框架,或具有平滑目标函数的回归任务中,Softplus 往往是更好的选择。

两者都试试。做实验。让您的具体问题来指引选择。

想了解更多?请查看以下优质资源:

Dario Radečić

作者

Dario Radečić

常驻克罗地亚的高级数据科学家。顶级科技写作者,已发表 700 多篇文章,累计获得超过 1,000 万次阅读。著有《使用 TPOT 实现机器学习自动化》。

Softplus 常见问答

什么是 Softplus 激活函数?

Softplus 是一种平滑的激活函数,定义为 f(x) = ln(1 + e^x),可作为 ReLU 的可微近似。与在 0 处有尖角的 ReLU 不同,Softplus 在过渡点平滑弯曲。对较大的正输入,它返回接近输入本身的值;对负输入,它返回接近 0 的正值而非 0。这使其有助于防止神经网络中的神经元死亡问题。

我应该在何时用 Softplus 替代 ReLU?

当您在优化中需要梯度平滑性(例如使用二阶优化方法或假定损失曲面平滑的算法)时选择 Softplus。当模型需要非负输出(如计数数据或概率参数)以及在浅层网络中(哪怕损失一个神经元也会伤害性能)时也很理想。Softplus 适用于概率模型、贝叶斯框架,以及具有平滑目标函数的回归任务。不过,对于大型深层网络,以及更看重速度的标准计算机视觉或 NLP 任务,仍建议使用 ReLU。

Softplus 相比 ReLU 的主要优势是什么?

Softplus 的四大优势:其一,处处平滑可微,避免梯度不连续;其二,从不输出严格为 0,防止神经元死亡,所有神经元都能继续学习;其三,保证任意输入的输出非负;其四,更适合需要平滑、连续激活行为的任务,如回归与概率建模。连续的梯度流带来更稳定的权重更新和更好的训练收敛表现。

PyTorch 的 Softplus 中 beta 和 threshold 参数如何工作?

beta 参数控制 Softplus 曲线的平滑度——增大 beta 使函数更陡峭、更接近 ReLU;减小 beta 使函数更平滑、过渡更缓。threshold 参数用于防止大输入导致的数值上溢:当输入超过阈值时,从计算完整公式切换为直接返回输入。默认值(beta=1,threshold=20)适用于大多数场景。

Softplus 与 ReLU 的计算成本差异是什么?

Softplus 的计算成本高于 ReLU,因为它需要计算指数和对数(ln(1 + e^x)),而 ReLU 只需执行简单的取最大操作(max(0, x))。这些操作更慢,尤其是在包含成千上万个神经元的大型网络中需要执行数百万次时。这种计算开销会在同等硬件上增加 10–20% 的训练时间,这也是为什么在生产系统以及规模大、层次深的网络中,更偏好使用 ReLU 的原因。

神经网络为什么需要激活函数?

神经网络需要激活函数来为模型引入非线性。没有它,网络无论有多少层都只会执行线性变换,因而无法学习数据中的复杂模式或关系。激活函数让神经网络能够近似非线性函数,从而胜任图像识别、语言理解和决策等任务。

 
 

主题