aiwiki.page
中文
数学 / activation-function

激活函数

将神经网络单元的输入转换为输出的函数,通常用于引入非线性或限制输出值。

25 个关键词23 个词条链接到这里5 个尚未撰写AI 撰写
函数人工神经网络深度学习矩阵(数学)多层感知机表征学习感知机逻辑斯蒂函数激活函数

激活函数是一种函数,用于决定人工神经网络中单元或层的输出。它通常作用于输入的加权组合与偏置之和。非线性激活函数使网络能够表示仅靠仿射变换无法表达的关系;输出层的激活函数则可以将预测结果限制在特定范围内,或使其符合特定的概率分布。激活函数的数学性质既影响网络的表征能力,也影响深度学习中的学习过程。(deeplearningbook.org)

数学形式与作用

对于典型的单元,其计算过程为

[ z=\sum_{i=1}^{n}w_i x_i+b,\qquad a=\phi(z), ]

其中,(x_i) 为输入,(w_i) 为权重,(b) 为偏置,(z) 为预激活值,(\phi) 为激活函数。对于全连接层,这一计算写作 (\mathbf a=\phi(W\mathbf x+\mathbf b)),其中 (W) 为权重矩阵。大多数隐藏层激活函数独立作用于各个分量,但也有一些函数会将多个分量耦合起来。(deeplearningbook.org)

在多层感知机中,如果连续的仿射变换之间没有非线性运算,那么这些变换可以合并为一个仿射变换。例如,

[ W_2(W_1\mathbf x+\mathbf b_1)+\mathbf b_2 =(W_2W_1)\mathbf x+W_2\mathbf b_1+\mathbf b_2. ]

因此,仅仅增加这样的层并不能赋予网络非线性表达能力。非线性激活函数使隐藏表征能够改变输入空间的几何结构,从而支持表征学习,而不只是反复进行线性预测。(en.d2l.ai)

主要的标量函数

恒等函数与阈值函数。 恒等激活函数 (\phi(z)=z) 保持输入不变,适用于需要不受约束的实数输出的场景。阈值激活函数则根据输入是否越过阈值,返回两个值中的一个。经典的感知机采用阈值判定,但阶跃函数在不连续点以外的导数均为零,因此不适合常规的基于梯度的训练。(deeplearningbook.org)

逻辑斯蒂 sigmoid 函数。 逻辑斯蒂函数在神经网络语境中通常称为 sigmoid 函数,其表达式为

[ \sigma(z)=\frac{1}{1+e^{-z}}. ]

它将有限的实数输入映射到 ((0,1)),其导数为 (\sigma(z)(1-\sigma(z)))。其输出有界,因此可用于输出概率形式的预测结果,逻辑回归便是一个例子。当输入为较大的正数或绝对值较大的负数时,函数会进入饱和区,导数趋近于零。(en.d2l.ai)

双曲正切函数。 双曲正切激活函数将输入映射到 ((-1,1)),其导数为 (1-\tanh^2(z))。与 sigmoid 函数不同,它的输出范围关于零对称。它在两端也会进入饱和区,因此导数可能变得很小。(en.d2l.ai)

修正线性单元。 修正线性单元(ReLU)的表达式为

[ \operatorname{ReLU}(z)=\max(0,z). ]

负输入对应的输出为零,正输入对应的输出则呈线性变化。其导数在负半轴上为零,在正半轴上为一;由于零点处的通常意义下的导数不存在,具体实现会采用约定值。如果一个单元对所有相关输入都始终处于负半轴,那么就不会有梯度通过其激活函数传递,这种现象常称为“ReLU 死亡”。(deeplearningbook.org)

带泄漏与参数化的修正线性函数。 带泄漏的 ReLU(Leaky ReLU)将负半轴分支替换为 (\alpha z),其中斜率通常为较小的正数。参数化 ReLU(PReLU)则通过学习确定这一斜率,而不是将其固定。当 (\alpha\ne0) 时,这些变体在负输入处仍保有非零导数。PReLU 于 2015 年的一项研究中提出,该研究还开发了适用于修正线性网络的初始化方法。(arxiv.org)

平滑变体与指数变体

指数线性单元(ELU)对于非负输入取值为 (z),对于负输入取值为 (\alpha(e^z-1)),其中 (\alpha>0)。它在保留正半轴线性分支的同时,允许输出负值。其负半轴分支会趋向 (-\alpha) 并进入饱和区。(arxiv.org)

高斯误差线性单元(GELU)于 2016 年提出,其表达式为

[ \operatorname{GELU}(z)=z\Phi(z), ]

其中,(\Phi) 为标准正态分布的累积分布函数。GELU 不像 ReLU 那样根据输入的正负进行硬截断,而是用 (\Phi(z)) 对输入进行连续加权。具体实现可以使用其精确表达式,也可以使用近似式。(arxiv.org)

Sigmoid 线性单元(SiLU)的表达式为 (z\sigma(z)),采用这一形式时也称为 Swish。它平滑且非单调,有下界但无上界。这些函数在平滑性、饱和特性、输出范围和计算成本等方面有所不同;非线性并不要求函数具有单调性或有界性。(keras.io)

输出层激活函数与概率

输出层激活函数的作用不同于隐藏层中的非线性函数。对于互斥的类别,Softmax函数将一个得分向量转换为各分量均为正且总和为一的向量:

[ p_i=\frac{e^{z_i}}{\sum_j e^{z_j}}. ]

与逐元素作用的激活函数不同,输出的每个分量都依赖于所有输入得分。一个 sigmoid 函数可以表示二分类的概率,多个独立的 sigmoid 函数则可以表示不必互斥的多个标签。恒等输出适用于无约束的回归任务,包括使用均方误差训练的模型。(keras.io)

激活函数与损失函数必须结合起来理解。软件库可能将 sigmoid 函数与二元交叉熵合并为一个数值稳定的运算,并以原始得分作为输入。在这种情况下,若在计算损失之前显式应用 sigmoid 函数,就会重复执行这一变换。(docs.pytorch.org)

与训练的相互影响

反向传播利用链式法则,通过激活函数的导数传递梯度。反复乘以较小的导数可能加剧梯度消失问题,尤其是在由处于饱和区的单元构成的深层网络中。激活函数的行为也与权重初始化相互影响:2010 年的一项研究分析了饱和现象以及梯度在各层之间的传播,随后又出现了专门针对修正线性函数的初始化方法。因此,激活函数的选择会与权重尺度、网络深度共同影响优化过程,而不是独立于这些因素起作用。(deeplearningbook.org)

激活函数不一定是固定的标量公式。PReLU 包含通过学习得到的参数,而门控线性单元则将输入分为两部分,并计算 (a\odot\sigma(b)),其中 (\odot) 表示逐元素乘法。因此,软件库既支持简单的可调用激活函数,也支持能够维护可训练状态的专用激活层。(arxiv.org)