深度激活工具(激活函数的作用)
导读
数字逻辑电路中的门电路可以使满足不同条件的输入信号输出导通(1)或截止(0)。这反映在机器学习中感知器的性质中。但我们也知道感知器有一个局限性,那就是它无法表示单层的非线性变化,而神经网络往往通过激活函数来表示非线性变化。也就是说,激活函数的作用是引入非线性。神经元输出
神经元的输出信号由激活函数o=f()得处理后,得到得输出,如图所示给出
性质
激活函数是满足非线性和连续性的几乎可微函数。
常见激活函数
乙状结肠;正切;ReLU;LReLU、PReLU、RReLU;ELU(指数线性单位);软加;软签名、软最大;米什;格鲁
Sigmoid函数
Sigmoid函数得到了广泛的应用,也是非常经典的逻辑函数。sigmoid函数定义为:
该函数对应的图像为:
优点:1.Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。2.求导容易。
缺点:1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。2.其输出并不是以0为中心的。
tanh函数
该函数位于区间[-1,1]内,对应的图像为:
优点:1.比Sigmoid函数收敛速度更快。2.相比Sigmoid函数,其输出以0为中心。缺点:还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。
sigmoid函数可以很容易地应用在训练过程中。然而,当你要处理分类问题时,它们就无能为力了。简单来说,sigmoid函数只能处理两类,不适合多分类问题。所以softmax可以有效解决这个问题。并且很多情况下在深井网路神经网络的最后一层使用softmax函数,使得取值范围在0到1之间,而不是二元分类。
ReLU
ReLU是近年来非常流行的激活函数。定义为
对应的图像是:
优点:1.相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛。
2.Sigmoid和tanh涉及许多昂贵的运算(例如指数),而ReLU可以更简单地实现。3.有效缓解梯度消失问题。4.即使没有无监督的预训练也能取得更好的性能。
5.提供神经网络的稀疏表达能力。
缺点:随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
LReLU、PReLU和RReLU
通常在LReLU和PReLU中,我们将激活函数定义为:
LReLU当ai比较小而且固定的时候,我们称之为LReLU。LReLU最初的目的是为了避免梯度消失。但在一些实验中,我们发现LReLU对准确率并没有太大的影响。很多时候,当我们想要应用LReLU时,我们必须要非常小心谨慎地重复训练,选取出合适的a,LReLU的表现出的结果才比ReLU好。因此有人提出了一种自适应地从数据中学习参数的PReLU。
PReLUPReLU是LReLU的改进,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。
ELUs
ELU是ReLU激活函数的演变,使激活函数更能够维持抗噪声状态。因此,提出一个具有负值的激活函数,它可以使平均激活接近于零,但它会使具有较小参数的负激活函数ELU饱和。ELUs激活函数的公式为0的指数线性单元(ELU)如下所示
ELU通过将输入x本身取为正值区间(x0区间的导数处处为1)来缓解梯度弥散问题。所有四个激活函数都共享此功能。四者中,只有ReLU的输出值没有负值,因此输出的均值会大于0。当激活值的均值非0时,会对下一层造成偏差。如果激活值不相互抵消(即均值非0),这将导致下一层的激活单元产生偏差。以这种方式叠加时,单元越多,偏置偏移就越大。与ReLU相比,ELU可以取负值,这使得单元激活均值更接近于0,类似于BatchNormalization的效果,但需要较低的计算复杂度。虽然LReLU和PReLU也都有负值,但不能保证它们在非活动状态(即输入为负时)对噪声具有鲁棒性。另一方面,ELU在输入取较小值时具有软饱和特性,提高了对噪声的鲁棒性。如图所示,是一个可调参数,控制ELU负部分何时饱和。
与Relu的区别:
1.它在x0处的激活值为负数,导数不为0。这是一个很好的性质,因为当输入为负数时,ReLU的导数会变成0,这会导致神经元死亡的问题。ELU对此进行了改进,并且允许这部分表现出软饱和,这有助于提高噪声鲁棒性(显然LReLU对噪声很敏感)。
2.所有输出均值为0ReLU的输出都可以设为非负,因此其输出均值必然为非负,这个性质会导致网络发生均值漂移(biasshift,也称为均值漂移)。因此,ReLU在训练一些超深网络时会出现不收敛的问题。
Softplus与Softsign
Softplus定义为
Softplus的倒数是sigmoid函数
软签名定义为
Softsign曲线和梯度
Mish
直接看Mish的代码会更简单。简单总结一下,Mish=x*tanh(ln(1+e^x))。
PyTorch的Mish实现:
扩展型指数线性单元激活函数(SELU)
扩展指数线性单元激活函数比较新,介绍它的论文包含90页的附录(包括定理和证明等)。实际应用该激活函数时,必须使用lecun_normal进行权重初始化。如果你想应用dropout,你应该使用AlphaDropout。下面的代码部分将进行更详细的介绍。论文作者计算了公式的两个值:和;如下:
正如您所看到的,为了保证绝对精度,它们的小数点后有很多位。它们是预先确定的,这意味着我们不必担心为此激活函数选择正确的值。说实话,这个公式看起来和其他公式或多或少有些相似。所有新的激活函数看起来都像是其他现有激活函数的组合。SELU的公式如下:
也就是说,如果输入值x大于0,则输出值为x乘以;如果输入值x小于0,则会得到奇异函数——,该函数随着x的增大而增大,并接近x为0时的值0.0848。本质上,当x小于0时,乘以x值的指数,减去,然后乘以值。
SELU功能图。
GELU
高斯误差线性单元激活函数用于最近的Transformer模型(Google的BERT和OpenAI的GPT-2)。GELU论文是2016年的,但最近才引起关注。该激活函数的形式为:
可以看出,这是某些函数(例如双曲正切函数tanh)和近似数值的组合。没什么好说的。有趣的是这个函数的图表:
GELU激活函数。
可见,当x大于0时,输出为x;除了从x=0到x=1的区间外,此时曲线更倾向于y轴。我无法找到这个函数的导数,所以我使用WolframAlpha来微分该函数。结果如下:
和以前一样,这是双曲函数的另一种组合。但它的图形看起来很有趣:
微分GELU激活函数。
优势:
好像是目前NLP领域最好的;尤其是在Transformer模型中表现最好;它可以避免梯度消失问题。总结
见下图