激活函数是一种函数,用于决定人工神经网络中单元或层的输出。它通常作用于输入的加权组合与偏置之和。非线性激活函数使网络能够表示仅靠仿射变换无法表达的关系;输出层的激活函数则可以将预测结果限制在特定范围内,或使其符合特定的概率分布。激活函数的数学性质既影响网络的表征能力,也影响深度学习中的学习过程。(deeplearningbook.org)
数学形式与作用
对于典型的单元,其计算过程为
其中, 为输入, 为权重, 为偏置, 为预激活值, 为激活函数。对于全连接层,这一计算写作 ,其中 为权重矩阵。大多数隐藏层激活函数独立作用于各个分量,但也有一些函数会将多个分量耦合起来。(deeplearningbook.org)
在多层感知机中,如果连续的仿射变换之间没有非线性运算,那么这些变换可以合并为一个仿射变换。例如,
因此,仅仅增加这样的层并不能赋予网络非线性表达能力。非线性激活函数使隐藏表征能够改变输入空间的几何结构,从而支持表征学习,而不只是反复进行线性预测。(en.d2l.ai)
主要的标量函数
恒等函数与阈值函数。 恒等激活函数 保持输入不变,适用于需要不受约束的实数输出的场景。阈值激活函数则根据输入是否越过阈值,返回两个值中的一个。经典的感知机采用阈值判定,但阶跃函数在不连续点以外的导数均为零,因此不适合常规的基于梯度的训练。(deeplearningbook.org)
逻辑斯蒂 sigmoid 函数。 逻辑斯蒂函数在神经网络语境中通常称为 sigmoid 函数,其表达式为
它将有限的实数输入映射到 ,其导数为 。其输出有界,因此可用于输出概率形式的预测结果,逻辑回归便是一个例子。当输入为较大的正数或绝对值较大的负数时,函数会进入饱和区,导数趋近于零。(en.d2l.ai)
双曲正切函数。 双曲正切激活函数将输入映射到 ,其导数为 。与 sigmoid 函数不同,它的输出范围关于零对称。它在两端也会进入饱和区,因此导数可能变得很小。(en.d2l.ai)
修正线性单元。 修正线性单元(ReLU)的表达式为
负输入对应的输出为零,正输入对应的输出则呈线性变化。其导数在负半轴上为零,在正半轴上为一;由于零点处的通常意义下的导数不存在,具体实现会采用约定值。如果一个单元对所有相关输入都始终处于负半轴,那么就不会有梯度通过其激活函数传递,这种现象常称为“ReLU 死亡”。(deeplearningbook.org)
带泄漏与参数化的修正线性函数。 带泄漏的 ReLU(Leaky ReLU)将负半轴分支替换为 ,其中斜率通常为较小的正数。参数化 ReLU(PReLU)则通过学习确定这一斜率,而不是将其固定。当 时,这些变体在负输入处仍保有非零导数。PReLU 于 2015 年的一项研究中提出,该研究还开发了适用于修正线性网络的初始化方法。(arxiv.org)
平滑变体与指数变体
指数线性单元(ELU)对于非负输入取值为 ,对于负输入取值为 ,其中 。它在保留正半轴线性分支的同时,允许输出负值。其负半轴分支会趋向 并进入饱和区。(arxiv.org)
高斯误差线性单元(GELU)于 2016 年提出,其表达式为
其中, 为标准正态分布的累积分布函数。GELU 不像 ReLU 那样根据输入的正负进行硬截断,而是用 对输入进行连续加权。具体实现可以使用其精确表达式,也可以使用近似式。(arxiv.org)
Sigmoid 线性单元(SiLU)的表达式为 ,采用这一形式时也称为 Swish。它平滑且非单调,有下界但无上界。这些函数在平滑性、饱和特性、输出范围和计算成本等方面有所不同;非线性并不要求函数具有单调性或有界性。(keras.io)
输出层激活函数与概率
输出层激活函数的作用不同于隐藏层中的非线性函数。对于互斥的类别,Softmax函数将一个得分向量转换为各分量均为正且总和为一的向量:
与逐元素作用的激活函数不同,输出的每个分量都依赖于所有输入得分。一个 sigmoid 函数可以表示二分类的概率,多个独立的 sigmoid 函数则可以表示不必互斥的多个标签。恒等输出适用于无约束的回归任务,包括使用均方误差训练的模型。(keras.io)
激活函数与损失函数必须结合起来理解。软件库可能将 sigmoid 函数与二元交叉熵合并为一个数值稳定的运算,并以原始得分作为输入。在这种情况下,若在计算损失之前显式应用 sigmoid 函数,就会重复执行这一变换。(docs.pytorch.org)
与训练的相互影响
反向传播利用链式法则,通过激活函数的导数传递梯度。反复乘以较小的导数可能加剧梯度消失问题,尤其是在由处于饱和区的单元构成的深层网络中。激活函数的行为也与权重初始化相互影响:2010 年的一项研究分析了饱和现象以及梯度在各层之间的传播,随后又出现了专门针对修正线性函数的初始化方法。因此,激活函数的选择会与权重尺度、网络深度共同影响优化过程,而不是独立于这些因素起作用。(deeplearningbook.org)
激活函数不一定是固定的标量公式。PReLU 包含通过学习得到的参数,而门控线性单元则将输入分为两部分,并计算 ,其中 表示逐元素乘法。因此,软件库既支持简单的可调用激活函数,也支持能够维护可训练状态的专用激活层。(arxiv.org)