多年来,ReLU 一直是深度学习中的默认激活函数,这是有理由的——它简单且在大多数情况下效果良好。但当神经元在训练中开始输出 0 时,它们就会停止学习,梯度变为 0,反向传播无法更新其权重。在更深的网络中,这个问题会影响多个神经元,降低模型捕捉数据模式的能力。
通俗点说:您的网络不再学习了。
Softplus 提供了一种平滑且可微分的替代方案,能解决这一问题,同时保留了 ReLU 的大部分优点。它在正输入上近似 ReLU 的行为,但对负值给出非零梯度,从而使神经元在整个训练过程中保持活跃。
本文将介绍 Softplus 是什么、它在数学上与 ReLU 的对比,以及在何种情况下应优先选用它而不是其他激活函数。
如果您刚接触深度学习,请先查看我们的深度指南: 神经网络中的激活函数 。
什么是 Softplus 函数?
Softplus 是一种平滑的激活函数,可作为 ReLU 的可微近似。
该函数接受任意实数作为输入,并输出一个正值。Softplus 不像 ReLU 那样在 0 处有一个尖角;它在该过渡点平滑地弯曲。
其数学定义如下:
其中:
x 为输入值
e 为欧拉常数(约为 2.718)
ln 为自然对数
对较大的正输入,Softplus 的输出接近输入本身;对负输入,它输出接近于 0 的正值而非 0。
Softplus 的导数
Softplus 的导数是逻辑 Sigmoid 函数 。
这意味着:
其中 σ(x) 是您很可能见过的 Sigmoid 函数。
这一导数性质使 Softplus 在 反向传播 中需要平滑梯度流时非常有用。梯度永不降至 0,意味着神经元始终可以更新权重并持续学习。
极值处的行为
Softplus 在输入为大型正数或大型负数时表现不同。
对于较大的正值:
对于较大的负值:
这也是 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__) 技术支持
基本用法如下:
softplus = nn. Softplus( beta= 1 , threshold= 20 )
x = torch. tensor( [ - 2.0 , - 1.0 , 0.0 , 1.0 , 2.0 ] )
output = softplus( x)
print ( output) 技术支持
足够简单。不过这两个参数——beta 和 threshold——会改变函数的行为。我们来深入了解。
beta 参数
beta 参数控制 Softplus 曲线的平滑程度。
增大 beta 时,函数更陡峭,更接近 ReLU;减小它时,函数更平滑、过渡更缓。代码示例如下:
x = torch. tensor( [ - 2.0 , - 1.0 , 0.0 , 1.0 , 2.0 ] )
softplus_steep = nn. Softplus( beta= 2 , threshold= 20 )
output_steep = softplus_steep( x)
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) 技术支持
默认的 beta=1 适用于大多数情况。只有在需要针对特定任务微调激活的“锋利度”时,您才会调整它。
threshold 参数
threshold 参数用于防止大输入导致的数值上溢。
还记得计算 e^x 在 x 很大时会“爆炸”吗?当输入超过阈值时,PyTorch 会从计算完整的 Softplus 公式切换为直接返回输入值:
softplus = nn. Softplus( beta= 1 , threshold= 20 )
large_input = torch. tensor( [ 25.0 ] )
print ( softplus( large_input) ) 技术支持
默认的 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 往往是更好的选择。
两者都试试。做实验。让您的具体问题来指引选择。
想了解更多?请查看以下优质资源:
多年来,ReLU 一直是深度学习中的默认激活函数,这是有理由的——它简单且在大多数情况下效果良好。但当神经元在训练中开始输出 0 时,它们就会停止学习,梯度变为 0,反向传播无法更新其权重。在更深的网络中,这个问题会影响多个神经元,降低模型捕捉数据模式的能力。
通俗点说:您的网络不再学习了。
Softplus 提供了一种平滑且可微分的替代方案,能解决这一问题,同时保留了 ReLU 的大部分优点。它在正输入上近似 ReLU 的行为,但对负值给出非零梯度,从而使神经元在整个训练过程中保持活跃。
本文将介绍 Softplus 是什么、它在数学上与 ReLU 的对比,以及在何种情况下应优先选用它而不是其他激活函数。
如果您刚接触深度学习,请先查看我们的深度指南:神经网络中的激活函数。
什么是 Softplus 函数?
Softplus 是一种平滑的激活函数,可作为 ReLU 的可微近似。
该函数接受任意实数作为输入,并输出一个正值。Softplus 不像 ReLU 那样在 0 处有一个尖角;它在该过渡点平滑地弯曲。
其数学定义如下:
其中:
对较大的正输入,Softplus 的输出接近输入本身;对负输入,它输出接近于 0 的正值而非 0。
Softplus 的导数
Softplus 的导数是逻辑Sigmoid 函数。
这意味着:
其中 σ(x) 是您很可能见过的 Sigmoid 函数。
这一导数性质使 Softplus 在反向传播中需要平滑梯度流时非常有用。梯度永不降至 0,意味着神经元始终可以更新权重并持续学习。
极值处的行为
Softplus 在输入为大型正数或大型负数时表现不同。
对于较大的正值:
对于较大的负值:
这也是 Softplus 能很好近似 ReLU 的原因。当 x 为正且较大时,两者返回的值近似相同。
差异体现在负输入上。ReLU 对负输入输出严格为 0,而 Softplus 输出很小的正值。
这种细小差异可以避免神经元死亡问题。使用 Softplus 的神经元能够从负激活中恢复,因为其梯度从不完全消失。
数学与计算特性
Softplus 具有一些需要了解的数学特性,使其不仅仅是 ReLU 的平滑版本。
平滑性与可微性
Softplus 在每一点都可无限次求导。
这意味着您可以进行任意次数的求导且函数始终平滑。用数学术语说,它是解析函数。
而 ReLU 在 0 处有“折点”——一个导数不存在的尖角。这一不可导点会对假定梯度平滑的优化算法造成影响。
在深度学习中,当损失曲面平滑时,优化通常效果更好。如果您使用二阶优化方法或依赖梯度平滑过渡的算法,Softplus 能提供所需的平滑性。
数值稳定性
当输入很大时,计算指数会导致上溢问题。
深度学习框架通过一个
threshold参数来处理。当输入超过该阈值时,函数会从计算对数切换为直接返回线性输出。其工作方式如下:
这可防止数值上溢,同时保持所需的行为。对于较大的正输入,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 版本如下:
基本用法如下:
足够简单。不过这两个参数——
beta和threshold——会改变函数的行为。我们来深入了解。beta 参数
beta参数控制 Softplus 曲线的平滑程度。增大
beta时,函数更陡峭,更接近 ReLU;减小它时,函数更平滑、过渡更缓。代码示例如下:默认的
beta=1适用于大多数情况。只有在需要针对特定任务微调激活的“锋利度”时,您才会调整它。threshold 参数
threshold参数用于防止大输入导致的数值上溢。还记得计算
e^x在 x 很大时会“爆炸”吗?当输入超过阈值时,PyTorch 会从计算完整的 Softplus 公式切换为直接返回输入值:默认的
threshold=20适用于大多数场景。在这一点上,Softplus 已近似线性,因此切换并不会对结果造成实质影响。何时使用 Softplus
当您需要用于优化的梯度平滑性时选择 Softplus。如果您在使用二阶优化方法或假定损失曲面平滑的算法,Softplus 能提供这些方法所依赖的连续导数。
在模型需要非负输出时使用它。计数数据、强度值和概率参数都必须保持为正。Softplus 可以自然而然地做到这一点,无需额外约束。
浅层网络 比深层网络更能从 Softplus 中受益。层数很少时,即便丢失一个神经元(死 ReLU 问题)也会伤害性能。Softplus 让所有神经元保持活跃并持续学习。
在概率模型与贝叶斯框架中也可选择 Softplus。其平滑梯度与熵的关联使数学操作更简洁。基于能量的模型也受益于 Softplus 的连续特性。
在需要解释连续梯度的模型中,Softplus 的表现更佳。如果您要分析网络对输入变化的响应或研究梯度流,连续的导数会比 ReLU 的尖锐过渡提供更清晰的洞见。
何时仍应使用 ReLU
别仅仅因为 Softplus 在纸面上看起来更好,或因为它是个“新潮”的选择就切换过去。
对大多数项目,从 ReLU 起步。当遇到 Softplus 的特性能解决的具体问题时,再切换。
结论
简而言之,需要时 Softplus 为您提供一种平滑的 ReLU 替代方案。
它不会取代 ReLU 成为默认激活函数——也没有必要。Softplus 解决特定问题:浅层网络的神经元死亡、需要非负输出的模型,以及在优化中梯度平滑性很重要的任务。
您将以计算速度为代价,换来更好的数学性质。对大多数深度学习项目而言,ReLU 的简单与高速更占优。但在概率模型、贝叶斯框架,或具有平滑目标函数的回归任务中,Softplus 往往是更好的选择。
两者都试试。做实验。让您的具体问题来指引选择。
想了解更多?请查看以下优质资源: