激活函数是神经网络中的关键组件,它的主要作用是引入非线性,使神经网络能够学习和表示复杂的非线性关系。
在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。
如果没有激活函数,神经网络中的每一层都只是对输入进行线性变换,多个线性变换的组合仍然是线性变换,无法解决实际问题中的复杂模式。通过在每一层添加激活函数,网络可以捕捉到数据中的非线性特征,从而提高模型的表达能力和性能。
激活函数本身并不是神经网络中需要学习的参数。它们是预定义的数学函数,用来引入非线性,将线性组合的输入转换为非线性输出。
激活函数的参数化变种
尽管大多数常用的激活函数(如ReLU、Sigmoid、Tanh等)是固定的非线性函数,但有些激活函数是参数化的,意味着它们的某些部分可以通过模型训练进行学习。
常见的例子包括:
-
Leaky ReLU:Leaky ReLU 是 ReLU 的变种,允许负值区域有一个小的非零斜率,而这个斜率可以是一个固定值或可学习的参数(称为 α)。通过学习 α,模型可以自适应负值的处理。
-
PReLU (Parametric ReLU):它是 Leaky ReLU 的扩展,其中负值部分的斜率 α 是一个可学习的参数。在训练过程中,模型可以调整这个参数,以优化负值区域的处理。
-
Swish: Swish 是一种新型激活函数,由公式 f(x) = x * sigmoid(βx) 表示,其中 β 可以是一个可学习的参数。训练中,模型可以调整这个参数,以更好地适应数据特征。
在这些情况下,可学习的参数是激活函数的一部分,而网络会在训练过程中根据数据来学习这些参数的最佳值。
激活函数本身不学习,但影响学习
虽然激活函数本身不需要学习,但它们的选择会对网络的学习过程产生重要影响。比如:
-
ReLU 会使得某些神经元输出恒为零,导致“稀疏激活”,从而使得网络只聚焦于一些重要的特征。
-
Sigmoid 和 Tanh 函数在某些条件下可能导致梯度消失问题,影响权重的更新速度,进而影响学习效果。
常见激活函数:Sigmoid (S形函数)
公式:
优点:
- 将输出压缩到 (0, 1) 区间,适合处理概率问题。
缺点:
- 容易导致梯度消失问题,特别是在深层网络中。
- 输出非零中心,可能影响梯度更新的效率。
梯度消失问题
在深层神经网络中,梯度通过链式法则反向传播。如果每一层的梯度都非常小,那么经过多层的链式乘积之后,梯度会变得越来越小,最后几乎消失。这就叫做梯度消失问题。
由于梯度过小,网络的权重几乎无法更新,从而导致训练变得非常困难,特别是在深层网络中。
Sigmoid 输出范围限制:
Sigmoid 函数的输出是一个范围在 (0, 1) 之间的值。当输入值非常大时,Sigmoid 的输出趋近于 1;当输入值非常小时,输出趋近于 0。这意味着,当输入较大或较小时,输出几乎饱和(趋向于极限值 0 或 1)。
初始权重影响:
如果网络的权重初始化不当,比如初始权重过大,会导致 Sigmoid 函数的输入很大,从而使输出趋近于饱和状态,这也会加剧梯度消失问题。
因此,使用 Sigmoid 函数时,网络的权重初始化和层数都会影响梯度消失的发生。
常见激活函数:ReLU(Rectified Linear Unit)
公式:
这意味着当输入
\(x>0\) 时,输出为 $$;
当输入 \(x≤0\) 时,输出为 \(0\)。
优点:
- 简单高效,计算速度快。
- 缓解了梯度消失问题,有助于训练深层网络。
缺点:
- 存在“死亡 ReLU”问题,即神经元可能在训练过程中变为永远不激活。
- 输出非零中心。
死亡 ReLU 问题
“死亡 ReLU”问题是指在训练神经网络的过程中,某些神经元的输出永远为 0,不再对任何输入产生激活。这些神经元被称为“死亡”神经元,因为它们不再对模型的输出产生任何影响。
学习率过大,权重的初始值不合适,都可能会导致。
常见激活函数:GELU(Gaussian Error Linear Unit)
其中,\(\Phi(x)\)是标准正态分布的累积分布函数。
优点:
- 在 Transformer 等模型中表现良好,能更好地捕捉非线性关系。
- 平滑的曲线,有助于优化过程。
缺点:
- 计算复杂度较高,计算量大。由于涉及到误差函数(erf)和指数运算,计算相对复杂,尤其是在资源受限的设备上。
常见激活函数:SwiGLU
Llama 通常使用 SwiGLU(Switching-Gated Linear Units)激活函数。SwiGLU 是一种经过改进的激活函数,最早在 Google 的《Switch Transformers》论文中提出,结合了 gate 机制以提高模型的表现和训练效率。
公式:
其中,\(\sigma(x)\) 是 Sigmoid 函数:
因此,SwiGLU 的完整公式为:
为什么现在大家都用 SwiGLU
计算效率更高:
-
简化的计算过程:SwiGLU 避免了复杂的数学函数,采用了更简单的操作,如乘法和 Sigmoid。
-
硬件友好:这些基本运算在现代硬件(如 GPU、TPU)上都有高度优化,实现更快的计算速度。
性能表现出色:
-
实验结果支持:在多项研究和实际应用中,使用 SwiGLU 的模型在准确率、收敛速度等方面都有优异表现。
-
更好的梯度特性:SwiGLU 的梯度平滑,促进了模型的稳定训练。
资源效率:
-
降低计算成本:在大规模模型(如大型语言模型)中,计算资源和时间是关键限制。SwiGLU 的高效性使得模型训练和推理更为经济。
-
节省内存占用:计算复杂度的降低也带来了内存使用的优化。
稳定性:
在训练深度神经网络时,SwiGLU 有助于减轻梯度消失和梯度爆炸的问题,促进模型的稳定训练。
由于这些优势,SwiGLU 在一些最新的研究和应用中逐渐成为主流的激活函数之一,特别是在处理自然语言处理任务的大型模型中。
总结
激活函数在神经网络中扮演着至关重要的角色,不同的激活函数有各自的适用场景和特点。
SwiGLU 之所以在当前的模型中受到青睐,主要是因为它在性能和计算效率之间取得了良好的平衡。
然而,选择合适的激活函数仍然需要根据具体的任务和模型架构进行权衡和实验。