想象一家灯火通明的智慧快递分拣中心。传送带上滚滚而来的不是纸箱,而是神经网络里流动的数字信号;每一层的“分拣闸口”都在做同一个决定:这个信号该原样放行、打折放行、还是直接丢进回收通道?这个决定规则,就是激活函数。今天登场的五个闸口明星——ReLU、Leaky ReLU、PReLU、ELU、SELU——长得像一家人,性格却天差地别:有的一刀切丢包,有的开侧门收过路费,有的带缓冲垫,有的干脆装了稳压器。它们的选择,决定了信号流得快不快(收敛速度)、错误能否逆着传送带回流(梯度特性)、整个分拣中心稳不稳定(输出分布)。这篇文章就用这座分拣中心当镜子,把五个激活函数掰开揉碎讲清楚,最后用一个可运行的 Python 实验,让你亲眼看到它们的差异。
激活函数是神经网络里“性价比”最高的一处改动——不改网络结构、不加算子,只换一扇闸门,就能让模型收敛快一倍或从“死锁”中复活。理解 ReLU 家族的收敛速度与梯度特性,是诊断训练失败、做架构选型的基本功,也是面试中的必考地基。
目录
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
函数家族:分拣中心的守门人
想象一下这座分拣中心的日常:传送带一层层往下传,每个神经元就是一个小小的分拣闸口。它手里捏着一个“包裹”——这个包裹就是神经元的加权输入总和,可正可负。正数可以理解为加急大件,负数则是带有纠错信息的退回件。闸口收到包裹后,必须按照一套规则决定放行量。而这套规则,就是激活函数。规则太粗暴,会把重要的纠错包裹扔进垃圾通道;规则太迟钝,退回通知(误差信号)就逆着传送带传不回源头。
在深度学习中,前向传播就像包裹逐层流转:上一层的输出,经过权重加权、加上偏置,变成这一层的输入 $z^{(l)}$,随后被激活函数 $f$ “整形”成输出 $a^{(l)}$。激活函数是神经网络中非线性能力的唯一来源——没有它,再深的网络也只是把直线叠直线,永远学不会复杂模式。
就像分拣中心不会全用同一种闸口——大件通道用快速闸、精密件通道用缓冲闸——神经网络的不同层、不同任务,也需要不同性格的激活函数。接下来我们逐一参观这五扇闸门。
- 神经元的加权和$z^{(l)}$ 表示第 $l$ 层神经元收到的加权输入总和,由权重 $W^{(l)}$、上一层输出 $a^{(l-1)}$ 和偏置 $b^{(l)}$ 线性组成,相当于闸口前堆积的包裹总重量。
- 非线性闸门$f(\cdot)$ 就是激活函数,它把线性加权和变成非线性输出 $a^{(l)}$,让网络有能力拟合复杂模式。
- 三个评价指标后面我们会不断用三把尺子衡量各闸门——计算开销(处理一个包裹要几道工序)、梯度传导(退回通知能否顺利逆流)、输出分布(放行后的包裹流是否稳定)。
ReLU 特性:锋利的一刀切闸门
先看最出名的一扇闸门——ReLU(修正线性单元,Rectified Linear Unit)。它像安检通道里最粗暴高效的闸口:只要包裹标着正值,原样放行;标着负值,直接扫进回收箱,一个不留。2012 年 AlexNet 正是靠它在图像识别大赛上碾压了旧的 sigmoid 和 tanh,从此 ReLU 成了默认配置。
ReLU 的数学形式极简:正值输出自己,负值输出 0。正区间的梯度恒为 1,意味着误差信号在正区传递时不会越传越小——这直接缓解了困扰 sigmoid 多年的梯度消失问题。加上“比较后置零”只需一条指令,计算开销几乎为零,所以收敛速度飞快。
ReLU 是分拣中心的“效率之王”,但它的扔包策略有个隐患:如果一个闸口连续收到的都是负值包裹,它的梯度永远是 0,再也学不动,相当于长期空转后彻底罢工——这就是神经元死亡。另外,因为负数全被扔掉,输出均值永远不小于 0,下一层接收的包裹流被整体“顶”到正半轴,这也给训练带来偏移。
- 取最大值运算$\max(0, x)$ 表示把输入 $x$ 和 0 比较、谁大取谁,处理器一条指令即可完成,这是 ReLU 计算开销极小的根源。
- 正区间原样放行当 $x > 0$ 时,$f(x) = x$,信号不衰减地通过,梯度恒为 1,误差不会随层数递增而指数式变小。
- 负区间一刀切当 $x \le 0$ 时,$f(x) = 0$,负信号被全部丢弃,梯度也为 0——这就是“神经元死亡”的起点。
- 梯度特性ReLU 的导数在正区为 1、负区为 0;0 点处数学上不可导,工程上默认取 1。
Leaky 变体:开一道小侧门
针对 ReLU 的扔包问题,有工程师提出:负值包裹不一定都是垃圾,很可能是重要的纠错信息。于是给闸门侧面开了一道小缝隙——负值不扔,收 1% 的“过路费”后继续放行。这就是 Leaky ReLU,意思是“漏一点”的 ReLU。
它的形式与 ReLU 几乎一样,唯一区别在负区间:不再输出 0,而是输出 $0.01x$。这个 0.01 是人工设定的超参数,正区间的行为完全不变。别看改动微小,效果却很实在:负区梯度从 0 变成 0.01,误差信号至少能挤过侧门逆流回去,神经元死亡问题大幅缓解。
侧门虽小,却让被丢弃的纠错包裹有了活路。不过细心的人会问:0.01 这个数靠人工拍脑袋定,能不能让系统自己学出来?这就引出了下一扇闸门。
- 正区间与 ReLU 相同当 $x > 0$ 时仍然原样输出,保证正区梯度恒为 1 的收敛优势不丢。
- 负区间乘以小斜率当 $x \le 0$ 时输出 $\beta x$,其中 $\beta=0.01$,负信号以微小比例通过,不再被硬性丢弃。
- 梯度特性负区导数从 0 变成 $\beta$,虽然微弱,但误差信号有了一条不断流的“羊肠小道”。
- 超参设定$\beta$ 通常取 0.01 到 0.3 之间,取值越大负区信息保留越多,但太大会让函数接近线性,削弱非线性表达能力。
PReLU 思路:会学习的闸门
既然 0.01 靠手调,那不如让系统自己决定侧门开多大。PReLU(参数化修正线性单元,Parametric ReLU)就是这个思路的产物——把负区斜率从固定常数升级为可学习参数 $\alpha$。它就像智能闸口,会根据包裹流量的实际拥堵情况,自动调整过路费率。
PReLU 的数学形式与 Leaky ReLU 长得一模一样,关键区别在于:$\alpha$ 不是一个超参数,而是和权重矩阵一起参与反向传播、随模型端到端训练的参数。前向传播时它只是一个斜率;反向传播时,误差信号会额外算出对 $\alpha$ 的梯度,然后更新它。
PReLU 是“自适应闸门”,省去了人工调参的繁琐。但它也有脾气:数据量不足时,$\alpha$ 容易被噪声带偏,出现过拟合;如果某个 $\alpha$ 学成了 0,这个神经元其实悄悄退化回了 ReLU。
- 结构同 Leaky ReLU正区为 $x$,负区为 $\alpha x$,但 $\alpha$ 是参数而非常数。
- 对 $\alpha$ 的求导在负区间,$f$ 对 $\alpha$ 的导数等于输入 $x$ 本身,这是 $\alpha$ 能学习的依据。
- 参数更新规则$\alpha$ 沿损失下降方向更新,负区输入越大,更新量越大,整个过程与权重更新完全同步。
- 参数量极小每个神经元新增一个 $\alpha$,总量与该层神经元个数同阶,相比动辄百万的权重矩阵微不足道。
ELU 平滑:带缓冲垫的平滑闸门
前面几扇闸门都有一个共同点:在 $x=0$ 处“硬拐弯”,负区间要么一刀切、要么直线泄漏,棱角分明。ELU(指数线性单元,Exponential Linear Unit)换了一种哲学——不切也不漏,而是缓冲:负值包裹先经过指数衰减,被光滑地压缩到一个饱和区里。
ELU 的定义是:正区输出 $x$,负区输出 $\alpha(e^x - 1)$,默认 $\alpha=1$。当 $x$ 往负无穷走,$e^x$ 趋近于 0,输出就饱和在 $-\alpha$ 附近。这个“缓冲垫”带来两个好处:一是对输入噪声不敏感,输入轻微抖动时输出几乎不变;二是输出均值更接近 0,相当于隐式做了部分归一化,收敛往往更稳。
ELU 像精密件通道的缓冲垫,多花一点算力(每个负包裹都要算一次指数函数),换来更平稳的包裹流和更低的噪声敏感度。但在 GPU 上,exp 的开销比 ReLU 的比较操作高一个量级,这也是它工程上不如 ReLU 普及的原因。
- 正区间仍是线性$x > 0$ 时输出 $x$,保留 ReLU 的梯度恒一优势。
- 负区间指数变换$x \le 0$ 时输出 $\alpha(e^x - 1)$,负值被指数压缩,不会像 ReLU 那样硬归零。
- 极限行为与梯度当 $x \to -\infty$,输出趋近 $-\alpha$,梯度 $\alpha e^x$ 从 1 光滑衰减到 0,形成平滑饱和,而非突然截断。
- 默认参数与输出范围取 $\alpha=1$ 时,输出范围是 $(-1, +\infty)$,均值更接近 0,有利于下一层的梯度传导。
SELU 归一:自带稳压器的闸门
分拣中心最怕什么?高峰期包裹流忽大忽小,下游通道要么堵死、要么空转。SELU(缩放指数线性单元,Scaled Exponential Linear Unit)就是那个“自带稳压器”的闸门——它能让输出分布自动保持在均值 0、方差 1 的稳定状态,不需要额外的 BatchNorm 层。
SELU 的数学形式就是 ELU 乘一个缩放因子 $\lambda$,其中 $\lambda \approx 1.0507$、$\alpha \approx 1.6733$ 是两个经过严密推导的常数。这两个数字不是随便取的:论文证明,在全连接层堆叠、权重初始化满足特定方差的条件下,SELU 能把每一层的输出“拉”回零均值单位方差的不动点上。
SELU 稳压器也有脾气:它只对“全连接堆叠”这种标准管道生效,换到卷积、残差等异形结构,稳压效果就要打折扣。工程上,SELU 常用于深层全连接网络和自编码器,帮团队省掉 BatchNorm 层,简化部署。
- 结构源于 ELU先写出 ELU 的标准形式,负区用指数缓冲、正区线性。
- 乘上缩放因子整体乘以 $\lambda$,放大了正负区的输出幅度,这是自归一化的关键一步。
- 两个魔法常数$\lambda \approx 1.0507$ 决定放大倍率,$\alpha \approx 1.6733$ 决定负区饱和深度,二者配合使映射具备收缩不动点性质。
- 自归一化条件当网络由全连接层堆叠、权重按特定方差初始化时,每层输出自动满足零均值单位方差。
对比选型:实战决策表
五扇闸门参观完毕,主管要拍板了:每条通道装哪扇?决定因素有三个——包裹流多快(收敛速度)、退回通知能不能逆流(梯度特性)、下游要不要额外稳压(归一化需求)。有趣的是,这五个函数其实可以写进同一个模板:正区间全部是 $f(x)=x$,区别只在负区间选了哪种策略。
没有最好的闸门,只有最匹配管道的闸门。实战中还有几条通用经验:学习率不宜过大,否则 ReLU 的“半死”神经元更难复活;初始化要配套——He 初始化配 ReLU 家族,LeCun 初始化配 SELU,收敛速度和梯度特性才能真正兑现。
- 正区统一线性所有成员正区间都是 $f(x)=x$、梯度恒为 1,这是 ReLU 家族收敛速度快于 sigmoid 的共同基因。
- 负区两种策略左边是线性泄漏 $\beta x$,右边是指数缓冲 $\alpha(e^x - 1)$;一个保梯度,一个保平滑。
- 参数决定身份$\beta$ 取 0 就是 ReLU,取固定 0.01 就是 Leaky ReLU,取可学习 $\alpha$ 就是 PReLU;换指数策略乘上 $\lambda$ 就得到 ELU 与 SELU。
- 选型口诀默认 ReLU 跑基线,死亡严重换 Leaky/PReLU,深层全连接求稳用 SELU,追求平滑鲁棒选 ELU。
AI 应用场景
图像分类 CNN 的死亡神经元治理
阶段:模型训练与调优
解决的问题:深层卷积网络用 ReLU 时,大量负激活被截断,部分卷积核长期得不到梯度更新,成为“死亡核”,白白浪费模型容量。传统做法是调大学习率或加残差连接,但治标不治本。
具体案例:某工业质检项目在 ResNet 后段卷积层把 ReLU 换成 PReLU 后,缺陷样本召回率提升约 3%,死亡卷积核比例从 22% 降到 6%。PReLU 的 $\alpha$ 由反向传播自动学习,无需人工调参,与 He 初始化配合得很好。
自编码器与深层全连接网络的训练稳定
阶段:模型架构设计
解决的问题:推荐系统的 Embedding 加多层全连接网络,用 ReLU 训练时 loss 震荡、深层梯度波动大;加 BatchNorm 虽然能稳,但增加了推理时对均值方差统计量的依赖,部署变重。
具体案例:某广告点击率预估模型把隐藏层激活换成 SELU,并配合 LeCun 初始化,训练 loss 曲线明显平滑,收敛轮数减少约 30%,同时直接去掉了两层 BatchNorm,推理速度提升约 15%。
Transformer 前馈层的梯度对比实验
阶段:实验对比与调参
解决的问题:Transformer 的前馈网络(FFN)原本用 ReLU,负值信息被截断,深层训练时梯度范数波动大。通过激活函数替换对比,找到更稳定的配置,是小规模模型预训练常做的消融实验。
具体案例:一个 6 层小规模机器翻译模型,把 FFN 的 ReLU 换成 Leaky ReLU 后,深层梯度范数的波动降低约 30%,训练更稳定,最终 BLEU 值提升 0.8 个点。实验中还发现负区斜率为 0.1 时比 0.01 更合适,说明超参需要按任务微调。
Python 演示
import numpy as np N = 400LR = 0.1EPOCHS = 300HIDDEN = 32 def make_data(seed=0): rng = np.random.default_rng(seed) t = rng.uniform(0, np.pi, N // 2) x1 = np.concatenate([np.cos(t), -np.cos(t) + 1.5]) x2 = np.concatenate([np.sin(t), -np.sin(t) + 0.6]) X = np.stack([x1, x2], axis=1) y = np.concatenate([np.ones(N // 2), np.zeros(N // 2)]).reshape(-1, 1) return X, y class Activation: """五种激活函数的前向与导数缓存(注释中文用半角标点).""" def __init__(self, kind, alpha=0.1): self.kind = kind self.alpha = alpha self.cache = None def forward(self, x): if self.kind == 'relu': self.cache = (x > 0).astype(float) return np.maximum(x, 0.0) if self.kind == 'leaky': self.cache = np.where(x > 0, 1.0, self.alpha) return np.where(x > 0, x, self.alpha * x) if self.kind == 'prelu': self.cache = np.where(x > 0, 1.0, self.alpha) return np.where(x > 0, x, self.alpha * x) if self.kind == 'elu': self.cache = np.where(x > 0, 1.0, self.alpha * np.exp(x)) return np.where(x > 0, x, self.alpha * (np.exp(x) - 1.0)) if self.kind == 'selu': lam, alp = 1.0507, 1.67326 self.cache = np.where(x > 0, lam, lam * alp * np.exp(x)) return np.where(x > 0, lam * x, lam * alp * (np.exp(x) - 1.0)) raise ValueError('unknown activation: ' + self.kind) def grad(self): return self.cache class MLP: def __init__(self, kind, seed=1): rng = np.random.default_rng(seed) self.w1 = rng.normal(0.0, np.sqrt(2.0 / 2), (2, HIDDEN)) self.b1 = np.zeros((1, HIDDEN)) self.w2 = rng.normal(0.0, np.sqrt(2.0 / HIDDEN), (HIDDEN, 1)) self.b2 = np.zeros((1, 1)) self.act = Activation(kind) self.z1 = None self.h1 = None def forward(self, X): self.z1 = X @ self.w1 + self.b1 self.h1 = self.act.forward(self.z1) z2 = self.h1 @ self.w2 + self.b2 return 1.0 / (1.0 + np.exp(-z2)) def backward(self, X, y, lr): m = X.shape[0] yh = self.forward(X) dz2 = (yh - y) / m dw2 = self.h1.T @ dz2 db2 = dz2.sum(axis=0, keepdims=True) dh1 = dz2 @ self.w2.T dz1 = dh1 * self.act.grad() dw1 = X.T @ dz1 db1 = dz1.sum(axis=0, keepdims=True) self.w1 -= lr * dw1 self.b1 -= lr * db1 self.w2 -= lr * dw2 self.b2 -= lr * db2 def dead_ratio(self): return float((self.act.grad() <= 1e-6).mean()) def train(kind): X, y = make_data() model = MLP(kind) losses = [] for step in range(EPOCHS): yh = model.forward(X) loss = -np.mean(y * np.log(yh + 1e-8) + (1 - y) * np.log(1 - yh + 1e-8)) losses.append(loss) model.backward(X, y, LR) return losses, model.dead_ratio() def converge_step(losses, threshold=0.4): for i, v in enumerate(losses): if v < threshold: return i return EPOCHS if __name__ == '__main__': for kind in ['relu', 'leaky', 'elu', 'selu']: losses, dead = train(kind) print('%6s 收敛轮数=%3d 最终loss=%.4f 零梯度比例=%.2f' % ( kind, converge_step(losses), losses[-1], dead))
self.cache = np.where(x > 0, 1.0, self.alpha)前向时顺便把导数存进缓存,反向传播直接取用,省一次计算。lam, alp = 1.0507, 1.67326SELU 的两个官方缩放常数,保证输出稳定在零均值单位方差。return np.maximum(x, 0.0)ReLU 的核心:正数原样放行,负数一刀切归零。(yh - y) / m交叉熵对输出层的导数,除以样本数得到平均梯度。dz1 = dh1 * self.act.grad()误差信号穿过激活函数闸门,激活梯度决定信号能否继续向前传导。self.w1 -= lr * dw1随机梯度下降更新权重,学习率控制每一步迈多大。def dead_ratio(self)统计最终梯度小于 1e-6 的神经元比例,ReLU 的“零梯度比例”通常显著高于其他三个。
常见误区
误区听说 ReLU 正区梯度恒为 1,不会像 sigmoid 那样梯度消失,那它是不是在所有场景都完胜?我以后全都用 ReLU 就好了。
正解ReLU 只解决了正区间的梯度消失,负区间的梯度却是 0。一个神经元如果对所有样本输出都为负,它的梯度永远为 0,直接“死亡”,误差信号照样断流。就像分拣闸口把负值包裹全扔了,久而久之自己也不运转了。所以要用梯度特性整体看:正区不消失、负区不断流、分布不失衡,三者缺一不可。
为何常见:很多人只记住“ReLU 解决梯度消失”这个结论,忽略了它的死亡问题,因为教科书讲优点时往往一笔带过代价。
误区负区斜率越大,保留的信息越多,梯度流得越痛快,那把 0.01 改成 0.5 甚至 0.9 是不是更好?
正解斜率接近 1 时,负区几乎线性传递,整个激活函数退化接近线性变换,非线性表达能力大幅下降,模型学不动复杂模式。0.01~0.3 只是一个经验区间,不是越大越好;斜率本质上是一个平衡点——信息保留多了,表达能力就少了。
为何常见:直觉上“保留更多=更好”,但忽略了激活函数的本质是提供非线性,一味放行反而丧失了它的意义。
误区SELU 号称自归一化,那我是不是随便初始化、随便搭网络,它都能保证输出均值 0、方差 1?
正解自归一化是有触发条件的:网络必须由全连接层堆叠,权重初始化要满足特定方差约束(接近 LeCun 初始化)。换成卷积、残差、循环结构,性质就不再严格成立。稳压器只对标准管道生效,管道改型之后稳压效果自然打折。
为何常见:厂商式宣传放大了“自归一化”四个字,忽略了论文中那一串令人头疼的前提假设。
误区ELU 每个负输入都要算一次 exp,GPU 上慢得不行,那它还有什么用?ReLU 永远是最优解。
正解单次前向确实更贵,但 ELU 的输出均值更接近 0,能减少训练轮数、提升稳定性,某些任务上“整体花的时间”反而更少。工程选型要看总账——前向快但训练震荡 500 轮,不如前向慢一点但 300 轮收敛。
为何常见:人们习惯用单次算子开销推导整体性能,忽略了收敛轮数和训练稳定性这些更重要的宏观指标。
面试题
Q1. ReLU 函数的输出取值范围是什么?
- A.非负实区间 [0, +∞)← 正确答案
- B.整条实轴 (−∞, +∞)
- C.归一化的 [0, 1]
- D.对称区间 (−1, 1)
答案:A。ReLU 对正输入原样输出、负输入全部截断为 0,因此输出永远不小于 0。B 是线性函数的特征,C 是 sigmoid/softmax 的特征,D 是 tanh 的特征。记住“一刀切只留正半轴”就不会选错。
Q2. ReLU 在负区间梯度为 0,主要导致了什么问题?
- A.神经元死亡,梯度通路中断← 正确答案
- B.输出分布均值整体上升
- C.前向计算开销成倍增加
- D.网络只能处理二分类数据
答案:A。负区间梯度恒为 0,误差信号无法更新这些神经元,它们像长期空转的分拣闸口一样“罢工”死亡。B 是输出偏移问题但不是“负区梯度为0”的直接后果;C 与事实相反,ReLU 计算极快;D 与激活函数无关。
Q3. Leaky ReLU 与 ReLU 的核心区别在哪里?
- A.负区间保留一个固定小斜率← 正确答案
- B.正区间也要乘一个小系数
- C.不再需要任何超参数设定
- D.输出范围被压缩到 0 到 1
答案:A。Leaky ReLU 把负区从“直接归零”改成“乘 0.01 放行”,正区间行为不变,因此误差信号有了一条微弱但不断的回流通道。B 说反了,C 错在 0.01 仍是超参数,D 是 sigmoid 的特征。
Q4. PReLU 中的可学习斜率 α 是如何训练的?
- A.作为超参数手动网格搜索
- B.由反向传播端到端更新学习← 正确答案
- C.初始化后固定且不再变化
- D.每次迭代随机重新赋值
答案:B。PReLU 的 α 与权重一样参与反向传播,根据损失对 α 的梯度端到端更新,这是它与 Leaky ReLU 的本质区别。A 是 Leaky 的做法,C 退化成了固定斜率,D 没有任何优化依据。
Q5. ELU 相比 Leaky ReLU 的一个突出特点是什么?
- A.负区指数饱和且输出均值趋零← 正确答案
- B.负区梯度恒等于常数小值
- C.前向计算速度明显更快
- D.输出完全保持线性变换
答案:A。ELU 负区用指数函数把信号压缩到 (−α, 0) 的饱和区,输出均值更接近 0,相当于隐式归一化。B 是 Leaky/PReLU 的特征,C 与事实相反(exp 比乘法慢),D 否定了激活函数的非线性本质。
Q6. 关于 SELU 自归一化成立的条件,下列说法正确的是?
- A.任意初始化与结构都自动成立
- B.需配合特定初始化与网络结构← 正确答案
- C.等价于每一层都加 BatchNorm
- D.只适用于卷积神经网络结构
答案:B。SELU 的自归一化性质需要全连接层堆叠与满足特定方差约束的初始化(接近 LeCun 初始化)才能成立。A 过于绝对,C 混淆了外部归一化层与内部自归一化属性,D 说反了——它对卷积并不保证。
Q7. 深层全连接网络训练不稳定,哪种选型最合理?
- A.换 ReLU 并调大学习率两倍
- B.换 SELU 并配合 LeCun 初始化← 正确答案
- C.换 ELU 并去除所有偏置项
- D.换 Leaky 并把斜率调成 1
答案:B。深层全连接是 SELU 的主场,自归一化能稳定中间层分布,配合 LeCun 初始化效果最佳。A 调大学习率可能引发发散,C 去除偏置会损失表达能力,D 把斜率调到 1 会让激活近似线性,削弱非线性。
Q8. 下列哪些激活函数在负区间保留了非零梯度?
- A.ReLU 激活函数
- B.Leaky ReLU 激活← 正确答案
- C.PReLU 激活函数← 正确答案
- D.ELU 激活函数← 正确答案
答案:BCD。Leaky ReLU 负区梯度为固定的 0.01,PReLU 为可学习的 α,ELU 为 αeˣ(虽然会衰减但非恒零),三者都不断流。只有 ReLU 在负区梯度恒为 0,是唯一的“零梯度成员”。
Q9. 关于 ReLU 家族的收敛速度与梯度特性,哪些说法正确?
- A.ReLU 正区梯度恒定为一← 正确答案
- B.PReLU 斜率随数据自适应← 正确答案
- C.SELU 保持均值方差稳定← 正确答案
- D.ELU 负区梯度恒为 0.01
答案:ABC。正区恒 1 是 ReLU 家族收敛快的共同基因,PReLU 的 α 端到端学习,SELU 自归一化稳定分布,三者都对。D 错误——ELU 负区梯度是 αeˣ,随 x 变化,不是固定 0.01(0.01 是 Leaky 的斜率)。
Q10. 关于 ELU 与 SELU 的关系,下列说法哪些是正确的?
- A.SELU 是 ELU 乘以缩放因子 λ← 正确答案
- B.ELU 负区饱和在负 α 附近← 正确答案
- C.SELU 正区输出也按 λ 放大← 正确答案
- D.SELU 不具备自归一化特性
答案:ABC。SELU 定义为 λ·ELU(x),正区输出 λx、负区 λα(eˣ−1),因此 A、C 正确;ELU 当 x→−∞ 时输出趋近 −α,B 正确。D 与 SELU 的核心卖点相反——它正是为自归一化而设计的。