导读
数字逻辑电路中的门电路可以让满足不同条件的输入信号输出开(1)或关(0)输出。
这体现在机器学习中感知机的性质。但我们也知道感知机有个局限性,即无法单层表示非线性变化,
而神经网络往往通过激活函数用来表示非线性变化。即激活函数的作用就是引入非线性。
神经元输出
神经元的输出信号是由激活函数o = f(∑)得处理后,得到得输出,如图所示
性质
激活函数是一个几乎可微得函数,满足非线性,连续性
常见激活函数
sigmoid;tanh;ReLU;LReLU, PReLU, RReLU;ELU(Exponential Linear Units);softplus;softsign,softmax;Mish;GELU
Sigmoid函数
Sigmoid函数曾被广泛地应用,也是非常经典的logic函数。Sigmoid函数被定义为:
函数对应的图像是:
优点:1.Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。2.求导容易。
缺点:1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。2.其输出并不是以0为中心的。
tanh函数
函数位于[-1, 1]区间上,对应的图像是:
优点:1.比Sigmoid函数收敛速度更快。2.相比Sigmoid函数,其输出以0为中心。缺点:还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。
sigmoid函数可以很容易地应用在训练过程中。然而,当你想要处理分类问题时,他们却无能为力。简单地说,sigmoid函数只能处理两个类,这不适用于多分类的问题。所以softmax可以有效解决这个问题。并且softmax函数很多情况都运用在shenjingwanglu神经网路中的最后一层网络中,使得值得区间在0,1之间,而不是二分类的。
ReLU
ReLU是最近几年非常受欢迎的激活函数。被定义为
对应的图像是:
优点:1.相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛。
2.Sigmoid和tanh涉及了很多很expensive的操作(比如指数),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
ELUs是对ReLU激活函数的一种演变,将激活函数更能够保持一个noise-robust状态。所以提出一个具有负值的激活函数,这可以使得平均激活接近于零,但它会以更小的参数饱和为负值的激活函数ELUs。ELUs激活函数的公式The exponential linear unit (ELU) with 0 <α如下展示
ELU通过在正值区间取输入x本身减轻了梯度弥散问题(x>0区间导数处处为1),这一点特性这四种激活函数都具备。四者当中只有ReLU的输出值没有负值,所以输出的均值会大于0,当激活值的均值非0时,就会对下一层造成一个bias,如果激活值之间不会相互抵消(即均值非0),会导致下一层的激活单元有bias shift。如此叠加,单元越多时,bias shift就会越大。相比ReLU,ELU可以取到负值,这让单元激活均值可以更接近0,类似于Batch Normalization的效果但是只需要更低的计算复杂度。虽然LReLU和PReLU都也有负值,但是它们不保证在不激活状态下(就是在输入为负的状态下)对噪声鲁棒。反观ELU在输入取较小值时具有软饱和的特性,提升了对噪声的鲁棒性。如图所示,其中α是一个可调整的参数,它控制着ELU负值部分在何时饱和。
于Relu的不同:
1、它在x<0处激活值为负值,而且导数不为0这是一点很好的性质,因为ReLU在输入为负时导数会变成0,这会引起神经元死亡的问题,ELU改进了这一点,并且让这部分呈现一种软饱和,这种软饱和有助于提升噪声鲁棒性(显然LReLU对噪声会敏感)。
2、可以使得输出均值为0ReLU的所有输出都为非负数,所以它的输出均值必然非负,而这一点性质会导致网络的均值偏移(bias shift也叫mean shift)。所以ReLU在训练一些超深网络的时候就会出现不收敛的问题。
Softplus与Softsign
Softplus被定义为
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 模型(谷歌的 BERT 和 OpenAI 的 GPT-2)中得到了应用。GELU 的论文来自 2016 年,但直到最近才引起关注。这种激活函数的形式为:
看得出来,这就是某些函数(比如双曲正切函数 tanh)与近似数值的组合。没什么过多可说的。有意思的是这个函数的图形:
GELU 激活函数。
可以看出,当 x 大于 0 时,输出为 x;但 x=0 到 x=1 的区间除外,这时曲线更偏向于 y 轴。我没能找到该函数的导数,所以我使用了 WolframAlpha 来微分这个函数。结果如下:
和前面一样,这也是双曲函数的另一种组合形式。但它的图形看起来很有意思:
微分的 GELU 激活函数。
优点:
- 似乎是 NLP 领域的当前最佳;尤其在 Transformer 模型中表现最好;
- 能避免梯度消失问题。
总结
见下图
本文暂时没有评论,来添加一个吧(●'◡'●)