目录
torch.nn.functional激活层详解
logsigmoid
torch.nn.functional.logsigmoid
是 PyTorch 框架中的一个函数,用于逐元素应用对数 Sigmoid(LogSigmoid)激活函数。
1. 函数用途
LogSigmoid 激活函数是 Sigmoid 函数的对数版本。它常用于将输入压缩到 (0, 1) 区间内的对数空间,从而提供了一种平滑的激活方式。这种激活函数特别适合于处理概率估计问题,例如在二元分类中将输出解释为概率。
2. 参数详解
input
(Tensor):输入的张量。
3. LogSigmoid函数的定义及数学解释
LogSigmoid 激活函数的数学表达式是:
LogSigmoid(x) = log(1 / (1 + exp(-x)))
在数学上,这相当于取 Sigmoid 函数的输出并对其应用自然对数。对数 Sigmoid 函数平滑地将每个元素映射到负无穷大到零的区间,提供了一种平滑的方式来处理接近于0和1的极端值。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用LogSigmoid激活函数
output_tensor = F.logsigmoid(input_tensor)
# 输出结果
print("原始张量:", input_tensor)
print("LogSigmoid处理后的张量:", output_tensor)
## 原始张量: tensor([-2.0000, 0.0000, 2.0000])
## LogSigmoid处理后的张量: tensor([-2.1269, -0.6931, -0.1269])
在这个示例中,LogSigmoid 函数将输入张量的每个元素转换为其在对数空间中的表示。
hardshrink
torch.nn.functional.hardshrink
是 PyTorch 框架中的一个函数,用于逐元素应用硬收缩(Hard Shrinkage)函数。
1. 函数用途
Hardshrink 激活函数主要用于稀疏化数据,它可以将输入张量中的小值(绝对值小于某个阈值)直接设为零。这种方法在处理噪声数据或进行特征选择时特别有用,因为它可以有效地去除不重要的小值。
2. 参数详解
input
(Tensor):输入的张量。lambd
(float,默认为0.5):硬收缩函数的阈值。
3. Hardshrink函数的定义及数学解释
Hardshrink 激活函数的数学表达式是:
- 如果
|x| > lambd
,则保持x
不变。 - 如果
|x| <= lambd
,则将x
设为 0。
这种方法通过硬阈值将输入张量中绝对值较小的元素设置为零,而保持其它元素不变。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-0.6, -0.2, 0.0, 0.2, 0.6])
# 应用Hardshrink激活函数
output_tensor = F.hardshrink(input_tensor, lambd=0.5)
# 输出结果
print("原始张量:", input_tensor)
print("Hardshrink处理后的张量:", output_tensor)
## 原始张量: tensor([-0.6000, -0.2000, 0.0000, 0.2000, 0.6000])
## Hardshrink处理后的张量: tensor([-0.6000, 0.0000, 0.0000,
在这个示例中,绝对值小于或等于0.5的元素被设置为0,其余元素保持不变。Hardshrink 函数在需要进行数据稀疏化或降噪时非常有用。
tanhshrink
torch.nn.functional.tanhshrink
是 PyTorch 框架中的一个函数,用于逐元素应用 Tanhshrink 激活函数。
1. 函数用途
Tanhshrink 激活函数结合了双曲正切函数(Tanh)和原始输入值的差异,从而创建了一种能够保留输入特征同时增加非线性的激活机制。这种函数在某些深度学习模型中用于改善数据表示,特别是在处理需要平滑和饱和特性的场合。
2. 参数详解
input
(Tensor):输入的张量。
3. Tanhshrink函数的定义及数学解释
Tanhshrink 激活函数的数学表达式是:
Tanhshrink(x) = x - tanh(x)
这个公式表示每个元素的值减去其双曲正切值。函数的输出是输入值和其双曲正切的差值,这种设计在输入值较小(接近零)时,输出接近零,而在输入值较大时,输出趋于饱和。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用Tanhshrink激活函数
output_tensor = F.tanhshrink(input_tensor)
# 输出结果
print("原始张量:", input_tensor)
print("Tanhshrink处理后的张量:", output_tensor)
## 原始张量: tensor([-2.0000, 0.0000, 2.0000])
## Tanhshrink处理后的张量: tensor([-1.2382, 0.0000, 1.2382])
在这个示例中,Tanhshrink 函数减少了输入张量的极端值,提供了一种平滑且饱和的输出特性。
Tanhshrink 函数适用于需要平滑激活且避免极端值影响的深度学习模型。
softsign
torch.nn.functional.softsign
是 PyTorch 框架中的一个函数,用于逐元素应用 SoftSign 激活函数。
1. 函数用途
SoftSign 激活函数是一种非线性函数,用于在深度学习模型中处理输入数据。与其他常见的激活函数(如 Sigmoid 或 Tanh)相比,SoftSign 提供了一种更为平滑和自然的方式来处理极端值,它能够有效地将输入值压缩到 (-1, 1) 的范围内。
2. 参数详解
input
(Tensor):输入的张量。
3. SoftSign函数的定义及数学解释
SoftSign 激活函数的数学表达式是:
SoftSign(x) = x / (1 + |x|)
这个公式表示输入值除以(1 加上输入值的绝对值)。该函数的特点是在输入值较小时接近线性,而在输入值较大时趋于饱和,最大和最小值分别为 1 和 -1。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用SoftSign激活函数
output_tensor = F.softsign(input_tensor)
# 输出结果
print("原始张量:", input_tensor)
print("SoftSign处理后的张量:", output_tensor)
## 原始张量: tensor([-2.0000, 0.0000, 2.0000])
## SoftSign处理后的张量: tensor([-0.6667, 0.0000, 0.6667])
在这个示例中,SoftSign 函数将输入张量的每个元素转换为其 SoftSign 值,使得结果被压缩在 (-1, 1) 的范围内。SoftSign 函数适用于需要平滑处理输入且避免极端值的饱和的深度学习模型,特别是在需要平衡激活值范围和计算效率的场景中。
softplus
torch.nn.functional.softplus
是 PyTorch 框架中的一个函数,用于逐元素应用 Softplus 激活函数。
1. 函数用途
Softplus 函数是一个平滑的、非线性的激活函数,它可以被视为 ReLU 函数的平滑版本。Softplus 函数在深度学习中常用于添加非线性,同时避免了 ReLU 函数中的“死神经元”问题。这种激活函数特别适用于需要平滑激活且避免负输出的场景。
2. 参数详解
input
(Tensor):输入的张量。beta
(float,默认为1):控制 Softplus 平滑程度的参数。threshold
(float,默认为20):为了数值稳定性,当输入乘以beta
大于此阈值时,激活函数将近似为线性函数。
3. Softplus函数的定义及数学解释
Softplus 激活函数的数学表达式是:
Softplus(x) = 1 / β * log(1 + exp(β * x))
这个公式表示将输入值乘以
β
,然后计算其指数,加1后取自然对数,并最终除以 β
。这个函数的特点是,对于较大的输入值,它的输出接近于线性函数,而对于较小的输入值,它提供了一个平滑的非线性变换。
对于数值稳定性,当 β * x
的值超过设定的 threshold
时,函数的输出接近于 x
本身,从而避免了数值上的不稳定。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-2.0, 0.0, 2.0])
# 应用Softplus激活函数
output_tensor = F.softplus(input_tensor, beta=1, threshold=20)
# 输出结果
print("原始张量:", input_tensor)
print("Softplus处理后的张量:", output_tensor)
## 原始张量: tensor([-2.0000, 0.0000, 2.0000])
## Softplus处理后的张量: tensor([0.1269, 0.6931, 2.1269])
在这个示例中,Softplus 函数为输入张量的每个元素提供了平滑的非线性激活。
softmin
torch.nn.functional.softmin
是 PyTorch 框架中的一个函数,用于应用 softmin 函数。Softmin 函数可以被视为 Softmax 函数的反向版本,它在提供概率分布时会赋予较小的值更高的概率。
1. 函数用途
Softmin 函数常用于多类别分类问题中,特别是当需要强调较小数值的重要性时。它通过对输入应用负指数然后归一化,将较小的输入值转化为较高的概率。
2. 参数详解
input
(Tensor):输入的张量。dim
(int):计算 softmin 的维度。在此维度上的每个切片将总和为1。dtype
(torch.dtype, 可选):返回张量的期望数据类型。如果指定,在操作执行前将输入张量转换为该数据类型。这有助于防止数据类型溢出。默认为 None。
3. Softmin函数的定义及数学解释
Softmin 函数的数学表达式是:
Softmin(x) = Softmax(-x)
对于给定的输入张量,Softmin 首先取每个元素的负值,然后在指定维度上应用 Softmax 函数。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([[1.0, 2.0, 3.0]])
# 应用Softmin激活函数
output_tensor = F.softmin(input_tensor, dim=1)
# 输出结果
print("原始张量:", input_tensor)
print("Softmin处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([[1.0000, 2.0000, 3.0000]])
# Softmin处理后的张量: tensor([[0.6652, 0.2447, 0.0900]])
在这个示例中,Softmin 函数将输入张量中的每个元素转换为一个概率,其中较小的值获得了较高的概率。Softmin 函数适用于需要强调较小输入值重要性的深度学习应用,例如在某些特定的多类别分类问题中。
softmax
torch.nn.functional.softmax
是 PyTorch 框架中的一个函数,用于逐元素应用 Softmax 函数。
1. 函数用途
Softmax 函数在深度学习中广泛用于多类别分类问题。它将输入张量的元素转换为概率分布,使得每个元素的值落在 [0, 1] 区间内,并且所有元素的和为1。这对于输出层的设计尤其重要,可以将其解释为概率分布,从而进行分类决策。
2. 参数详解
input
(Tensor):输入的张量。dim
(int):计算 softmax 的维度。在此维度上的每个切片将总和为1。dtype
(torch.dtype, 可选):返回张量的期望数据类型。如果指定,在操作执行前将输入张量转换为该数据类型。这有助于防止数据类型溢出。默认为 None。
3. Softmax函数的定义及数学解释
Softmax 函数的数学表达式是:
Softmax(xi) = exp(xi) / ∑j exp(xj)
这个公式表示将每个元素的指数与其所在维度的所有元素指数之和的比值进行计算。结果是一个概率分布,每个元素的值介于0和1之间,所有元素的总和为1。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([[1.0, 2.0, 3.0]])
# 应用Softmax激活函数
output_tensor = F.softmax(input_tensor, dim=1)
# 输出结果
print("原始张量:", input_tensor)
print("Softmax处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([[1.0000, 2.0000, 3.0000]])
# Softmax处理后的张量: tensor([[0.0900, 0.2447, 0.6652]])
在这个示例中,Softmax 函数将输入张量中的每个元素转换为一个概率分布。 需要注意的是,当使用与 torch.nn.NLLLoss
结合时,建议使用 torch.nn.functional.log_softmax
,因为 NLLLoss
需要在 Softmax 和自身之间计算对数。log_softmax
函数不仅运行速度更快,而且具有更好的数值属性。
softshrink
torch.nn.functional.softshrink
是 PyTorch 框架中的一个函数,用于逐元素应用软收缩(Soft Shrinkage)函数。
1. 函数用途
Softshrink 函数是一种非线性激活函数,主要用于数据的稀疏表示和噪声抑制。它通过减少输入张量中的小幅度值(在指定的阈值内)来实现数据的压缩和简化,这对于处理包含小的噪声或非重要信息的数据特别有用。
2. 参数详解
input
(Tensor):输入的张量。lambd
(float,默认为0.5):软收缩操作的阈值。
3. Softshrink函数的定义及数学解释
Softshrink 激活函数的数学表达式是:
- 如果
x > lambd
,则Softshrink(x) = x - lambd
。 - 如果
x < -lambd
,则Softshrink(x) = x + lambd
。 - 如果 `|x| <= lambd
,则
Softshrink(x) = 0`。
这个公式表示输入值 x
在超过阈值 lambd
的绝对值时,会被相应减去或加上 lambd
。若 x
的绝对值小于或等于 lambd
,则输出为零。这种方法有效地将输入张量中的较小值压缩为零,而保留较大的值。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([-1.5, -0.5, 0.0, 0.5, 1.5])
# 应用Softshrink激活函数
output_tensor = F.softshrink(input_tensor, lambd=0.5)
# 输出结果
print("原始张量:", input_tensor)
print("Softshrink处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([-1.5000, -0.5000, 0.0000, 0.5000, 1.5000])
# Softshrink处理后的张量: tensor([-1.0000, 0.0000, 0.0000, 0.0000, 1.0000])
在这个示例中,Softshrink 函数减少了输入张量的小值,并保留了较大的值。
gumbel_softmax
torch.nn.functional.gumbel_softmax
是 PyTorch 框架中的一个函数,用于从 Gumbel-Softmax 分布中采样,并可选择性地离散化样本。
1. 函数用途
Gumbel-Softmax 提供了一种在离散分布上进行连续近似的方式,常用于生成模型和强化学习中。它特别适用于需要梯度反向传播的场合,比如在生成对抗网络(GANs)或变分自编码器(VAEs)中进行分类决策。
2. 参数详解
logits
(Tensor):未归一化的对数概率,形状为[..., num_features]
。tau
(float):非负标量温度,控制 softmax 的平滑程度。hard
(bool):如果为 True,则返回的样本将被离散化为 one-hot 向量,但在自动微分时会被当作软样本处理。dim
(int):计算 softmax 的维度,默认为 -1。
3. 返回值
- 返回与
logits
形状相同的张量,样本来自 Gumbel-Softmax 分布。如果hard=True
,返回的样本将是 one-hot 编码,否则它们将是在指定维度上总和为 1 的概率分布。
4. 注意事项
- 这个函数可能会在未来从
nn.Functional
中移除。 - 对于
hard=True
的情况,主要技巧是进行y_hard - y_soft.detach() + y_soft
操作。这样做既确保输出值精确为 one-hot(因为我们添加然后减去y_soft
值),又使梯度等于y_soft
梯度(因为我们去除了所有其他梯度)。
5. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例 logits 张量
logits = torch.randn(20, 32)
# 使用重参数化技巧采样软分类
soft_sample = F.gumbel_softmax(logits, tau=1, hard=False)
# 使用 "Straight-through" 技巧采样硬分类
hard_sample = F.gumbel_softmax(logits, tau=1, hard=True)
# 打印结果
print("Soft Sample:", soft_sample)
print("Hard Sample:", hard_sample)
这个示例展示了如何使用 Gumbel-Softmax 从 logits 中生成软分类样本和硬分类样本。这种方法在需要生成离散数据但又想保留连续梯度的场景下非常有用。
log_softmax
torch.nn.functional.log_softmax
是 PyTorch 框架中的一个函数,用于应用 softmax 函数后接一个对数操作。
1. 函数用途
log_softmax
函数结合了 softmax 和对数操作,常用于多类别分类问题的输出层。这个函数特别适用于需要计算交叉熵损失的情况,因为它提供了更稳定和高效的方式来计算 softmax 的对数。
2. 参数详解
input
(Tensor):输入的张量。dim
(int):计算 log_softmax 的维度。在此维度上的输出将总和为1。dtype
(torch.dtype, 可选):返回张量的期望数据类型。如果指定,在操作执行前将输入张量转换为该数据类型。这有助于防止数据类型溢出。默认为 None。
3. 函数特点
- 数学上,尽管
log(softmax(x))
与log_softmax(x)
等价,但分开进行这两个操作会更慢且数值上不稳定。log_softmax
函数使用另一种公式来正确计算输出和梯度。
4. 使用示例
import torch
import torch.nn.functional as F
# 创建一个示例张量
input_tensor = torch.tensor([[1.0, 2.0, 3.0]])
# 应用log_softmax函数
output_tensor = F.log_softmax(input_tensor, dim=1)
# 输出结果
print("原始张量:", input_tensor)
print("Log Softmax处理后的张量:", output_tensor)
# 输出将是:
# 原始张量: tensor([[1.0000, 2.0000, 3.0000]])
# Log Softmax处理后的张量: tensor([[-2.4076, -1.4076, -0.4076]])
在这个示例中,log_softmax
函数对输入张量进行了 softmax 操作并取了对数,生成了一个新的张量,其元素值为 softmax 值的自然对数。log_softmax
函数适用于分类问题和任何需要用到 softmax 对数的场景,特别是在计算交叉熵损失时。
总结
本篇博客探讨了 PyTorch 框架中多种核心的激活函数,包括 LogSigmoid、Hardshrink、Tanhshrink、SoftSign、SoftPlus、SoftMin、SoftMax、Softshrink、Gumbel Softmax 和 Log Softmax。每个函数都有其独特的特性和应用场景,从 LogSigmoid 的平滑概率转换到 Softmax 的概率分布生成。这些激活函数在提高网络模型的非线性、处理极端值、实现数据稀疏化和噪声抑制等方面扮演着关键角色。通过详细解释每个函数的工作原理、参数和使用示例,本文为读者提供了深入理解和有效应用这些高级激活函数的知识。这些激活函数是构建有效、高效深度学习模型的关键组件,尤其适用于分类、生成模型和多类别识别等领域。