激活函数使用法则

sigmoid 、tanh 、ReLu

  • tanh 函数或者双曲正切函数是总体上都优于 sigmoid 函数的激活函数。

  • 基本已经不用 sigmoid 激活函数了,tanh 函数在所有场合都优于 sigmoid 函数。
  • 但有一个例外:在二分类的问题中,对于输出层,因为y的值是 0 或 1,所以想让y值介于 0 和 1 之间,而不是在-1 和+1 之间。所以需要使用 sigmoid 激活函数。
  • sigmoid 函数和 tanh 函数两者共同的缺点是,在z特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度。

这有一些选择激活函数的经验法则:

  • 如果输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。
  • 这是很多激活函数的默认选择,如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当z是负值的时候,导数等于 0。

这里也有另一个版本的 Relu 被称为 Leaky Relu。

  • 当z是负值时,这个函数的值不是等于 0,而是轻微的倾斜,如图。
  • 这个函数通常比 Relu 激活函数效果要好,尽管在实际中 Leaky ReLu 使用的并不多。

两者的优点是:

  • 第一,在z的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于0,在程序实现就是一个 if-else 语句,而 sigmoid 函数需要进行浮点四则运算,在实践中,使用 ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快。
  • 第二,sigmoid 和 tanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度弥散,而 Relu 和 Leaky ReLu 函数大于 0 部分都为常熟,不会产生梯度弥散现象。(同时应该注意到的是,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会有这问题)
  • z在 ReLu 的梯度一半都是 0,但是,有足够的隐藏层使得 z 值大于 0,所以对大多数的训练数据来说学习过程仍然可以很快。

快速概括一下不同激活函数的过程和结论。

  • sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
  • tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
  • ReLu 激活函数:最常用的默认函数,,如果不确定用哪个激活函数,就使用 ReLu 或者Leaky ReLu。

 

如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者发展集上进行评价。然后看哪一种表现的更好,就去使用它。

来源:吴恩达deeplearning笔记

猜你喜欢

转载自www.cnblogs.com/tanrong/p/9932087.html