趋近智
修正线性单元,通常称为ReLU,为Sigmoid和Tanh等其他非线性激活函数提供了一种更简单但效果很好的替代方案。虽然Sigmoid和Tanh等函数引入了非线性,但它们可能存在饱和和梯度消失等潜在弊端。由于其计算效率高以及能够缓解一些梯度问题,ReLU已成为深度学习中,特别是隐藏层中的常用方法。
ReLU函数在数学上的定义为:
f(x)=max(0,x)简单来说,如果输入x为正,函数输出x本身。如果输入为零或负,函数输出零。这形成了“修正”行为,即将负值截断为零。
ReLU函数f(x)=max(0,x)。它对正输入是线性的,对负输入则为零。
尽管有其优势,ReLU也并非没有自身问题。最主要的问题是“死亡ReLU”问题。如果一个神经元的输入在训练过程中始终为负,它将始终输出零。因此,流经该神经元的梯度也将始终为零(因为当x<0时,f′(x)=0)。
当这种情况发生时,与该神经元相关的权重将不再通过梯度下降进行更新。该神经元基本上变得不活跃,并停止参与学习过程。如果学习率设置过高,或者存在一个大的负偏置项将神经元的加权和推入负值范围,就可能发生这种情况。一旦一个ReLU单元“死亡”,它不太可能恢复。
请看这个简单的PyTorch示例,演示如何使用ReLU:
import torch
import torch.nn as nn
# 示例输入张量
input_tensor = torch.randn(1, 5) # 批量大小为1,5个特征
print(f"输入: {input_tensor}")
# 使用torch.nn.ReLU应用ReLU
relu_activation = nn.ReLU()
output_tensor = relu_activation(input_tensor)
print(f"ReLU后的输出: {output_tensor}")
# 使用torch.relu函数式形式应用ReLU
output_functional = torch.relu(input_tensor)
print(f"使用函数式形式的输出: {output_functional}")
# 演示梯度(requires_grad=True)
input_tensor.requires_grad_(True)
output_relu = torch.relu(input_tensor)
# 假设一些上游梯度用于演示
output_relu.backward(torch.ones_like(output_relu))
print(f"输入的梯度: {input_tensor.grad}")
# 注意:当输入>0时,梯度为1;当输入<=0时,梯度为0
输出显示了负输入的归零效应,并显示了正输入时梯度为1,负输入时梯度为0。
ReLU的简洁性、速度快以及缓解梯度消失的能力使其在许多深度学习模型中成为隐藏层的默认选择。然而,“死亡神经元”的可能性意味着仔细的初始化和学习率选择很重要。在下一节中,我们将查看专门设计用于解决这个“死亡”问题的ReLU变体。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造