激活函数做什么
神经网络的每个节点先按权重把输入加起来,再由激活函数把这个加权和变成节点的输出——激活函数把节点的输入与权重映射为输出[1]。它决定节点向外传递多强的信号,现代网络的每一层几乎都带一个。
为什么必须是非线性的
激活函数的选择不是装饰。只有非线性激活函数才能让两层网络成为通用函数逼近器;没有非线性,多层网络会塌缩成单层线性网络[1]。原因很直接:若干个线性变换叠加起来仍然是线性变换,多加几层线性网络并不会比一层更有表达力。在每个加权和之后插入一个非线性激活函数,才能打断这种塌缩,让网络表示输入与输出之间弯曲、复杂的关系。所谓通用函数逼近器,指的是只要中间层足够宽,两层网络就能逼近范围很广的函数,而这个性质完全依赖非线性。
几种常见的形状
斯坦福 CS231n 的讲义把 sigmoid 激活函数描述为:接收一个实值输入,把它压缩到 0 到 1 之间[2]。同一份讲义指出,tanh 不过是缩放过的 sigmoid,tanh(x) = 2 * sigmoid(2x) - 1[2],输出因此以 0 为中心。CS231n 把修正线性单元(ReLU)描述为计算 f(x) = max(0, x),也就是在零点做一个阈值截断[2]:正值原样通过,负值一律归零。
一个小例子可以看出区别。某个节点的加权和是 2,经过 sigmoid 得到约 0.88,经过 tanh 得到约 0.96,经过 ReLU 仍然是 2。同一个节点的加权和是 -2 时,sigmoid 给出约 0.12,tanh 约 -0.96,ReLU 则直接给 0。
从哪里来
最早的二值阶跃函数(binary step)几乎处处不可导,梯度方法在它上面无法推进[1]——按梯度下降训练需要一个可以跟下去的斜率。sigmoid 或逻辑函数(logistic function)在 2012 年被 Hinton 及其同事用于语音识别[1]。Nair 和 Hinton 在 2010 年提出修正线性单元 ReLU,2012 年它被 AlexNet 采用[1]。此后 Maas、Hannun 和 Ng 在 2013 年提出 leaky ReLU[1];Hendrycks 和 Gimpel 在 2016 年提出高斯误差线性单元 GELU[1];Ramachandran 及同事在 2017 年提出 SiLU,也叫 Swish[1]。
今天用在哪里
GELU 在 2018 年 BERT 采用之后,成为现代 transformer 里的主流激活函数[1]。ReLU 的流行则和速度有关:CS231n 的讲义指出,在 Krizhevsky 等人的工作中,ReLU 让随机梯度下降(stochastic gradient descent)的收敛速度比 sigmoid 和 tanh 快 6 倍[2]。
局限
饱和型激活函数 sigmoid 和 tanh 会让梯度趋近于零,这就是梯度消失问题,而非饱和的 ReLU 缓解了它[1]。深度网络靠反向传播把误差梯度一层层往回传,激活函数的导数相当于每一层梯度上的一个乘数;导数普遍很小时,多层相乘之后梯度就衰减得所剩无几。
ReLU 也有自己的失效方式:它对负输入的导数为零,一个神经元一旦落到负区间就可能永久失活,这种失效被称为 dying ReLU 问题[1]。阶跃函数的问题则是另一种:它几乎处处不可导,梯度方法无从下手[1]。所以选激活函数,本质上是在平滑程度、收敛速度和死单元风险之间做权衡。
注释与来源
- Activation functionhttps://en.wikipedia.org/wiki/Activation_function
- CS231n: Neural Networks Part 1 - Setting up the Architecturehttps://cs231n.github.io/neural-networks-1/
引用本页: 激活函数. TellWorld, https://www.tellworld.net/zh/learn/activation-function. 更新于 2026-11-07