✨ 复制成功!

以文会友,打造好学人设!

📋 已复制到剪贴板:

《PyTorch入门精华》


1 前言
    1.1  PyTorch安装

    1.2  显卡驱动的困惑

    1.3  CUDA安装注意事项

    1.4  cuDNN的介绍

    1.5  Pytorch Lightning介绍

    1.6  PyTorch学习之道

    1.7  PyTorch快速入门

    1.8  PyTorch调参之道

    1.9  PyTorch调参套件

    1.10  手动创建虚拟环境

2 深度学习之数学基础
    2.1  希腊字母解读

    2.2  梯度的物理意义

    2.3  图解梯度下降法

    2.4  图解梯度上升法

    2.5  自然梯度

    2.6  泰勒公式的介绍

    2.7  信息与信息熵

    2.8  重要性采样

    2.10  欧几里得范数

    2.11  特征值和特征向量

    2.12  似然函数的理解

    2.13  矩阵秩的深刻理解

3 PyTorch入门疑难点
4 PyTorch全局设置
    4.1  全局设置当前设备

    4.2  全局设置浮点精度

5 PyTorch GPU分布式训练
    5.1  PyTorch GPU基础操作

    5.2  DataParallel用法详解

    5.3  GPU分布式训练模型

    5.4  CUDA_VISIBLE_DEVICES

    5.5  device详细说明

    5.6  to(device)和.cuda()

    5.7  CUDA设备索引

    5.8  GPU设备索引

6 向量的基础与核心
    6.1  Tensor的组成与存储

    6.2  Tensor的grad属性

    6.4  Tensor的叠加

    6.5  禁用梯度计算

    6.6  向量的保存和加载

    6.7  参数向量

    6.8  叶子节点

    6.9  detach原理

    6.10  requires_grad属性

    6.11  Tensor与Numpy互换

    6.12  张量cat操作

    6.13  零维张量

    6.15  squeeze/unsqu...函数

    6.16  argmax和max的区别

    6.17  torch.as_tensor的应用

7 神经网络基础
    7.2  PyTorch计算图

    7.3  查看网络权重参数

    7.4  保存模型

    7.5  Adam相关面试题

    7.6  Train模式和Eval模式

    7.7  线性网络

    7.8  双线性网络

    7.9  惰性线性层

    7.10  PyTorch中的自动微分

    7.12  Dropout机制

    7.13  半精度训练

    7.14  Xavier初始化

    7.15  注意力机制

    7.16  Dataset数据处理

    7.17  StepLR学习率调度器

    7.18  词嵌入的理解

    7.19  TensorDataset的使用

    7.20  模型的保存与加载

    7.21  ModuleList和Sequential

    7.22  Batch Normalization介绍

8 计算机视觉基础知识
    8.1  通道的深刻理解

    8.2  1x1卷积的作用

    8.3  特征提取和可视化

    8.4  反卷积的推导

    8.5  理解卷积

    8.7  空洞卷积

    8.8  池化层的作用

    8.9  感受野与特征图

    8.10  NMS算法

    8.11  特征图尺寸计算

9 循环神经网络基础
    9.2  RNN的介绍

10 注意力机制
    10.1  位置编码的作用

    10.2  位置编码的种类

    10.4  Embedding本质理解

    10.6  Transformer VS CNN/RNN

    10.7  ELMo介绍

11 PyTorch归一化
    11.2  层归一化技术详解

12 激活函数相关内容
    12.1  激活函数简介

    12.2  万能逼近定理

    12.3  指数函数的学习

    12.4  Sigmoid函数的介绍

    12.5  Tanh函数的介绍

    12.6  Softmax函数的实现

    12.7  ReLU函数的介绍

    12.8  Leaky Relu函数的介绍

    12.9  ReLu与非线性的理解

    12.10  Parametric ReLU函数

    12.11  ELU函数介绍

    12.12  神经元死亡的问题

13 思考题的答案
    13.1  思考题的答案解密

神经元死亡的问题

创建时间:2025-09-15 更新时间:2025-09-18 阅读次数:1338 次

众所周知,当输入为负时,ReLU梯度恒为0,导致神经元‘死亡’且无法复活,这正是理解ReLU缺陷和后续改进(如Leaky ReLU, PReLU)的关键。

但是,很多人对上面的说法并没有深刻的理解,所以本文特地给大家讲一下。我们需要分步拆解这个问题:(1)为什么梯度恒为0呢?(2)为什么神经元无法复活呢?

(1)为什么梯度恒为0?

这需要从ReLU的函数定义和反向传播的原理说起。

