目录
torch.nn.functional.selu
是 PyTorch 中的一个函数,用于逐元素应用缩放指数线性单元(Scaled Exponential Linear Unit, 简称SELU)激活函数。
SELU 激活函数是一种自归一化激活函数,它在一定程度上解决了深度神经网络中的梯度消失和梯度爆炸问题。SELU 的设计使得在使用此激活函数的神经网络中,层与层之间的输出自动地趋于零均值和单位方差,这有助于提高网络的训练稳定性。
input
(Tensor):输入的张量。inplace
(bool,默认为False):是否进行原地操作。如果为True,则直接在输入张量上修改,而不是创建一个新的张量。SELU 激活函数的数学表达式是:
SELU(x) = scale * (max(0, x) + min(0, α * (exp(x) - 1)))
其中:
α
(alpha)是一个预定的常数,约为 1.6732632423543772848170429916717。scale
是另一个预定的常数,约为 1.0507009873554804934193349852946。exp(x)
表示 x
的指数函数 e^x(e 是自然对数的底数)。函数中的 max(0, x)
和 min(0, α * (exp(x) - 1))
组合保证了当 x 为负时有一个平滑的负饱和状态,而 x 为正时的行为类似于线性函数。
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用SELU激活函数
output_tensor = F.selu(input_tensor)
# 输出结果
print("原始张量:", input_tensor)
print("SELU处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([-2.0000, 0.0000, 2.0000])
# SELU处理后的张量: tensor([-1.5202, 0.0000, 2.1014])
在这个示例中,SELU 函数根据其定义对每个元素进行了转换。正值得以保持,而负值经过特定的缩放和变换。
SELU 函数由于其自归一化特性,特别适用于构建深层网络,能够有效地维护各层输出的均值和方差,从而有助于改进网络的训练过程和稳定性。
torch.nn.functional.celu
是 PyTorch 框架中的一个函数,用于逐元素应用连续指数线性单元(Continuously Differentiable Exponential Linear Unit, 简称CELU)激活函数。
CELU 激活函数是 ELU(Exponential Linear Unit)激活函数的一种变体,提供了更平滑的负值部分的转换。与 ELU 类似,CELU 也可以帮助减少神经网络训练中的梯度消失问题,同时它的连续可微性在某些应用中可能更为有利。
input
(Tensor):输入的张量。alpha
(float,默认为1.0):CELU 激活函数的α值。这个参数影响负输入值的饱和级别。inplace
(bool,默认为False):是否进行原地操作。如果为True,则直接在输入张量上修改,而不是创建一个新的张量。CELU 激活函数的数学表达式是:
CELU(x) = max(0, x) + min(0, α * (exp(x / α) - 1))
这里的 exp(x / α)
表示 x / α
的指数函数 e^(x/α)。对于正值输入,CELU 函数的行为类似于线性函数。对于负值输入,CELU 提供一个平滑的过渡,其输出随着输入值的减小而逐渐饱和。
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用CELU激活函数
output_tensor = F.celu(input_tensor, alpha=1.0)
# 输出结果
print("原始张量:", input_tensor)
print("CELU处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([-2.0000, 0.0000, 2.0000])
# CELU处理后的张量: tensor([-0.8647, 0.0000, 2.0000])
?在这个示例中,正值保持不变,而负值按照 CELU 函数的定义进行了平滑转换。
torch.nn.functional.leaky_relu
是 PyTorch 框架中的一个函数,用于逐元素应用泄漏修正线性单元(Leaky Rectified Linear Unit, 简称LeakyReLU)激活函数。
LeakyReLU 激活函数是传统 ReLU 函数的一个变体,设计用来解决 ReLU 激活函数在负输入值时的“死神经元”问题。相较于 ReLU,LeakyReLU 允许一小部分负值激活,从而提供了更丰富的网络表达能力和更好的梯度流动。
input
(Tensor):输入的张量。negative_slope
(float,默认为0.01):控制负斜率的系数。这个值决定了当输入为负数时,输出的斜率。inplace
(bool,默认为False):是否进行原地操作。如果为True,则直接在输入张量上修改,而不是创建一个新的张量。LeakyReLU 激活函数的数学表达式是:
LeakyReLU(x) = max(0, x) + negative_slope * min(0, x)
这个函数保证了当 x 为正时,输出为 x 本身;而当 x 为负时,输出为 x 乘以一个很小的负斜率(negative_slope
),从而允许负值的激活。
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用LeakyReLU激活函数
output_tensor = F.leaky_relu(input_tensor, negative_slope=0.01)
# 输出结果
print("原始张量:", input_tensor)
print("LeakyReLU处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([-2.0000, 0.0000, 2.0000])
# LeakyReLU处理后的张量: tensor([-0.0200, 0.0000, 2.0000])
在这个示例中,正值保持不变,而负值被缩放了一个很小的负斜率(在这里是0.01)LeakyReLU 由于其在处理负值输入时的优势,特别适合用于那些需要更好处理负值激活的深度学习应用。
torch.nn.functional.leaky_relu_
是 PyTorch 框架中 torch.nn.functional.leaky_relu
函数的原地(in-place)版本。这个函数用于逐元素应用泄漏修正线性单元(Leaky Rectified Linear Unit, 简称LeakyReLU)激活函数,但它直接在输入张量上进行修改,而不是返回一个新的修改过的张量。
LeakyReLU 激活函数是为了解决 ReLU 函数在处理负输入值时的“死神经元”问题而设计的。与普通的 ReLU 相比,LeakyReLU 允许负值的一定程度的激活,从而提供更丰富的网络表达能力和改善梯度流。
input
(Tensor):要进行处理的输入张量。negative_slope
(float,默认为0.01):控制负斜率的系数,决定负值输入的输出斜率。由于 leaky_relu_
是一个原地操作函数,因此它没有 inplace
参数,因为其默认行为就是在原地修改输入的张量。
LeakyReLU 激活函数的数学表达式是:
LeakyReLU(x) = max(0, x) + negative_slope * min(0, x)
这个表达式确保了正值输出保持不变,而负值输出是其原始值乘以一个很小的系数(即 negative_slope
)。
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 原地应用LeakyReLU激活函数
F.leaky_relu_(input_tensor, negative_slope=0.01)
# 输出结果
print("LeakyReLU处理后的张量:", input_tensor)
# 输出将是:
# LeakyReLU处理后的张量: tensor([-0.0200, 0.0000, 2.0000])
在这个示例中,原地修改了张量,正值保持不变,而负值被缩放了一个很小的负斜率(在这里是0.01)。leaky_relu_
函数在处理大型数据集或需要节省内存时特别有用。然而,也要小心使用,以避免不必要的数据修改。
torch.nn.functional.prelu
是 PyTorch 框架中的一个函数,用于逐元素应用参数化修正线性单元(Parametric Rectified Linear Unit, 简称PReLU)激活函数。
PReLU 激活函数是 ReLU 函数的一种泛化,它引入了可学习的参数来控制负值的激活。这种设计允许网络在训练过程中自适应地学习负斜率,从而提高模型的灵活性和性能。
input
(Tensor):输入的张量。weight
(Tensor):可学习的权重参数,用于控制负值的激活斜率。weight
参数可以是标量或1-D张量。如果是1-D张量,其大小必须与输入的通道数匹配。对于高维输入,weight
可以在不使用普通广播语义的情况下扩展到与输入相同的形状。PReLU 激活函数的数学表达式是:
PReLU(x) = max(0, x) + weight * min(0, x)
这个函数保证了当 x 为正时,输出为 x 本身;而当 x 为负时,输出为 x 乘以可学习的权重 weight
。
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 创建一个可学习的权重
weight = torch.tensor([0.25])
# 应用PReLU激活函数
output_tensor = F.prelu(input_tensor, weight)
# 输出结果
print("PReLU处理后的张量:", output_tensor)
# PReLU处理后的张量: tensor([-0.5000, 0.0000, 2.0000])
在这个示例中,正值保持不变,而负值被乘以可学习的权重 weight
(在这里是0.25)进行调整。PReLU 激活函数特别适用于那些需要额外灵活性来处理负值输入的深度学习应用,如需要细微调节负激活斜率的场合。
torch.nn.functional.rrelu
是 PyTorch 框架中的一个函数,用于逐元素应用随机泄漏修正线性单元(Randomized Leaky Rectified Linear Unit, 简称RReLU)激活函数。
RReLU 激活函数是 LeakyReLU 的一种随机变体。它在训练过程中随机选择负斜率,增加了模型的正则化,有助于防止过拟合。在测试阶段,使用固定的斜率(即lower
和upper
的平均值)。
input
(Tensor):输入的张量。lower
(float,默认为1/8):负斜率的下界。upper
(float,默认为1/3):负斜率的上界。training
(bool,默认为False):指示是否在训练模式。在训练模式下,斜率是随机的;在评估模式下,斜率是固定的。inplace
(bool,默认为False):是否进行原地操作。如果为True,则直接在输入张量上修改,而不是创建一个新的张量。RReLU 激活函数的数学表达式是:
RReLU(x) = max(0, x) + slope * min(0, x)
其中,slope
在训练阶段是从区间 [lower, upper] 中随机选取的,而在测试阶段则是使用这个区间的平均值。
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用RReLU激活函数
output_tensor = F.rrelu(input_tensor, lower=1./8, upper=1./3, training=True)
# 输出结果
print("原始张量:", input_tensor)
print("RReLU处理后的张量:", output_tensor)
输出结果将展示负值输入的随机激活斜率效果。由于斜率是随机的,每次运行的输出可能会有所不同。RReLU 激活函数由于其随机性,特别适用于需要额外正则化以防止过拟合的深度学习应用。
torch.nn.functional.rrelu_
是 PyTorch 中 torch.nn.functional.rrelu
函数的原地(in-place)版本。这个函数用于逐元素应用随机泄漏修正线性单元(Randomized Leaky Rectified Linear Unit, 简称RReLU)激活函数,但与标准的 rrelu
函数不同的是,它直接在输入张量上进行修改,而不是返回一个新的修改过的张量。
RReLU 激活函数是 LeakyReLU 的随机版本,用于增加模型的正则化,减少过拟合风险。它在训练期间随机选择负斜率,在测试期间使用固定斜率。
input
(Tensor):要进行处理的输入张量。lower
(float,默认为1/8):负斜率的下界。upper
(float,默认为1/3):负斜率的上界。training
(bool,默认为False):指示是否在训练模式。训练模式下,斜率是随机的;评估模式下,斜率是固定的。RReLU 激活函数的数学表达式是:
RReLU(x) = max(0, x) + slope * min(0, x)
其中,slope
在训练模式下从 [lower, upper] 区间内随机选择,在评估模式下则使用区间的平均值。
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 原地应用RReLU激活函数
F.rrelu_(input_tensor, lower=1./8, upper=1./3, training=True)
# 输出结果
print("RReLU处理后的张量:", input_tensor)
由于 rrelu_
是原地操作,input_tensor
的值将直接被修改。在训练模式下,输出的负斜率是随机的,每次运行可能得到不同的结果。rrelu_
函数在处理大型数据集时尤其有用,因为它可以减少内存使用。
torch.nn.functional.glu
是 PyTorch 框架中的一个函数,用于应用门控线性单元(Gated Linear Unit, 简称GLU)。
GLU 是一种在深度学习中用于增强网络表示能力的激活函数。它通过将输入张量在指定维度上分成两半,并对其中一半应用 Sigmoid 函数,然后将两部分进行元素级的乘积操作,从而实现门控机制。这种机制有助于网络自动学习重要的特征,并抑制不重要的特征。
input
(Tensor):输入的张量。dim
(int,默认为-1):沿着哪个维度对输入张量进行切分。默认情况下,它在最后一个维度上进行切分。GLU 激活函数的数学表达式是:
GLU(a, b) = a ? σ(b)
其中:
input
被沿着维度 dim
分为两个张量 a
和 b
。σ
表示 Sigmoid 激活函数。?
表示 a
和 σ(b)
之间的元素级乘积。import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.randn(4, 2) # 假设维度为 [4, 2]
# 应用GLU激活函数
output_tensor = F.glu(input_tensor, dim=1)
# 输出结果
print("原始张量:", input_tensor)
print("GLU处理后的张量:", output_tensor)
在这个示例中,input_tensor
被分成两个相同大小的部分,然后通过 GLU 函数进行处理。由于 GLU 的特性,输出张量的大小在 dim
指定的维度上会减半。?
torch.nn.functional.gelu
是 PyTorch 中的一个函数,用于应用高斯误差线性单元(Gaussian Error Linear Unit, 简称GELU)激活函数。
GELU 激活函数在深度学习中用于提高模型的表达能力。它通过结合输入的线性变换和高斯分布的累积分布函数(CDF),在一定程度上平衡了线性和非线性特性。GELU 已被证实在多种网络架构中有效,特别是在自然语言处理(NLP)领域。
input
(Tensor):输入的张量。approximate
(字符串,默认为'none'):指定是否使用近似方法计算 GELU。可选值为'none'和'tanh'。GELU 激活函数的数学表达式是:
当 approximate='none'
时:
GELU(x) = x * Φ(x)
Φ(x)
是标准正态分布的累积分布函数(CDF)。当 approximate='tanh'
时:
GELU(x) = 0.5 * x * (1 + tanh(√(2/π) * (x + 0.044715 * x^3)))
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用GELU激活函数
output_tensor = F.gelu(input_tensor)
# 输出结果
print("原始张量:", input_tensor)
print("GELU处理后的张量:", output_tensor)
输出结果将展示 GELU 函数如何平滑处理输入张量的每个元素。GELU 函数由于其能够更好地捕捉输入数据的复杂性,特别适用于需要复杂特征表达的深度学习模型。
本篇博客探讨了 PyTorch 中多种高级激活函数,包括 SELU、CELU、LeakyReLU、PReLU、RReLU、GLU 和 GELU。每种激活函数都具有独特的特性和用途,旨在增强深度神经网络的表现能力和学习效率。从 SELU 的自归一化特性到 GELU 的平滑高斯特性,这些激活函数为处理复杂的非线性问题提供了强大的工具。通过详细解释每个函数的工作原理、参数和实际使用示例。应用这些高级激活函数的知识,无论是在自然语言处理还是图像识别等领域,这些激活函数都是构建强大和高效深度学习模型的关键组成部分。