文章目录


在TensorFlow的训练中,为了更好的模拟或者学习更多的特征,在线性函数中引入了非线性,又名激活函数。如果你对激活函数不甚了解,你可以点击

。这一章我们主要将一些常用的激活函数。

​详情请点击​


一些常用的激活函数如下图:


TensorFlow之三—激活函数(Activation Functions)_权重

1. sigmoid函数

由上图第一个可知,导数从 0 开始很快就又趋近于 0 了,易造成“梯度消失”现象
调用函数:​​​tf.sigmoid(x, name = None) == tf.nn.sigmoid(x, name = None)​

2. tanh 双曲正切函数

tanh函数和sigmod函数的曲线是比较相近的,由上图。首先相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。它把输入映射到 (-1, 1) 区间,但仍然会导致梯度消失问题 !
调用函数:​​​tf.tanh(x, name = None) == tf.nn.tanh(x, name = None)​

公式:TensorFlow之三—激活函数(Activation Functions)_权重_02

3. relu 函数

比 sigmoid/tanh 收敛的更快,其导数在其权重和(z) 大于 0 的时候为 1,从而误差可以很好的传播,权重可以正常更新。

但是,其导数在其权重和(z) 小于 0 的时候为 0,会导致梯度值为0(神经元死亡),从而权重无法正常更新输出具有偏移现象,即输出均值恒大于零。
调用函数:​​​tf.nn.relu(features, name=None)​​ 公式:y = max(x, 0)

4. ELU函数

函数图如上图。
ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱和和指数运算的问题。

5. PReLU函数

函数图如上图。
PReLU也是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势吧。

我们看PReLU的公式,里面的参数α一般是取0~1之间的数,而且一般还是比较小的,如零点零几。当α=0.01时,我们叫PReLULeaky ReLU,算是PReLU的一种特殊情况吧。

6. 其它函数

​tf.nn.relu6(features, name = None)​​​ 公式:TensorFlow之三—激活函数(Activation Functions)_权重_03

​tf.nn.softplus(features, name = None)​​​ 公式: TensorFlow之三—激活函数(Activation Functions)_权重_04

​tf.nn.bias_add(value, bias, name = None)​​ 偏执项