文章目录

  1. 1. 为什么使用激活函数
  2. 2. 几个常见的激活函数
    1. 2.1. sigmoid 函数
    2. 2.2. tanh 函数
    3. 2.3. ReLU 函数
  3. 3. 如何选择
  4. 4. TensorFlow 的支持
  5. 5. 参考资料


微信公众号

为什么使用激活函数

为什么使用激活函数,激活函数有什么用呢?事实上,激活函数实现去线性化,给神经网络提供了非线性建模能力。换句话说,如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。如果使用激活函数的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

当一个完整的神经元被定义的时候,它通常是带有“线性模型”和“激活函数”两个部分首尾相接而成的。

enter image description here

几个常见的激活函数

sigmoid 函数

enter image description here

enter image description here

sigmoid 函数的输出映射在(0,1)之间,其中的 1 表示完全激活的状态,0 表示完全不激活的状态,其他各种输出值就介于两者之间,表示其激活程度不同。因此,它通过这种方式引入了非线性因素。

sigmoid 函数基本上是我们所有学习神经网络时,第一个接触到的激励函数了。它曾被广泛地应用,但由于其自身的一些缺陷,最明显的就是饱和性,容易产生梯度消失,导致训练出现问题。此外,其输出并不是以 0 为中心的。

一般情况下,可以将 sigmoid 函数用作输出层。

tanh 函数

enter image description here

enter image description here

tanh 函数也是一种非常常见的激活函数。

tanh 函数也叫双曲正切函数,该函数位于[-1, 1]区间上。事实上,tanh 函数跟 sigmoid 函数长相是很相近的,都是一条“S”型曲线。只不过 tanh 函数是把输入值投射到 -1 和 1 上去。其中,-1 表示完全不激活,1 表示完全激活,中间其他值也是不同的激活程度的描述。

比起 sigmoid 函数,我们通常更倾向于 tanh 函数。与 sigmoid 函数相比,它的输出以 0 为中心,并且它的收敛速度比 sigmoid 快,能减少迭代次数。但是,注意的是,tanh 函数同样具有软饱和性,从而造成梯度消失。

ReLU 函数

enter image description here

enter image description here

ReLU 函数是目前大部分卷积神经网络CNN中喜欢使用的激活函数。在这个函数的原点左侧部分斜率为 0,在右侧则是一条斜率为 1 的直线。

ReLU 函数相较于 sigmoid 函数和 tanh 函数,它对于 SGD 中能够快速收敛。此外,相较于 sigmoid 函数和 tanh 函数,ReLU 函数只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的(指数)运算。但是,随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是 0。也就是说,ReLU 神经元在训练中不可逆地死亡了。举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果合理设置学习率,会降低这种情况的发生概率。

如何选择

  • 一般情况下,tanh 函数会比 sigmoid 函数效果更好。
  • 如果使用 ReLU,那么要合理设置学习率,而且要注意不要让你的网络出现很多神经元死亡,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout。
  • 此外,实践过程中,需要结合实际情况,考虑不同激活函数的优缺点综合使用。

TensorFlow 的支持

目前,TensorFlow 提供了 7 种不同的非线性激活函数,tf.nn.relutf.nn.sigmoidtf.nn.tanh是其中比较常用的几个。

a = tf.nn.relu(tf.matmul(x, W) + b)

参考资料

文章目录

  1. 1. 为什么使用激活函数
  2. 2. 几个常见的激活函数
    1. 2.1. sigmoid 函数
    2. 2.2. tanh 函数
    3. 2.3. ReLU 函数
  3. 3. 如何选择
  4. 4. TensorFlow 的支持
  5. 5. 参考资料