训练神经网络时,AI 要解决一个核心问题:每一层神经元把收到的信号加权求和之后,下一步该不该把结果继续往下传、传多少。这个「传不传、传多少」的判断,就由激活函数来完成。它接在加权求和之后,把线性的结果做一次非线性变换,是模型能够拟合复杂关系、从直线升级到曲线的关键零件。
神经元的一步:加权求和之后做什么
一个神经元的工作可以拆成两段。前半段是加权求和:把来自上一层的每个输入乘上一个权重,再加一个偏置,得到一个实数。第二段就是激活函数:把这个实数套进一个函数里,输出一个新的值,作为传给下一层的信号。ReLU 的做法是负数一律输出 0、正数原样通过;Sigmoid 则是把任意实数压到 0 到 1 之间;Tanh 压到 -1 到 1 之间。同一层里每个神经元都走同样的两步,区别只在于权重和偏置不同,于是每个神经元输出的信号也不一样。
没有非线性,堆再深也只是一条直线
如果去掉激活函数,或者把它换成恒等函数,那么每一层做的都是线性运算。线性运算叠加线性运算,结果仍然是线性的——三层网络和一个单层模型在表达能力上没有本质区别,无论堆多少层,最终都只能画出一条直线去切分数据。激活函数的真正作用是往这条直线里「折」出弯来,让模型有能力拟合曲线、边界和更复杂的模式。这也是「深度」能带来增益的前提:非线性让每一层可以学习到不同抽象层次的特征,浅层学边缘、深层学形状,而不是每一层都在重复同一种变换。
三种常见激活函数怎么选
| 函数 | 输出范围 | 特点 | 主要问题 |
|---|---|---|---|
| ReLU | 0 到正无穷(负数归零) | 计算简单、正区间导数恒定、不易饱和 | 负数被截断,可能「神经元死亡」 |
| Sigmoid | 0 到 1 | 输出平滑、可解释成概率 | 两端导数趋近 0,深层易梯度消失 |
| Tanh | -1 到 1 | 以 0 为中心、比 Sigmoid 更对称 | 同样存在深层梯度消失问题 |
表格里的三条路线各有各的代价。早期网络大量使用 Sigmoid 和 Tanh,如今多数卷积网络和 Transformer 的默认选择是 ReLU 及其变体。选哪个看的不是名字新不新,而是训练是否稳定、梯度会不会在回传中衰减。
梯度消失:为什么深网络怕 Sigmoid
训练靠的是把误差通过反向传播一层层回传,用梯度去更新权重。激活函数的导数大小直接决定梯度在回传时是放大还是衰减。Sigmoid 在输入远离 0 的区域导数趋近于 0,层数一多,梯度连乘下来会指数级变小,前面几层几乎学不到东西,训练变慢甚至停滞,这就是梯度消失。ReLU 在正数区间的导数是常数 1,不容易让梯度衰减,因此成了默认选项——但它把负数完全归零,一旦某个神经元的输入长期为负,它就不再更新,带来「神经元死亡」的另一类问题。
这个「开关」比喻会在哪里失效
把激活函数说成「开关」是便于理解的近似,但别当精确模型。ReLU 对负数是真的截断到 0,可以勉强算个开关;Sigmoid 和 Tanh 是平滑压缩,输出落在连续区间里,是「给多少」,不是「通不通」。更关键的是,激活函数本身并不知道信号的内容——它只是对一个实数做变换,不判断这个信号「重要不重要」。真正让网络学会「该传什么」的是训练过程中调整出来的权重,激活函数只负责提供非线性。脱离训练去谈某个激活函数「更聪明」,方向就错了。
使用者需要记住什么
对选模型、用 API 的人来说,激活函数是工程师调参的细节,和你在产品页看到的版本号、参数量关系不大。想理解模型为什么「深」有用、为什么训练会不稳定,抓住「非线性」和「梯度」这两个词就够。模型规模的另一个数字可以看激活参数量,它衡量的才是真正参与计算的参数。至于模型怎么通过训练学会把输入映射到输出、怎么用少量示例教会它某种格式,属于更上层的话题,和这里讨论的层内信号传递不在同一层。
速查:激活函数一句话
- 作用:给加权求和的结果加非线性,让深层网络能拟合复杂关系。
- ReLU:负数归零、正数通过,多数网络的默认选择。
- Sigmoid:压到 0~1,早期常用,深网络易梯度消失。
- Tanh:压到 -1~1,比 Sigmoid 居中,同样怕深。


