写在前面

上篇文章我们了解到感知机使用的阶跃函数和符号函数,它们都是非连续,导数为0的函数:

【深度学习_TensorFlow】激活函数-LMLPHP

建议回顾上篇文章,本篇文章将介绍神经网络中的常见激活函数,这些函数都是平滑可导的,适合于梯度下降算法。


写在中间

激活函数是做什么的?


激活函数(Activation Function)是神经网络中的一个重要组成部分,主要用于将神经元的输入信息进行非线性变换,从而引入非线性特性。

为什么要使用激活函数?


如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是线性组合,这种情况就是最原始的感知机。将来归纳出的方程就如图a所示,要实现图b的效果就只能将线性模型嵌套非线性函数转换为非线性函数。

【深度学习_TensorFlow】激活函数-LMLPHP

我们把这个非线性函数称为激活函数(Activation Function),用𝜎表示:

这里的𝜎代表了某个具体的非线性激活函数,如 Sigmoid 函数、ReLU 函数

【深度学习_TensorFlow】激活函数-LMLPHP

表达能力


模型的表达能力偏弱,就可以通过堆叠多次变换来增加其表达能力

把第一层神经元的输出值 h 1 h_1 h1作为第二层神经元模型的输入,把第二层神经元的输出 h 2 h_2 h2作为第三层神经元的输入,最后一层神经元的输出作为模型的输出,使用ReLU激活函数举例


激活函数介绍

一、Sigmoid

( 1 )简单介绍

此函数的定义如下

【深度学习_TensorFlow】激活函数-LMLPHP

在深度学习中的优点如下:

  • 它的值域为(0, 1),能够把𝑥 ∈ 𝑅的输入“压缩”到𝑥 ∈ (0,1)区间,和概率的分布范围[0,1]契合,可以通过 Sigmoid 函数将输出转译为概率输出

  • Sigmoid 函数连续可导,可以直接利用梯度下降算法优化网络参数


( 2 )简单实现

如何在TensorFlow中使用这个函数呢,其实一行代码就可以搞定了

tf.nn.sigmoid(x) # 通过 Sigmoid 函数

二、ReLU

( 1 )简单介绍

在 ReLU激活函数提出之前,Sigmoid 函数通常是神经网络的激活函数首选。但是 Sigmoid 函数在输入值较大或较小时容易出现梯度值接近于 0 的现象,网络参数长时间得不到更新,导致训练不收敛或停滞不动的现象发生。

此函数的定义如下:

【深度学习_TensorFlow】激活函数-LMLPHP

可以看到,ReLU 对小于 0 的值全部抑制为 0;对于正数则直接输出


( 2 )函数实现

函数的调用同样简单

tf.nn.relu(x)

三、LeakyReLU

( 1 )简单介绍

ReLU 函数在𝑥 < 0时导数值恒为 0,也可能会造成梯度弥散现象,为了克服这个问题,LeakyReLU 函数被提出,此函数的定义为:

【深度学习_TensorFlow】激活函数-LMLPHP

其中𝑝为用户自行设置的某较小数值的超参数,如 0.02 等。当𝑝 = 0时,LeayReLU 函数退化为ReLU 函数;当𝑝 ≠ 0时,𝑥 < 0处能够获得较小的导数值𝑝,从而避免出现梯度弥散现象。

( 2 )函数实现

tf.nn.leaky_relu(x, alpha=0.02) 

四、Tanh

( 1 )简单介绍

Tanh 函数能够将𝑥 ∈ 𝑅的输入“压缩”到(−1,1)区间,其函数的定义为

【深度学习_TensorFlow】激活函数-LMLPHP


( 2 )代码实现

tf.nn.tanh(x) 

激活函数输出范围

了解了上面的函数之后,不知你是否有这样的疑问,这么多种函数,在进行网络构建的时候究竟如何选择?

其实这其中还是有些门道的,主要根据数据的范围和构建网络的目的来选择,具体情况还要结合实际问题试验:

例如:

  • 输出区间为[0, 1],在网络模型主要进行二分类(猫狗识别分类)、图片生成(像素归一化),就可以使用类似Sigmoid()一类的函数。

  • 输出区间为[0, 1],且所有数据的概率和为1,网络模型主要进行多分类问题(mnist手写数字识别),就可以使用类似Softmax()一类的函数。

  • 输出区间为[-1, 1],就可以使用Tanh() 函数。

  • 输出区间在某个段内,网络模型进行年龄预测、股票走势的预测,更倾向于回归问题,ReLU函数可能效果较好。


写在最后

08-05 07:53