文章目录

  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. 参考资料