整理 Transformer 的过程中,我发现激活函数和 Softmax 虽然随处可见,却很容易停留在记住名称和公式的程度,因此做了一些总结。

1. 为什么需要激活函数

神经网络中的线性层可以写成 $y=Wx+b$。如果连续堆叠多个线性层,中间不加入非线性函数,那么它们仍然可以合并成一个线性变换,网络无法表示复杂的非线性关系。激活函数逐元素作用在线性层输出上,使多层网络具备拟合曲线、分段结构和复杂决策区域的能力。

2. Sigmoid

Sigmoid 将任意实数压缩到 $(0,1)$:

$$\sigma(x)=\frac{1}{1+e^{-x}}.$$

它的导数为

$$\sigma'(x)=\sigma(x)\bigl(1-\sigma(x)\bigr).$$

当 $x=0$ 时,导数达到最大值 $1/4$;当 $|x|$ 很大时,输出接近 $0$ 或 $1$,导数接近 $0$,容易产生梯度消失。Sigmoid 适合表示二分类概率,也常用作 LSTM、GRU 和门控网络中的门函数,一般不再作为深层前馈网络的默认隐藏层激活函数。

Sigmoid 函数曲线

3. Tanh

双曲正切函数将实数压缩到 $(-1,1)$:

$$\tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}.$$

它的导数为

$$\frac{d}{dx}\tanh(x)=1-\tanh^2(x).$$

Tanh 关于原点对称,输出以 $0$ 为中心;但当 $|x|$ 很大时同样会饱和并导致梯度变小。它常见于传统循环神经网络的隐藏状态更新,也可用于需要有界且包含正负值的输出。

Tanh 函数曲线

4. ReLU 与 Leaky ReLU

ReLU 是最常见的分段线性激活函数:

$$\operatorname{ReLU}(x)=\max(0,x).$$

除 $x=0$ 外,其导数为

$$\operatorname{ReLU}'(x)= \begin{cases} 0, & x<0, \\ 1, & x>0. \end{cases}$$

ReLU 计算简单,在正半轴不会因激活函数本身而压缩梯度,并且会产生稀疏激活。若某个神经元长期落在负半轴,它的梯度持续为 $0$,可能形成死亡 ReLU。Leaky ReLU 在负半轴保留一个较小斜率:

$$\operatorname{LeakyReLU}(x)= \begin{cases} x,&x\ge 0,\\ \alpha x,&x<0, \end{cases}$$

其中 $\alpha$ 通常取较小正数,例如 $0.01$。这样负半轴仍然可以传播梯度。

ReLU 函数曲线

5. GELU 与 SiLU

GELU 使用标准正态分布的累积分布函数 $\Phi(x)$ 对输入进行平滑门控:

$$\operatorname{GELU}(x)=x\Phi(x) =\frac{x}{2} \left[ 1+\operatorname{erf}\left(\frac{x}{\sqrt{2}}\right) \right].$$

常用近似式为

$$\operatorname{GELU}(x) \approx \frac{x}{2} \left[ 1+\tanh\left( \sqrt{\frac{2}{\pi}} \left(x+0.044715x^3\right) \right) \right].$$

GELU 可以看作 ReLU 的平滑版本。它允许一部分较小的负输入通过,函数在零点附近连续变化,常用于 BERT、GPT-2 等 Transformer 的 FFN。

SiLU 也称 Swish,在 $\beta=1$ 时写成

$$\operatorname{SiLU}(x)=x\sigma(x).$$

它与 GELU 都是平滑且略微非单调的自门控函数。SiLU 常用于现代视觉模型,并作为 SwiGLU 的组成部分出现在 Llama 等大语言模型中。下图左侧比较高斯累积分布函数与 Logistic Sigmoid,右侧比较 GELU、SiLU 和 ReLU。

GELU、SiLU 与 ReLU 对照

6. Softmax

Softmax 接收一个包含 $K$ 个分数的向量 $z=(z_1,\ldots,z_K)$,同时输出 $K$ 个概率:

$$p_i=\operatorname{Softmax}(z)_i =\frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}}, \qquad i=1,\ldots,K.$$

每个 $p_i$ 都在 $(0,1)$ 内,并且

$$\sum_{i=1}^{K}p_i=1.$$

因此 Softmax 将任意实数向量映射为一个类别分布。若 $z=(1,2,3)$,则

$$\operatorname{Softmax}(z) \approx(0.090,0.245,0.665).$$

最大的 logit 仍对应最大的概率,但其他类别不会被直接置为 $0$。三分类概率满足 $p_1+p_2+p_3=1$,所以所有输出都位于一个三角形概率单纯形中。下图中的 Softmax 位于三角形内部,表示各类别概率均为正;Argmax 位于顶点,只给一个类别分配全部概率。

Softmax 在三分类概率单纯形中的位置

Softmax 对所有 logit 同时加上常数时结果不变:

$$\operatorname{Softmax}(z+c\mathbf{1}) =\operatorname{Softmax}(z).$$

实现时通常先减去最大值,以避免指数溢出:

$$p_i= \frac{e^{z_i-z_{max}}} {\sum_j e^{z_j-z_{max}}}.$$

它的 Jacobian 元素为

$$\frac{\partial p_i}{\partial z_j} =p_i(\delta_{ij}-p_j).$$

在多分类模型中,Softmax 通常用于将输出 logits 转成类别概率;在 Transformer 中,它对每一行注意力分数进行归一化,使当前位置分配给所有 Key 的注意力权重之和为 $1$。

7. Sigmoid 与 Softmax 的区别

Sigmoid 对每个分量独立计算,适合二分类或多个标签可以同时成立的多标签分类。Softmax 会让所有类别相互竞争,适合一次只选择一个类别的多分类问题。例如一张图片可以同时包含人和汽车时,可以对两个标签分别使用 Sigmoid;若任务要求在猫、狗、鸟中选择唯一类别,则通常使用 Softmax。

8. 选择建议

传统全连接网络和卷积网络可以先从 ReLU 开始;担心死亡 ReLU 时可尝试 Leaky ReLU。Transformer 的 FFN 常见 GELU,现代门控 FFN 常见 SiLU 或 SwiGLU。二分类输出使用 Sigmoid,多分类输出与注意力权重归一化使用 Softmax。激活函数的选择与初始化、归一化、网络深度和任务共同相关,不应只根据单个函数的曲线判断模型效果。

9. 图像与公式来源

ReLU、Sigmoid 和 Tanh 曲线来自 Dive into Deep Learning。GELU、SiLU 与 ReLU 对照图来自 Hendrycks 与 Gimpel 的 Gaussian Error Linear Units 原始论文源码。Softmax 概率单纯形图来自 Blondel、Martins 与 Niculae 的 Learning with Fenchel-Young Losses,该论文采用 CC BY 4.0 许可。公式实现同时对照了 PyTorch 非线性激活函数文档TensorFlow Softmax 文档

最后修改:2026 年 08 月 03 日
如果觉得我的文章对你有用,请随意赞赏