ReLU 是什么?大于零原样输出、小于零输出零的激活函数
线性修正单元(Rectified Linear Unit,ReLU),也叫修正线性单元或整流线性单元,是深度学习中最常用的激活函数之一。它的规则极其简单:输入大于零时,原样输出;输入小于或等于零时,输出零。用公式表示就是取输入与零之间的较大值。
它为什么流行起来
在 ReLU 普及之前,神经网络的隐藏层通常使用 Sigmoid 或 Tanh 这类 S 形的激活函数。它们有一个严重的问题:当输入很大或很小时,函数曲线变得非常平坦,导数接近于零,这叫“饱和”。在训练深层网络时,误差需要通过反向传播逐层地传回去,每经过一层都要乘以激活函数的导数,Sigmoid 函数的导数最大也只有 0.25,经过许多层之后梯度会变得极其微小,靠近输入的那些层几乎无法得到训练,这就是梯度消失问题。ReLU 在正数区域的导数恒等于 1,不会让梯度在传递的过程中衰减,大大缓解了梯度消失,让更深的网络能够被有效地训练。
2010 年,Vinod Nair 和杰弗里·辛顿把 ReLU 用于受限玻尔兹曼机,取得了不错的效果;2011 年,Xavier Glorot、Antoine Bordes 和约书亚·本吉奥的研究表明,在深层的神经网络中使用 ReLU,即使不进行逐层的预训练,也能取得很好的效果。2012 年,AlexNet 在 ImageNet 图像识别比赛中取得了突破性的成绩,它使用了 ReLU,论文中报告使用 ReLU 的网络训练速度比使用 Tanh 快了好几倍。此后,ReLU 迅速成为深度神经网络的默认激活函数。
它的优点
缓解梯度消失:正数区域导数恒为 1,梯度可以稳定地向前传递。计算简单:只需要比较一下是否大于零,不需要计算指数,速度很快。稀疏激活:对于任何一个输入,通常会有相当一部分神经元的输出为零,也就是没有被激活。这种稀疏性被认为让网络的表示更加高效,也与大脑中同一时刻只有少数神经元活跃的现象相似。收敛更快:在实践中,使用 ReLU 的网络通常比使用 S 形激活函数的网络收敛得更快。
它的缺点:死亡 ReLU
ReLU 在负数区域的输出恒为零,导数也恒为零。如果在训练中某个神经元的权重被更新到了一个不好的位置,使得它对所有的输入加权求和之后都是负数,那么它的输出将永远是零,梯度也永远是零,这个神经元再也得不到更新,就像“死掉”了一样。如果学习率设置得过大,网络中可能会有相当比例的神经元“死亡”,降低网络的能力。此外,ReLU 的输出不以零为中心,并且在零点处不可导,在实际中通常把零点处的导数直接设为 0 或 1。
改进的变体
Leaky ReLU:在负数区域不输出零,而是输出输入乘以一个很小的斜率,比如 0.01,这样负数区域也有一点梯度,神经元不会完全“死亡”。PReLU:由何恺明等人在 2015 年提出,把负数区域的斜率当作一个可以学习的参数。ELU:在负数区域使用一条平滑的指数曲线,让输出的平均值更接近零。GELU:可以看作 ReLU 的一种平滑版本,被 BERT、GPT 等 Transformer 模型广泛采用。SwiGLU 等门控形式的激活函数,则被 Llama 等许多大语言模型使用。尽管有这些变体,ReLU 因为简单可靠,至今仍是卷积神经网络等许多模型的常用选择。