常用的激活函数有sigmoid, ReLU,leaky-ReLU,parameter-ReLU,ReLU6,SELU,Swish或Mish
Relu
Relu(x)={if x>0 then x;else 0}为了在反向传播算法中可以正常使用,将其在x=0x=0处的导数置为1,所以它的导数也就变为了 δRelu(x)={if x>0 then 1 else 0}
Relu是一个非常优秀的激活哈数,相比较于传统的Sigmoid函数,有三个作用
- 防止梯度弥散,sigmoid的导数只有在0附近的时候有比较好的激活性,在正负饱和区的梯度都接近于0,所以这会造成梯度弥散,而relu函数在大于0的部分梯度为常数,所以不会产生梯度弥散现象。
- 稀疏激活性:elu函数在负半区的导数为0 ,所以一旦神经元激活值进入负半区,那么梯度就会为0,也就是说这个神经元不会经历训练,即所谓的稀疏性。
- 加快计算: relu函数的导数计算更快,程序实现就是一个if-else语句,而sigmoid函数要进行浮点四则运算
Leaky ReLU和parameter-ReLU
Leaky ReLU就是说小于0的地方我们不是乘0,我们小于零的地方乘上0.01,马上就会有人问说为什么是乘0.01呢 ? 那么就出现了Parametric ReLU,Parametric ReLU就是说小于0的地方,我们就乘上一个系数alpha,这个参数通过模型学习得到。
image.pngSeLu
the scaled exponential linear units的简称
image.png
代码放到Tensorflow里面就下面几行:
def selu(x):
with ops.name_scope('elu') as scope:
alpha = 1.6732632423543772848170429916717
scale = 1.0507009873554804934193349852946
return scale*tf.where(x>=0.0, x, alpha*tf.nn.elu(x))
效果比Batch Normalization 要好
优点是:
不存在死区
存在饱和区(负无穷时, 趋于 - αλ
)
输入大于零时,激活输出对输入进行了放大
证明
网友评论