激活函数是什么?让神经网络具备非线性表达能力的关键
激活函数(Activation Function)是神经网络中每个神经元在计算出输入的加权和之后,再对结果进行的一次非线性变换。它决定了神经元的输出,也是神经网络能够学习复杂规律的关键所在。
为什么需要激活函数
神经网络中的每个神经元,会把它的所有输入乘以各自的权重再相加,这是一个线性运算。如果没有激活函数,或者只使用线性的激活函数,那么无论网络有多少层,整个网络的计算都只是一连串线性运算的组合,而多个线性运算组合起来仍然是一个线性运算。也就是说,一个一百层的网络,效果和一层的网络没有区别,只能拟合直线、平面这样简单的关系,无法处理现实世界中大量复杂的非线性问题,比如识别图像、理解语言。激活函数引入了非线性,让网络能够通过层层组合,拟合出任意复杂的函数。
常见的激活函数
Sigmoid 函数:把任意的输入压缩到 0 到 1 之间,曲线呈 S 形。它的输出可以理解为概率,早期的神经网络中被广泛使用,现在主要用于二分类问题的输出层和门控机制中。它的缺点是当输入很大或很小时,曲线变得非常平坦,导数接近零,容易导致梯度消失,让深层网络难以训练。
Tanh 函数(双曲正切):把输入压缩到负 1 到 1 之间,形状与 Sigmoid 类似,但输出以零为中心,训练起来通常比 Sigmoid 更好,在循环神经网络中常用,但同样存在梯度消失的问题。
ReLU 函数(修正线性单元):规则非常简单,输入为正时原样输出,输入为负时输出零。它计算极其简单,在正数区域导数恒为 1,有效地缓解了梯度消失的问题,大大加快了深层网络的训练。2010 年前后被引入深度学习,2012 年的 AlexNet 使用了它,此后成为最常用的激活函数。它的缺点是如果一个神经元的输入总是负数,它的输出和梯度就永远是零,再也无法被更新,这叫“神经元死亡”。
ReLU 的变体:Leaky ReLU 在输入为负时输出一个很小的斜率乘以输入,而不是零,避免神经元死亡;还有 PReLU、ELU 等变体。
GELU(高斯误差线性单元):可以看作 ReLU 的一种平滑版本,在零附近的过渡更加柔和。BERT、GPT 等 Transformer 模型广泛使用了它。Swish 函数也有类似的平滑形状。
SwiGLU:一种结合了门控机制的激活方式,由 Noam Shazeer 在 2020 年提出改进,研究表明它能提升 Transformer 的效果。Llama、Qwen 等很多大语言模型的前馈网络部分都采用了它。
Softmax 函数:通常用于多分类问题的输出层,它把一组任意的数值转换成一组和为 1 的概率,表示样本属于各个类别的可能性。
如何选择
一般来说,在卷积神经网络等常规的隐藏层中,ReLU 及其变体是简单可靠的默认选择;在 Transformer 和大语言模型中,GELU 和 SwiGLU 更常用;输出层则根据任务来选择:二分类用 Sigmoid,多分类用 Softmax,回归任务通常不使用激活函数,直接输出数值。