当前位置: 首页 > news >正文

字节面试题:激活函数选择对模型梯度传播的影响

题目

激活函数是如何影响模型梯度的反向传播的?详细说明。

解答

核心原理:链式法则与激活函数的导数

在反向传播算法中,误差信号(梯度)从输出层向输入层传递的过程依赖于链式法则。每一层的梯度计算都可以大致表示为:

\frac{\partial \mathcal{L}}{\partial \mathbf{z}^{[l]}} = \frac{\partial \mathcal{L}}{\partial \mathbf{z}^{[l+1]}} \cdot \frac{\partial \mathbf{z}^{[l+1]}}{\partial \mathbf{a}^{[l]}} \cdot \frac{\partial \mathbf{a}^{[l]}}{\partial \mathbf{z}^{[l]}}

其中:

  • \mathcal{L} 是损失函数。

  • \mathbf{z}^{[l]} 是第 l 层的线性计算结果(即 W*x + b)。

  • \mathbf{a}^{[l]} 是第 l 层的激活输出(即 a = g(z))。

最关键的一项就是 \frac{\partial \mathbf{a}^{[l]}}{\partial \mathbf{z}^{[l]}},也就是激活函数 g(z) 的导数 g'(z)

在反向传播过程中,梯度需要连续乘以每一层激活函数的导数。如果我们有一个 L 层的深度网络,传递到第一层的梯度将包含一个连乘项:

