整理 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 和门控网络中的门函数,一般不再作为深层前馈网络的默认隐藏层激活函数。
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|$ 很大时同样会饱和并导致梯度变小。它常见于传统循环神经网络的隐藏状态更新,也可用于需要有界且包含正负值的输出。
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$。这样负半轴仍然可以传播梯度。
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。

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 对所有 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 文档。