ReLU的函数定义:f(x) = max(0, x),这意味着:当 x > 0 时,梯度为 1。误差可以顺畅地反向传播回来。当 x <= 0 时,梯度为 0。

反向传播算法通过链式法则将损失函数对最终输出的误差,一层层地反向传递,计算误差对每个权重(Weight)和偏置(Bias)的梯度。这个梯度决定了参数更新的方向和大小:权重 = 权重 - 学习率 * 梯度

现在,我们来看一个“死亡”的神经元是如何形成的:

假设在某个神经元,经过加权求和和偏置后的输入 z 是一个很大的负数。

在前向传播中:输出 a = ReLU(z) = 0

在反向传播中:我们需要计算损失函数 L 对权重 w 的梯度 ∂L/∂w。根据链式法则:

∂L/∂w = (∂L/∂a) * (∂a/∂z) * (∂z/∂w)
∂a/∂z 就是ReLU在点 z 处的导数。因为 z 是负数,所以 ∂a/∂z = 0。因此,整个乘积 ∂L/∂w = (∂L/∂a) * 0 * (∂z/∂w) = 0。由此可以得出结论:只要这个神经元的输入 z 是负数,它对于所有与之相连的权重的梯度就都是 0。

(2)为什么无法“复活”?

无法“复活”才是最致命的问题,一个神经元一旦“死亡”,它很可能就“永远死亡”了。原因如下所示。

让我们继续上面的例子。

梯度为0导致权重无法更新:

因为 ∂L/∂w = 0,所以权重的更新公式变为:w_new = w_old - 学习率 * 0 = w_old。权重没有任何变化。

自我强化的“死亡循环”:

这个神经元的输入是 a 输出是 0。在下一个样本的前向传播中,由于权重没有更新,计算出的新输入 z_new 很可能仍然是一个负数(因为上轮的 z 是个“很大的负数”,微小的权重变化都不足以把它拉回正数区,更何况现在权重根本没变)。于是,在下一轮反向传播中,梯度再次为 0,权重再次无法更新。这个过程会不断重复,形成一个无法打破的循环。

一个简单的比喻:

这就像一辆车冲下了一个平坦的悬崖,掉进了一个谷底(z 变成了很大的负数)。发动机(梯度)熄火了(变为0)。因为没有动力(梯度),车就无法从谷底开出来(权重无法更新到使 z 变为正数)。所以它将永远困在谷底。

(3)死亡神经元的持续影响

当某个神经元因为ReLU激活函数而“死亡”时,根本原因是它的权重值使得输入(样本)持续为负。这个过程如下:

  • 第一个样本:假设对于样本A,经过某个神经元的处理之后,结果z为负,而z在经过ReLU则输出为0,梯度为0。在反向传播时,由于梯度为0,该神经元的权重无法更新。

  • 下一个样本(样本B):现在处理样本B时,网络使用相同的权重(因为权重没有被更新)。如果这些权重值使得对于样本B, 结果z仍然为负(这很可能发生,因为权重没有改变),那么ReLU输出再次为0,梯度再次为0,权重再次无法更新。

  • 后续样本:这个循环会持续下去。权重永远卡在导致结果为负的状态,因此对于几乎所有样本,该神经元都会输出0,无法恢复。

总之,神经网络的权重(参数)在初始的过程是随机生成的,并且所有样本之间是共享的。训练过程的目的就是通过多个样本逐渐调整这些权重,使其更适合整个数据集。但是,一旦随机初始化的过程中出现了特殊值,这些特殊值往往会因为ReLU激活函数的先天缺陷,而陷入死亡陷阱。

(4)为什么Leaky ReLU和PReLU能解决这个问题?

因为它们的导数在负区不为0,即使输入 z 是负数,梯度 ∂a/∂z = α(一个很小的值,但不是0)。因此:

∂L/∂w = (∂L/∂a) * α * (∂z/∂w) ≠ 0
虽然这个梯度很小,但它不是零!权重可以得到微小的更新。经过多次迭代,这些微小的更新有可能逐渐将输入 z 从负值区域“拉”回正值区域,从而使神经元“复活”,重新开始正常学习。

这就是Leaky ReLU和PReLU能有效缓解“神经元死亡”问题的根本原因。

本教程共117节,当前为第116节!
本教程最新修订时间为:2026-08-07 09:17:18

📌 面试天下网:一款服务于大一新生的口袋书,让大家在无聊的公共课上可以学习大模型技术!
📌 网站公告:程序出海:中国程序员当下最大的机遇>>>>>>