PyTorch中ReLU零点导数的默认处理及反向传播实验疑问
PyTorch中ReLU零点导数及残差块梯度疑问解答
一、PyTorch中ReLU在零点的导数默认是0
PyTorch实现的ReLU(包括nn.ReLU()层和F.relu()函数),在输入为0时,反向传播的梯度默认取0。你可以用一段极简代码验证:
import torch import torch.nn.functional as F x = torch.tensor([0.0], requires_grad=True) y = F.relu(x) y.backward() print(x.grad) # 输出 tensor([0.])
这直接证明了零点处的导数被设置为0。
二、残差块最后一层卷积梯度不为0的原因
这是因为残差块的shortcut跳跃连接为梯度传播提供了旁路,不会被单一ReLU的梯度阻断影响。
拿典型的残差块结构举例:
输入x → 卷积层1 → BN → ReLU → 卷积层2 → BN → 与输入x相加 → ReLU → 输出
假设你让卷积层1后的ReLU输入为0,此时该ReLU会把卷积层1的梯度置为0,但卷积层2的梯度是从输出端反向传递过来的:输出梯度先流到最后一层ReLU,再到相加操作,相加操作的梯度会同时传递给卷积层2的输出和原始输入x。哪怕中间ReLU阻断了卷积层1的梯度,卷积层2的梯度依然能通过这条完整路径获取,所以不为0。
本质上,残差连接让梯度有了“绕路”的可能,不会因为某一层ReLU的梯度为0就阻断所有上游层的梯度传递。
内容的提问来源于stack exchange,提问作者WYYAHYT
相关产品推荐
相关产品推荐

