深度学习基于人工神经网络的结构,而人工神经网络是模拟生物神经元的。从生物学上说,当人脑的细胞接受刺激产生活动时,首先需要该刺激超过一定的电位阈值,若没有达到阈值,则几乎不会产生活动。不同的刺激产生的输出是不同的,在刺激达到一定值后输出就饱和了。
神经元逐级传递信息,上层神经元的输出作为下层神经元的输入,经过一个非线性激活函数激活处理后继续往下传递,如此循环往复,直到输出层。正是由于这些非线性函数的反复叠加,才使神经网络有足够的非线性拟合能力。选择的激活函数将影响整个深层神经网络的效果。
下面介绍卷积神经网络中的各类激活函数。
1.线性模型与阈值模型
一个复杂的神经网络包含许多网络,其中最基本的单元便是神经元。对一个线性神经元,其输入为 x ,权重为 w ,偏置为 b ,输出为 y ,则变换关系如下。
因为输出与输入呈现线性关系,该线性神经元只能对非常简单的问题进行建模。如果再增加一层,把 y 作为中间层,输出为 z ,并假设这一层的权重为 w′ ,偏置为 b′ ,则输入 x 与输出 z 有如下关系。
可以看出,最终的输出 z 与 x 仍然是线性关系,也就是说,这样堆叠下去,输出与输入永远都是线性关系。人们期望神经网络可以模拟任意的函数,而这不可能用一个线性函数来完成。所以需要在线性神经元输出后添加非线性函数,非线性函数添加得越多,变换就越复杂,模型的表达能力就越强。
最早的非线性映射函数是二值阈值函数,由心理学家Warren Sturgis MuCulloch和数学家Walter Harry Pitts于1943年合作提出。他们基于此搭建了MP模型,其输入与输出都使用了包含0和1的线性阈值神经元,变换关系如下。
如式(2.10)所示,当线性输出大于阈值th时,输出为1;当线性输出小于阈值th时,输出为0。这样的阈值神经元可以实现布尔函数,完成“与”和“或”操作。
当 x 是一个二维的向量,所有权重连接值为1时,二值线性阈值神经元模型如图2.10所示。
当 b =-0.5, y = f ( x 1 + x 2 -0.5),因为 x 1 和 x 2 的输入都是0/1,图2.10所示就是一个逻辑“或”模型,当 x 1 或 x 2 等于1时,输出为1;当两者都等于0时,输出为0。
当 b =-1.5, y = f ( x 1 + x 2 -1.5),因为 x 1 和 x 2 的输入都是0/1,图2.10所示就是一个逻辑“与”模型,当 x 1 和 x 2 等于1时,输出为1;否则,输出为0。
线性阈值模型是最简单的非线性变换,所以其能实现的功能非常有限,在现今的深度学习模型中几乎不再使用。
2.Sigmoid函数与Tanh函数
大脑神经元的状态仅分为抑制或兴奋,早期常用Sigmoid函数与Tanh函数来描述。
Sigmoid函数的表达式如下。
Sigmoid函数示意如图2.11所示。
图2.10 二值线性阈值神经元模型
图2.11 Sigmoid函数示意
Sigmoid函数是传统的神经网络模型和深度学习模型早期发展时使用频率最高的激活函数,它将输出平滑地映射到0~1,是便于求导的平滑函数,其导数如下。
因为 f ( x )取值为0~1,所以其导数取值也为0~1。Sigmoid函数具有非常好的可解释性,其模拟了一个神经元随着输入不断增加从完全不激活到完全激活的过程,符合生物学上的原理,因此在神经网络模型的早期研究中被广泛使用。不过Sigmoid函数有以下两个非常大的缺陷。
其一是Sigmoid函数的两端是饱和区,饱和区内梯度接近于0,这会带来熟知的梯度消失问题。一旦神经元的初始化或优化进入了饱和区,将难以继续优化。另外,随着网络层数的增加,由于链式法则,连乘的Sigmoid函数导数也会变得越来越小,导致梯度难以回传,这会降低网络的收敛速度,甚至导致网络不能收敛到好的状态。
其二是Sigmoid函数的输出并不以0为中心,总是大于0,而权重参数的梯度与输入有关,这就会造成在反向传播时,一个样本的某个权重的梯度总是同一个符号,这不利于权重的更新。
Tanh函数解决了Sigmoid函数的输出值并不以0为中心的问题,但梯度消失问题和幂运算问题仍然存在。Tanh函数表达式如下。
Tanh函数示意如图2.12所示。
图2.12 Tanh函数示意
3.线性ReLU函数及其改进
2001年,神经科学家Dayan和Abott从生物学角度模拟了脑神经元接收信号更精确的激活模型,该模型在正区间平滑地增加,在负区间没有激活。同年,Attwell等人在研究大脑能量消耗时,发现神经元编码工作方式具有稀疏性和分布性。2003年,Lennie等人估测大脑同时被激活的神经元只有1%~4%,进一步证实了神经元工作的稀疏性。这说明神经元同时只会对输入信号的少部分选择性响应,但Sigmoid函数表示同时有一半的神经元被激活,这不符合要求,因此需要新的具有稀疏性的激活函数来学习相对稀疏的特征。
最早用于模拟上述特征的激活函数是2001年提出的Softplus函数,其表达式如下。
Xavier Glorot等人在论文 Deep Sparse Rectifier Neural Networks [7] 中指出,使用线性整流单元(ReLU函数)作为激活函数比使用Sigmoid函数、Tanh函数作为激活函数更好,其表达式如下。
ReLU函数示意如图2.13所示。
ReLU函数本质是一个取最大值函数,其非全区间可导,但在计算过程中可以取近似梯度。当 x >0时,梯度为1;否则,梯度为0。
ReLU在正区间内解决了梯度消失问题,在使用时只需要判断输入是否大于0,所以其计算速度非常快,收敛速度远快于Sigmoid函数和Tanh函数。
但是ReLU函数的输出存在Dead ReLU问题,即某些神经元可能永远不会参与计算,导致其相应的参数无法被更新。参数初始化及学习速率太大都可能使网络进入这种状态,解决方法是采用Xavier等初始化方法,以及避免将学习速率设置太大,或者使用AdaGrad等自动调节学习速率的算法。
那么在零点处的导数不连续是否会影响优化呢?研究者比较了Softplus函数和ReLU函数,发现ReLU函数表现更好,从而可知导数的不连续并不影响性能,只要正区间导数可以传递。
研究者针对ReLU函数提出了许多的改进方法,如Leaky ReLU、ELU、SELU等。
Leaky ReLU函数表达式如下。
其函数示意如图2.14所示。
图2.13 ReLU函数示意
图2.14 Leaky ReLU函数示意
Leaky ReLU函数的提出是为了解决Dead ReLU问题,其将ReLU函数的前半段设为0.01 x 而非0。从理论上来讲,Leaky ReLU函数有ReLU函数的所有优点,并且不会有Dead ReLU问题,但实际操作并没有完全证明Leaky ReLU函数总是好于ReLU函数。
如果将 x <0一侧的函数取非线性函数,则可以得到指数线性函数(ELU函数),其表达式如下。
ELU函数由Djork等人提出,能够使神经元的平均激活均值趋于0,对噪声具有较高的鲁棒性。但是其由于需要计算指数,计算量较大。
自归一化神经网络(Self-Normalizing Neural Networks)中提出,只需要把激活函数换成SELU函数,就能使输入在经过一定层数之后变成固定的分布。SELU函数表达式为SELU( x ) =λ· ELU( x )。
如果将Leaky ReLU中的0.01设置为一个可以学习的参数 α ,就得到了PreLU函数。相比之下,PreLU函数增加了少量的参数量,如果每个通道都单独激活,则增加的参数量等于通道数。研究人员发现,学习到的 α 在网络的浅层,尤其是在第一层卷积中会比较大,而到了深层就比较小。这也可以理解为网络的浅层学习到了类似于Gabor的浅层特征,更大的 α 可以提取到更加稠密的特征,而随着网络深度的增加,特征变得更加稀疏。
如果让 α 参数在训练中是随机的,就得到了RReLU函数,通常 α 从一个均匀的分布中随机抽取,这可以看作一个正则项,用于增强网络的泛化能力。
GELUs函数则通过输入的幅度而不是ReLU的门控机制来进行激活,它可以起到随机正则化的效果,其函数表达式如下。
式中, Φ(x) 是一个伯努利分布。GELUs在 x 值比较小时对输入进行随机恒等变化或0映射,一个建议的映射如下。
4.Maxout函数
Maxout函数就是最大值函数,它从多个输入中取最大值,其求导非常简单,只在最大值的一路有梯度。
Maxout函数可以看作在深度学习网络中加入一层激活函数层,其包含一个参数 k 。这一层相比ReLU函数,Sigmoid函数等的特殊之处在于增加了 k 个神经元,并输出最大的激活值。
Maxout函数的拟合能力非常强,可以拟合任意的凸函数。Maxout函数具有ReLU函数的所有优点,线性、不饱和性,同时没有ReLU函数的缺点。实验结果表明,Maxout函数与Dropout组合使用可以发挥比较好的效果。
5.Softmax函数
Softmax函数可视为Sigmoid函数的泛化形式,其本质是将一个 K 维的任意实数向量压缩(映射)成另一个 K 维的实数向量,向量中的每个元素取值都位于0和1之间。该函数一般用于多分类神经网络输出。
Softmax函数表达式如下。
6.激活函数的自动搜索
研究人员一直在搜索更好的激活函数,Swish函数 [8] 就是由网络自动搜索出来的激活函数,其表达式如下。
式中, β 是一个常数或可训练的参数。Swish函数具备无上界有下界、平滑、非单调的特性。研究表明,Swish函数在深层模型上的效果优于ReLU函数。如果 β= 1,Swish函数就是在增强学习中常用的SiLU函数。
除了Swish函数,还有其他通过搜索得到的激活函数,如式(2.23)所示。
随着基于搜索的方法渐渐成为主流,未来依旧可能会出现更好的激活函数。
7.激活函数的研究方向 [9]
对激活函数的研究,未来集中在以下几个方向。
(1)对ReLU函数负区域进行改进。
(2)研究不同激活策略对不同的网络层、不同的通道使用的影响。
(3)使用各类学习方法来对简单函数的组合进行探索。
虽然有许多新的比ReLU函数更好的激活函数出现,但ReLU函数仍然是最通用的。