\frac{\partial \mathcal{L}}{\partial \mathbf{z}^{[1]}} \propto \frac{\partial \mathcal{L}}{\partial \mathbf{z}^{[L]}} \cdot \left(g'(\mathbf{z}^{[L-1]})\right) \cdot \left(g'(\mathbf{z}^{[L-2]})\right) \cdot \ldots \cdot \left(g'(\mathbf{z}^{[1]})\right)

这个连乘项决定了梯度是能有效地传播回来,还是在途中就消失或爆炸了。而每一项 g'(z) 的大小,完全取决于激活函数本身的特性及其输入值 z。

不同激活函数的影响

1. Sigmoid 和 Tanh:导致梯度消失的元凶

这两者是传统的激活函数,但它们在深度网络中非常容易导致梯度消失

  • Sigmoid函数g(z) = \frac{1}{1 + e^{-z}}

    • 导数g'(z) = g(z)(1 - g(z))

    • 分析

      1. 从函数图像和导数图像可以看出,当输入 z 的绝对值很大时(|z| > 5),函数会进入“饱和区”,变得非常平坦。

      2. 此时,其导数 g'(z) 会趋近于 0

      3. 在反向传播时,只要大部分神经元进入饱和状态,梯度中就会包含多个接近0的 g'(z) 相乘。多个小于1的数连续相乘,结果会指数级地趋近于0,导致传回底层网络的梯度变得极小甚至为0。

      4. 这意味着底层网络的权重几乎得不到更新(梯度≈0),无法有效学习。这就是梯度消失

  • Tanh函数g(z) = \frac{e^{z} - e^{-z}}{e^{z} + e^{-z}}

    • 导数g'(z) = 1 - (g(z))^2

    • 分析

      1. Tanh是零中心化的,收敛速度通常比Sigmoid快。

      2. 但它同样存在饱和区,当 |z| 很大时,其导数同样会趋近于 0

      3. 因此,在深度网络中,Tanh同样会遇到梯度消失问题,虽然其表现通常优于Sigmoid。

结论:Sigmoid和Tanh的饱和特性使得它们的导数在极端值时变为0,在深度网络的链式求导中极易引发梯度消失问题。

2. ReLU及其变体:缓解梯度消失,但引入新问题

为了克服饱和激活函数的问题,ReLU被引入并成为深度学习的里程碑。

  • ReLU函数g(z) = max(0, z)

    • 导数g'(z) = \left\{\begin{matrix} 1,z>0 \\ 0,z<0 \end{matrix}\right.

    • 积极影响

      1. 缓解梯度消失:在正区间(z > 0),导数恒为 1。这意味着梯度在反向传播通过ReLU单元时,不会被缩小。梯度可以几乎无损地传回更深的层,极大地缓解了梯度消失问题,使得训练极深的网络成为可能。

      2. 计算高效:只需判断是否大于0,没有指数运算,速度极快。

    • 消极影响(Dying ReLU)

      1. 在负区间(z < 0),导数恒为 0。一旦一个神经元激活值小于0(例如,由于一次过大的梯度更新),它在后续的训练中可能永远无法被再次激活,因为流经它的梯度将为0。这个神经元就“死亡”了,不再对模型产生任何贡献。

      2. 如果学习率设置过高,可能导致大量神经元“死亡”,整个网络的表现会大幅下降。

为了解决Dying ReLU问题,提出了几种改进变体:

  • Leaky ReLU: g(z) = max(\alpha z, z),其中 \alpha 是一个很小的斜率(如0.01)。

    • 导数g'(z) = \begin{cases} 1 & \text{if } z > 0 \\ \alpha & \text{if } z < 0 \end{cases}

    • 分析:在负区间提供了一个很小的斜率 \alpha,确保了梯度永远不会完全为0。即使神经元处于负区间,也有一个微小的梯度可以流回,使得它仍有“复活”的可能。这基本解决了Dying ReLU问题。

  • Parametric ReLU (PReLU): 形式与Leaky ReLU相同,但斜率参数 \alpha 不是固定的超参数,而是作为模型参数之一,通过反向传播学习得到。这比Leaky ReLU更灵活。

  • Exponential Linear Unit (ELU):
    g(z) = \begin{cases} z & \text{if } z > 0 \\ \alpha(e^z - 1) & \text{if } z \leq 0 \end{cases}

    • 分析:ELU在处理负值时是平滑渐变的,而不是像ReLU那样突然硬截止到0。这使得它具有ReLU的所有优点(正区间的线性、缓解梯度消失),同时避免了Dying ReLU问题,并且使激活值的平均值更接近0,可能加快收敛。但计算涉及指数,稍慢一些。

3. Swish / Mish:平滑且自门控的现代激活函数

这些是更新的研究,在一些场景下(如Transformer、NAS发现的架构)表现优于ReLU。

  • Swish函数: g(z) = z \cdot \sigma(z),其中 \sigma(z) 是sigmoid函数。

    • 分析

      1. 平滑:Swish是处处光滑可导的,没有ReLU那样的硬转折点,这可能使优化过程更稳定。

      2. “自门控”特性:它不是简单地将负值截断为0,而是通过一个sigmoid门(值在0~1之间)来平滑地缩放输入 z。对于较大的正值,门控值≈1,类似于ReLU。对于负值,门控值≈0,但不是完全关闭,而是平滑地衰减。

      3. 这种平滑的非单调特性被证明在许多深度模型中非常有效,它有助于在信息的保留和过滤之间取得更好的平衡。

  • Mish函数g(z) = z \cdot tanh(softplus(z)) = z \cdot tanh(\ln(1 + e^z))

    • 分析:与Swish类似,Mish也是平滑且非单调的。它在许多计算机视觉任务中显示出比Swish和ReLU更好的性能,但其计算成本更高。

总结与对比

激活函数公式对梯度反向传播的影响主要问题
Sigmoid/Tanh\frac{1}{1+e^{-z}} \\ \frac{e^z-e^{-z}}{e^z+e^{-z}}极易导致梯度消失(导数在饱和区趋近于0)梯度消失,计算慢
ReLUmax(0, z)有效缓解梯度消失(正区间导数为1),加速收敛Dying ReLU(负区间导数为0)
Leaky ReLU/PReLUmax(\alpha z, z)缓解梯度消失,同时避免了Dying ReLU(负区间有微小梯度)需要选择或学习 \alpha
Swish/Mishz \cdot \sigma(z)$ \\ $z \cdot tanh(ln(1+e^z))平滑地门控信息流,梯度传播特性优异,在许多前沿模型中表现最佳计算成本稍高

最终结论:

激活函数通过其导数 g'(z)直接参与反向传播的链式求导过程,是控制梯度流动的关键阀门。

  1. 饱和型激活函数(如Sigmoid, Tanh):是导致梯度消失的主要原因,不适用于深度网络。

  2. 非饱和型激活函数(如ReLU及其变体):通过在其主要区间保持导数恒定为1或一个非零值,使得梯度可以无损或较少损耗地传播,从而极大缓解了梯度消失问题,是现代深度学习的基石。

  3. 平滑且自门控的激活函数(如Swish, Mish):提供了更精细的梯度控制,通过平滑的过渡来决定让多少梯度通过,在复杂和深度的模型中往往能实现更稳定、更高效的梯度传播。

http://www.dtcms.com/a/393897.html

相关文章:

  • 5.Spring AI Alibaba
  • 如何优化Java并发编程以提高性能?
  • 【重量上下限报警灯红黄绿】2022-12-13
  • Node.js后端学习笔记:Express+MySQL
  • Ubuntu24.04 安装 禅道
  • StandardScaler,MinMaxScaler 学习
  • vscode+ssh连接server
  • 一文快速入门 HTTP 和 WebSocket 概念
  • Vue.js 项目创建指南
  • 核心策略、高级技巧、细节处理和心理
  • 算法优化的艺术:深入理解 Pow(x, n) 及其背后的思考
  • Projection Approximation Subspace Tracking PAST 算法
  • 容器化简单的 Java 应用程序
  • 【实证分析】上市公司并购数据dofile数据集(2005-2024年)
  • OceanBase备租户创建(三):通过带日志的物理备份恢复
  • OceanBase用户和权限管理
  • VMware Workstation Pro 虚拟机为 Ubuntu 18 配网教程
  • 城市自然资源资产离任审计试点DID
  • 算法日记---新动计划
  • Vue3水波纹指令:2025年Material Design交互新标准
  • Ansible-yum_repository模块
  • Java 单元测试(JUnit)与反射机制深度解析
  • Spring MVC 入门:构建 Web 应用的核心框架
  • C 语言核心关键字与数据结构:volatile、struct、union 详解
  • 【Elasticsearch面试精讲 Day 19】磁盘IO与存储优化
  • Linux信号机制详解
  • 【杂谈】-儿童友好型AI的未来之路
  • Docker+cpolar 实战:打造灵活可控的远程办公系统——容器化 RDP 远程桌面与多因子安全治理
  • docker远程主机启用TLS及其在JAVA工程的应用
  • docker 安装 Postgres 17.6