赞
踩
Sigmoid. Sigmoid(也叫逻辑激活函数) 非线性激活函数的形式是σ(x)=1/(1+e−x),其图形如上图左所示。之前我们说过,sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1。sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。而现在sigmoid已经不怎么常用了,主要是因为它有两个缺点:
Tanh. Tanh和Sigmoid是有异曲同工之妙的,它的图形如上图右所示,不同的是它把实值得输入压缩到-1~1的范围,因此它基本是0均值的,也就解决了上述Sigmoid缺点中的第二个,所以实际中tanh会比sigmoid更常用。但是它还是存在梯度饱和的问题。Tanh是sigmoid的变形:tanh(x)=2σ(2x)−1。
ReLU. 近年来,ReLU 变的越来越受欢迎。它的数学表达式是: f(x)=max(0,x)。很显然,从上图左可以看出,输入信号
<0时,输出为0,>0时,输出等于输入。ReLU的优缺点如下:
Leaky ReLU. Leaky ReLUs 就是用来解决ReLU坏死的问题的。和ReLU不同,当x<0时,它的值不再是0,而是一个较小斜率(如0.01等)的函数。也就是说f(x)=1(x<0)(ax)+1(x>=0)(x),其中a是一个很小的常数。这样,既修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。
PReLU. 对于 Leaky ReLU 中的a,通常都是通过先验知识人工赋值的。然而可以观察到,损失函数对a的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢? Kaiming He 2015的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。原文说使用了Parametric ReLU后,最终效果比不用提高了1.03%.
Randomized Leaky ReLU. Randomized Leaky ReLU (RRELU)是 leaky ReLU 的random 版本, 其核心思想就是,在训练过程中,a是从一个高斯分布中随机出来的,然后再在测试过程中进行修正。
这几种常见的激活函数实现代码如下:
- static inline float linear_activate(float x){return x;}
- static inline float logistic_activate(float x){return 1./(1. + exp(-x));}
- static inline float loggy_activate(float x){return 2./(1. + exp(-x)) - 1;}
- static inline float relu_activate(float x){return x*(x>0);}
- static inline float elu_activate(float x){return (x >= 0)*x + (x < 0)*(exp(x)-1);}
- static inline float relie_activate(float x){return (x>0) ? x : .01*x;}
- static inline float ramp_activate(float x){return x*(x>0)+.1*x;}
- static inline float leaky_activate(float x){return (x>0) ? x : .1*x;}
- static inline float tanh_activate(float x){return (exp(2*x)-1)/(exp(2*x)+1);}
Swish激活函数
Mish激活函数
下面是Relu、Swish、Mish三个激活函数的激活输出,从中可以发现Mish相对于ReLU、Swish显得更加平滑一些。:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。