什么是激活函数
激活函数,属于神经网络中的概念。
激活函数,就像神经元的开关,决定了输入信号能否被传递,以及以什么形式传递。
为应对不同的场景,激活函数不断发展出了各种实现。它们存在的意义,就是为信号传递赋予不同种类的“非线性”特征,从而让神经网络能够表达更为丰富的含义。
本文旨在梳理常见的 40 多种激活函数(也包含少量经典的输出层函数)。
说明
本文将简要介绍激活函数的概念和使用场景,并列出其数学公式,然后基于Python进行可视化实现。最后一节则以表格的形式,从多个维度对比了其中最为经典的 20 多个激活函数,以期为读者提供选型参考。
本文所有代码实现均基于Jupyter NoteBook,感兴趣的读者可以后台留言获取完整ipynb文件。
为使得各激活函数的代码实现更为简洁,首先做一些初始化操作,如导入对应Python库、定义对应的绘图函数等,如下:- # -*- coding: utf-8 -*-<br ><br ># 导入必要的库<br>import numpy as np<br>import matplotlib.pyplot as plt<br>from scipy.special import expit as sigmoid # scipy 的 sigmoid<br>import warnings<br>warnings.filterwarnings("ignore")<br><br># 设置中文字体和图形样式<br>plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']<br>plt.rcParams['axes.unicode_minus'] = False<br>plt.style.use('seaborn-v0_8') # 使用美观样式<br>
复制代码- # 定义输入范围<br>x = np.linspace(-10, 10, 1000)<br><br># 定义画图函数(单张图)<br>def plot_activation(func, grad_func, name):<br> y = func(x)<br> dy = grad_func(x)<br> plt.figure(figsize=(8, 5))<br> plt.plot(x, y, label=name, linewidth=1.5)<br> plt.plot(x, dy, label=f"{name}'s derivative", linestyle='--', linewidth=1.5)<br> plt.title(f'{name} Function and Its Derivative')<br> plt.legend()<br> plt.grid(True)<br> plt.axhline(0, color='black', linewidth=0.5)<br> plt.axvline(0, color='black', linewidth=0.5)<br> plt.show()<br><br><br># 定义画图函数(多张图,用于对比不同参数的效果)<br>def plot_activations(functions, x):<br> plt.figure(figsize=(10, 7))<br> for func, grad_func, name in functions:<br> y = func(x)<br> dy = grad_func(x)<br> plt.plot(x, y, label=name, linewidth=1.5)<br> plt.plot(x, dy, label=f"{name}'s derivative", linestyle='--', linewidth=1.5)<br><br> plt.title('Activation Functions and Their Derivatives')<br> plt.legend()<br> plt.grid(True)<br> plt.axhline(0, color='black', linewidth=0.5)<br> plt.axvline(0, color='black', linewidth=0.5)<br> plt.show()<br>
复制代码 接下来,让我们开始吧!
经典激活函数
Sigmoid
适用于二分类问题的输出层,将输出压缩到 (0,1) 区间表示概率。不推荐用于隐藏层,因易导致梯度消失。
公式
实现- def sigmoid(x):<br> return 1 / (1 + np.exp(-x))<br><br>def sigmoid_grad(x):<br> s = sigmoid(x)<br> return s * (1 - s)<br><br>plot_activation(sigmoid, sigmoid_grad, 'Sigmoid')<br>
复制代码 图像
Tanh(双曲正切)
Tanh 输出零中心化,使梯度更新方向更均衡,收敛更快,是一种比 Sigmoid 更优的激活函数,适合隐藏层使用,尤其在 RNN 中仍有应用。但它仍可能梯度消失。
公式
实现- def tanh(x):<br> return np.tanh(x)<br><br>def tanh_grad(x):<br> return 1 - np.tanh(x)**2<br><br>plot_activation(tanh, tanh_grad, 'Tanh')<br>
复制代码 图像
Linear
主要用于回归任务的输出层,保持输出为原始实数,不进行非线性变换。
不适合用在隐藏层(否则整个网络等价于单层线性模型,无法学习非线性特征)。
在某些特定模型(如自编码器的中间层或策略网络)中也可能使用。
公式
实现- def linear(x):<br> return x<br><br>def linear_grad(x):<br> return np.ones_like(x)<br><br>plot_activation(linear, linear_grad, 'Linear')<br>
复制代码 图像
Softmax
多分类问题的输出层标准激活函数,将输出转化为概率分布。不用于隐藏层。
公式
实现- from mpl_toolkits.mplot3d import Axes3D<br><br>def softmax(x):<br> exp_x = np.exp(x - np.max(x, axis=0, keepdims=True)) # 数值稳定<br> return exp_x / np.sum(exp_x, axis=0, keepdims=True)<br><br>def softmax_grad(x):<br> s = softmax(x).reshape(-1, 1)<br> return np.diagflat(s) - np.dot(s, s.T) # Jacobian矩阵<br><br># 生成输入数据(二维,便于可视化)<br>x = np.linspace(-10, 10, 100)<br>y = np.linspace(-10, 10, 100)<br>X, Y = np.meshgrid(x, y)<br>inputs = np.vstack([X.ravel(), Y.ravel()]).T<br><br># 计算Softmax输出(取第一个维度作为输出值,因为Softmax输出是概率分布)<br>outputs = np.array([softmax(p)[0] for p in inputs]).reshape(X.shape)<br><br># 计算梯度(取Jacobian矩阵的第一个对角线元素)<br>gradients = np.array([softmax_grad(p)[0, 0] for p in inputs]).reshape(X.shape)<br><br># 绘制Softmax函数<br>fig = plt.figure(figsize=(12, 5))<br><br># 1. Softmax函数图像<br>ax1 = fig.add_subplot(121, projection='3d')<br>ax1.plot_surface(X, Y, outputs, cmap='viridis', alpha=0.8)<br>ax1.set_title('Softmax (First Output Dimension)')<br>ax1.set_xlabel('x1')<br>ax1.set_ylabel('x2')<br>ax1.set_zlabel('P(x1)')<br><br># 2. Softmax梯度图像<br>ax2 = fig.add_subplot(122, projection='3d')<br>ax2.plot_surface(X, Y, gradients, cmap='plasma', alpha=0.8)<br>ax2.set_title('Gradient of Softmax (∂P(x1)/∂x1)')<br>ax2.set_xlabel('x1')<br>ax2.set_ylabel('x2')<br>ax2.set_zlabel('Gradient')<br><br>plt.tight_layout()<br>plt.show()<br>
复制代码 图像
ReLU 函数及其变体
ReLU(Rectified Linear Unit)
中文名称是线性整流函数,是在神经网络中常用的激活函数。通常意义下,其指代数学中的斜坡函数。
公式
实现- def relu(x):<br> return np.maximum(0, x)<br><br>def relu_grad(x):<br> return (x > 0).astype(float)<br><br>plot_activation(relu, relu_grad, 'RelU')<br>
复制代码 图像
ReLU6
ReLU6 是 ReLU 的有界版本,输出限制在 [0, 6] 区间。
主要用于移动端和轻量级网络(如 MobileNet、EfficientNet 的早期版本),其有界性有助于提升低精度推理(如量化)时的稳定性。
也常见于强化学习(如 DQN)中,用于限制输出范围,防止训练波动。
公式
或:
实现- def relu6(x):<br> return np.minimum(np.maximum(0, x), 6)<br><br>def relu6_grad(x):<br> dx = np.zeros_like(x)<br> dx[(x > 0) & (x < 6)] = 1<br> return dx<br><br>plot_activation(relu6, relu6_grad, 'ReLU6')<br>
复制代码 图像
RReLU(Randomized ReLU)
RReLU是一种在训练时使用随机斜率的变体ReLU激活函数,而在测试时则采用固定的斜率。其主要目的是为了减少过拟合并解决“死亡ReLU”问题。
由于 RReLU 在训练时使用的是一个区间内的随机值,而测试时使用的是固定值。为了简化起见,这里使用一个确定性的斜率(例如训练过程中使用的平均斜率)。
以下代码实现了 RReLU 函数及其导数,并使用了一个介于 lower 和 upper 之间的固定斜率来代替随机选择的过程,以便进行可视化。
在实际应用中,对于每个负输入值,斜率会在给定范围内随机选择,但在测试或推理阶段,通常会使用所有可能斜率的平均值。
实现- def leaky_relu(x, alpha=0.01):<br> return np.where(x > 0, x, x * alpha)<br><br>def leaky_relu_grad(x, alpha=0.1):<br> dx = np.ones_like(x)<br> dx[x < 0] = alpha<br> return dx<br><br>plot_activation(leaky_relu, leaky_relu_grad, 'Leaky ReLU')<br>
复制代码 图像
SELU(Scaled Exponential Linear Units)
SELU 是一种自归一化激活函数,它能够使得神经网络的输出在一定条件下自动趋近于零均值和单位方差,从而有助于加速训练过程,并且有可能提高模型的性能。
SELU激活函数是由Günter Klambauer等人在2017年的论文《Self-Normalizing Neural Networks》中提出的。
公式
实现- def prelu(x, alpha=0.25):<br> return np.where(x > 0, x, alpha * x)<br><br>def prelu_grad(x, alpha=0.25):<br> return np.where(x > 0, 1, alpha)<br><br>functions_to_plot = [<br> (lambda x: prelu(x, 0.1), lambda x: prelu_grad(x, 0.1), 'PReLU α=0.1'),<br> (lambda x: prelu(x, 0.25), lambda x: prelu_grad(x, 0.25), 'PReLU α=0.25'),<br> (lambda x: prelu(x, 0.5), lambda x: prelu_grad(x, 0.5), 'PReLU α=0.5')<br>]<br>plot_activations(functions_to_plot, x)<br><br>
复制代码 图像
CELU(Continuously Differentiable Exponential Linear Unit)
CELU 是 ELU 的改进版本,保证了在 x = 0 处连续可导(平滑性优于 ELU),有助于优化稳定性。
与 ELU 类似,能产生负值激活,促进神经元平均输出接近零,适合深层网络训练。在某些对梯度平滑性要求较高的任务中可作为 ReLU、ELU 的替代选择,但计算成本略高。
公式
实现- def rrelu(x, lower=1/8., upper=1/3.):<br> # 在实际应用中,这里的a应该是在[lower, upper]之间随机选取的<br> # 但为了绘图方便,我们取平均值作为固定的a<br> a = (lower + upper) / 2<br> return np.where(x >= 0, x, a * x)<br><br>def rrelu_grad(x, lower=1/8., upper=1/3.):<br> a = (lower + upper) / 2<br> dx = np.ones_like(x)<br> dx[x < 0] = a<br> return dx<br><br>plot_activation(lambda x: rrelu(x), lambda x: rrelu_grad(x), 'RReLU')<br>
复制代码 图像
Bent Identity
Bent Identity 是一种平滑、非单调、可微、无上界的激活函数,输出接近输入值但带有轻微非线性弯曲(“bent”)。
它适用于回归任务或自编码器的隐藏层,尤其在需要保留输入结构的同时引入轻微非线性变换的场景。其导数始终大于 0.5,避免梯度消失,适合浅层网络或需要稳定梯度的训练过程。
但由于计算涉及平方根,速度较慢,不常用于大规模深度网络。
另可参阅:https://www.gabormelli.com/RKB/Bent_Identity_Activation_Function
公式
实现- def elu(x, alpha=1.0):<br> return np.where(x > 0, x, alpha * (np.exp(x) - 1))<br><br>def elu_grad(x, alpha=1.0):<br> return np.where(x > 0, 1, elu(x, alpha) + alpha)<br><br>functions_to_plot = [<br> (lambda x: elu(x, 0.1), lambda x: elu_grad(x, 0.1), 'ELU α=0.1'),<br> (lambda x: elu(x, 0.25), lambda x: elu_grad(x, 0.25), 'ELU α=0.25'),<br> (lambda x: elu(x, 0.5), lambda x: elu_grad(x, 0.5), 'ELU α=0.5'),<br> (lambda x: elu(x, 1), lambda x: elu_grad(x,1), 'ELU α=1'),<br> (lambda x: elu(x, 2), lambda x: elu_grad(x,2), 'ELU α=2')<br>]<br>plot_activations(functions_to_plot, x)<br><br>
复制代码 图像
门控与组合型激活函数
GLU (Gated Linear Unit)
GLU 是一种门控机制激活函数,通过将输入的一部分作为“门”来调制另一部分的输出,增强了模型的表达能力。
GLU 广泛应用于 Transformer 变体(如 GLU Variants in GLU-Transformer)、序列模型(如 CNN-based NLP 模型)和语音任务中。
相比传统激活函数,GLU 能更灵活地控制信息流动,提升建模能力。常见变体包括 SwiGLU、ReLU-Glu 等,在大模型(如 Llama 系列)中表现优异。
公式
实现- # SELU 参数(论文中推荐值)<br>lambda_s = 1.0507009873554804934193349852946<br>alpha_s = 1.673261549988240216825385979984<br><br>def selu(x, lambda_=1.0507009873554804934193349852946, alpha=1.673261549988240216825385979984):<br> return lambda_ * np.where(x > 0, x, alpha * (np.exp(x) - 1))<br><br>def selu_grad(x, lambda_=1.0507009873554804934193349852946, alpha=1.673261549988240216825385979984):<br> return lambda_ * np.where(x > 0, 1, alpha * np.exp(x))<br><br># 调用plot_activation绘制SELU及其导数<br>plot_activation(lambda x: selu(x), lambda x: selu_grad(x), 'SELU')<br>
复制代码 图像
Maxout
Maxout 是一种分段线性激活函数,定义为多个线性变换的最大值。它是一种可学习的分段线性激活函数,具有很强的表达能力——理论上,只要有足够多的片段,它可以逼近任意凸函数。
它与 Dropout 结合使用时表现优异,曾广泛用于全连接网络。但由于每个 Maxout 单元需要 k 倍参数(即 k 个 W_i, b_i),参数量大、计算开销高,因此在现代 CNN 或大模型中较少使用。适合对模型表达力要求高、但对计算资源不敏感的研究性任务。
公式
实现- def celu(x, alpha=1.0):<br> return np.where(x > 0, x, alpha * (np.exp(x / alpha) - 1))<br><br>def celu_grad(x, alpha=1.0):<br> dx = np.ones_like(x)<br> dx[x <= 0] = np.exp(x[x <= 0] / alpha)<br> return dx<br><br>plot_activation(celu, celu_grad, "CELU")<br>
复制代码 图像
SReLU (S-shaped Rectified Linear Unit)
SReLU 是一种参数自适应的 S 形激活函数,能够根据数据自动学习激活曲线的形状,兼具线性和饱和特性。适用于需要灵活非线性变换的全连接网络或卷积网络,在某些图像分类和回归任务中表现优于 ReLU 和 ELU。
其设计目标是模拟生物神经元的响应特性,在深度模型中可提升表达能力。
但由于引入了四个可学习参数(每通道或共享),增加了模型复杂度,训练成本较高,目前应用不如 ReLU 或 GELU 广泛。
公式
实现- def gelu(x):<br> return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * np.power(x, 3))))<br><br>def gelu_grad(x):<br> # 导数计算较为复杂,这里简化处理<br> return 0.5 * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * np.power(x, 3)))) + \<br> 0.5 * x * (1 - np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * np.power(x, 3)))**2) * \<br> (np.sqrt(2 / np.pi) * (1 + 0.134145 * np.power(x, 2)))<br><br>plot_activation(gelu, gelu_grad, "GELU")<br>
复制代码 图像
自动化搜索与结构创新
TanhExp (Tanh Exponential Activation)
TanhExp 是一种结合指数与双曲正切的自门控激活函数,在保持 ReLU 风格的同时增强非线性表达能力,适合对性能有更高要求的视觉任务。
TanhExp 是 Xinyu Liu等人于 2020 年在论文《TanhExp: A smooth activation function with high convergence speed for lightweight neural networks》中提出的。
公式
实现- def swish(x, beta=1):<br> return x / (1 + np.exp(-beta*x))<br><br>def swish_grad(x, beta=1):<br> s = 1 / (1 + np.exp(-beta*x))<br> f = x * s<br> return f + (s * (1 - f)) * beta<br><br>plot_activation(swish, swish_grad, "Swish")<br><br>
复制代码 图像
PAU (Power Activation Unit)
PAU 是一种基于幂函数的可学习激活函数。
其主要应用于适合研究场景,因为计算开销大、稳定性差,不推荐用于主流深度学习模型或大规模网络。
在实际应用中,更推荐使用 Swish、GELU 等高效且稳定的激活函数。
公式
实现- def eswish(x, beta=1.5):<br> return beta * x * sigmoid(x)<br><br>def eswish_grad(x, beta=1.5):<br> s = sigmoid(x)<br> return beta * s * (1 + x * (1 - s))<br><br>plot_activation(lambda x: eswish(x, beta=1.5), lambda x: eswish_grad(x, beta=1.5), 'E-Swish')<br>
复制代码 图像
Learnable Sigmoid
Learnable Sigmoid 是标准 Sigmoid 的可学习扩展版本。
实现- def mish(x):<br> return x * np.tanh(np.log(1 + np.exp(x)))<br><br>def mish_grad(x):<br> sp = np.log(1 + np.exp(x))<br> tanh_sp = np.tanh(sp)<br> sech2_sp = 1 - tanh_sp**2<br> return tanh_sp + x * sech2_sp * sigmoid(x)<br><br>plot_activation(mish, mish_grad, 'Mish')<br>
复制代码 图像
SwiGLU
SwiGLU 是当前大语言模型中最流行的门控机制之一。它是 GLU 家族 的一种高性能变体,使用 Swish(或 SiLU) 作为门控函数,结合了门控机制与平滑非线性的优势。
主要应用于:
- Llama 系列大模型(Llama, Llama2, Llama3)的前馈网络(FFN)中,作为核心激活结构;
- 其他现代大语言模型(如 Phi-2、Falcon)中也有使用;
- 替代传统的 ReLU + Linear 或 GeGLU 结构,提升模型表达能力;
- 特别适合自回归语言建模任务。
优点:
- 门控机制允许模型动态控制信息流动,增强非线性表达;
- Swish 函数平滑且无上界、有下界,梯度特性优于 ReLU 和 Sigmoid;
- 在相同参数量下,SwiGLU 比 ReLU、GeLU、GeGLU 等具有更强的建模能力;
公式
实现- def sqnl(x):<br> return np.where(x > 2, 1,<br> np.where(x >= 0, x - (x**2)/4,<br> np.where(x >= -2, x + (x**2)/4, -1)))<br><br>def sqnl_grad(x):<br> return np.where(x > 2, 0,<br> np.where(x >= 0, 1 - x/2,<br> np.where(x >= -2, 1 + x/2, 0)))<br><br>plot_activation(sqnl, sqnl_grad, 'SQNL')<br>
复制代码 图像
ReGLU
ReGLU 是 GLU(Gated Linear Unit) 家族的一种变体,使用 ReLU 作为门控函数,结合了门控机制与稀疏非线性的特性。
它是在 Google 的《GLU Variants Improve Transformer》中提出的。
主要应用于:
- Transformer 的前馈网络(FFN) 中,作为传统 Linear -> ReLU -> Linear 结构的改进;
- 在某些高效模型或早期 GLU 变体研究中出现;
- 与 GeGLU、SwiGLU 并列,作为探索不同门控函数性能的基准之一。
优点:
- 门控机制允许模型动态控制信息流动,增强表达能力;
- ReLU 计算简单、速度快,无指数或 erf 运算,效率高;
- 相比标准 FFN,引入了特征交互,提升建模能力。
缺点:
- 与ReLU 类似,存在“神经元死亡”问题,可能导致部分门控通道永久关闭;
- 不如 GeGLU 或 SwiGLU 平滑,在训练稳定性上略逊一筹;
- 实验表明,在大模型中性能通常低于 SwiGLU 和 GeGLU。
公式
实现- def bent_identity(x):<br> return (np.sqrt(x**2 + 1) - 1) / 2 + x<br><br>def bent_identity_grad(x):<br> return x / (2 * np.sqrt(x**2 + 1)) + 1<br><br>plot_activation(bent_identity, bent_identity_grad, 'Bent Identity')<br>
复制代码 图像
轻量化与边缘设备专用
Hard Swish
Hard Swish 是 Swish 函数的分段线性近似,计算效率高,无指数或 sigmoid 操作,特别适合移动端和嵌入式设备上的深度网络(如 MobileNetV3、EfficientNet-Lite)。
在保持接近 Swish 性能的同时,可以显著降低计算开销。一般用于资源受限场景下的隐藏层激活。
公式
实现- import numpy as np<br>import matplotlib.pyplot as plt<br>from mpl_toolkits.mplot3d import Axes3D<br><br><br>def glu_2d(x):<br> """二维输入版本的GLU"""<br> a, b = x[..., 0], x[..., 1] # 分割输入的两个维度<br> return a * sigmoid(b) <br><br>def plot_glu_2d():<br> # 创建二维输入网格<br> x = np.linspace(-4, 4, 50)<br> y = np.linspace(-4, 4, 50)<br> X, Y = np.meshgrid(x, y)<br> xy = np.stack([X, Y], axis=-1) # 组合成(50,50,2)的输入<br> <br> # 计算GLU输出<br> Z = glu_2d(xy)<br> <br> # 3D可视化<br> fig = plt.figure(figsize=(12, 6))<br> <br> # 1. 激活函数曲面<br> ax1 = fig.add_subplot(121, projection='3d')<br> ax1.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)<br> ax1.set_title('GLU: a * σ(b)')<br> ax1.set_xlabel('Input a')<br> ax1.set_ylabel('Input b')<br> ax1.set_zlabel('Output')<br> <br> # 2. 梯度场切片(固定b=0时的梯度)<br> ax2 = fig.add_subplot(122)<br> b_zero_idx = np.abs(y).argmin() # 找到b=0的索引<br> grad_at_b0 = Z[b_zero_idx] * (1 - Z[b_zero_idx]) # ∂(aσ(b))/∂a = σ(b)<br> ax2.plot(x, grad_at_b0, label='∂GLU/∂a at b=0', color='blue')<br> ax2.plot(x, np.zeros_like(x), label='∂GLU/∂b at b=0', color='red') <br> ax2.set_title('Gradient Slices at b=0')<br> ax2.legend()<br> ax2.grid(True)<br> <br> plt.tight_layout()<br> plt.show()<br><br># 执行可视化<br>plot_glu_2d()<br>
复制代码 图像
LUT-based Activation
LUT-based Activation 是一种通用、灵活的非线性建模方法,将激活函数视为一个“黑箱”映射,通过查表实现,而非解析表达式。
主要应用于:
- 硬件加速与边缘计算:在 FPGA、ASIC 或低功耗芯片上,查表比计算 exp, tanh, erf 等函数更快、更节能;
- 模型压缩:用小规模 LUT 替代复杂激活函数(如 GELU、Swish),减少计算开销;
- 可学习激活函数:让网络自动学习最优的非线性形状(如 PULP、PAU 等);
- 神经拟态计算(Neuromorphic Computing):模拟生物神经元的非线性响应。
优点:
- 计算高效:O(1) 查表操作,适合资源受限设备;
- 表达能力强:理论上可逼近任意一维函数;
- 易于硬件实现:只需存储器和索引逻辑;
- 支持可学习机制:LUT 条目可作为参数训练。
缺点:
- 内存占用:高精度 LUT 需要大量存储(如 8-bit 精度需 256 项,10-bit 需 1024 项);
- 维度灾难:难以扩展到多维激活(如 (x,y) 映射),通常限于逐元素(element-wise)操作;
- 插值误差:对未在表中的值需插值(线性/最近邻),可能引入噪声;
- 训练挑战:稀疏梯度更新,需结合 STE(直通估计器)或平滑插值。
公式
实现- def maxout(x, w1=1.0, w2=-1.0, b1=0.0, b2=0.0):<br> """<br> Maxout 简化版(k=2)用于可视化:<br> f(x) = max(w1*x + b1, w2*x + b2)<br> <br> 常用设置:w1=1, w2=-1 → f(x) = max(x, -x) = |x|(绝对值)<br> """<br> return np.maximum(w1 * x + b1, w2 * x + b2)<br><br>def maxout_grad(x, w1=1.0, w2=-1.0, b1=0.0, b2=0.0):<br> """<br> Maxout 梯度:根据哪个线性函数被激活返回对应权重<br> """<br> linear1 = w1 * x + b1<br> linear2 = w2 * x + b2<br> return np.where(linear1 >= linear2, w1, w2)<br><br># 可视化:f(x) = max(x, -x) = |x|<br>plot_activation(lambda x: maxout(x, w1=1.0, w2=-1.0),<br> lambda x: maxout_grad(x, w1=1.0, w2=-1.0),<br> 'Maxout (k=2, |x|)')<br>
复制代码 图像
整体对比
下表从数学形式、输出范围、是否可导、是否零中心、计算成本、适用场景、优点、缺点等维度,总结了常用的 20 多种激活函数的性质。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |