在神经网络中,sigmoid和tanh分别是两个激活函数,用在每个layer输出的时候。

这里对这个两个激活函数做出比较,首先,将两个函数图像画到一张图上面来:

神经网络算子融合 神经网络tanh_数据结构与算法

sigmod函数: sigmod(a)=1/(1+exp(-a))

tanh函数(正切三角函数),可写成是sigmod函数的一种变形:tanh(a)=2sigmod(2a)-1,因此tanh函数的一般线性组合可写成sigmod函数的一般线性组合。

比较这两个函数:

 

相较于tanh函数,sigmod有一点缺陷,观察两条曲线,可以看出在sigmod函数处于[-1,1]之间的时候,随着x的变化,函数的变化敏感,但是一旦接近或者超出这个区间,sigmod函数就失去了敏感性,处于一种饱和状态,影响神经网络预测的精度值。

而tanh的输入和输出能够保持非线性单调上升和下降关系,符合BP网络的梯度求解,容错性好,有界,渐进与0,1,符合人脑神经饱和的规律,但比sigmod函数延迟了饱和期。

在这方面看来tanh函数比sigmod具有优越性。

参考文献:李曦,《神经网络信息传输函数sigmoid与tanh比较论证》,武汉理工大学学报,2004.

 


 Sigmoid

说到sigmoid函数,下面就来谈一谈sigmoid函数对gradient vanishing(梯度消失)的影响。

假设损失函数为C, 那么根据参数的梯度算法,前面层的梯度值等于后面层上面梯度的乘积,举例说假如有三个隐藏层,那么第一个隐藏层的梯度就等于C对output层的梯度乘以之前每一层的后一层对这一层的梯度。

这里可以参考这个总结:

然后我们发现,由于:

                                1.通常来说层跟层之前的参数w小于1.

                                2.sigmod函数的梯度的最大绝对值不超过0.25.

 

下图为sigmoid 函数与其梯度函数,可以看出其梯度的最大值为0.25

神经网络算子融合 神经网络tanh_神经网络_02

 

所以,一步步的梯度传输,会使得越靠近input层的神经元上参数的梯度越小,也就是对于越靠近输入层的参数,more knowledge from the data will be ‘lost’. 即使我们在输出层得到了big errors, 也无法对内层的参数造成很大的影响。------这便称为gradient vanishing,也就是说,使用sigmoid做激活函数会引起梯度消失。


 Rectified Linear Units

在深度学习结构中,ReLUs 被经常用于中间隐藏层。(我认为是因为,根据它的梯度ReLUs不会像sigmoid函数那样出现梯度消失的情况)

ReLUs的表达式如下,当小于0时候为0,大于0时候为本身不变(注意它仍旧是一个非线性函数):

神经网络算子融合 神经网络tanh_激活函数_03

可以看出它是一个非常简单的激活函数,当input大于0时候,其梯度为1,故它不会对靠近input层的参数造成梯度消失。并且研究表明,ReLUs激活函数对结构庞大的神经网络训练速度很快。

不过,任何事物都有它的两面性,ReLUs也有其不好的地方:

Unfortunately, ReLU units can be fragile during training and can "die". For example, a large gradient flowing through a ReLU neuron could cause the weights to update in such a way that the neuron will never activate on any datapoint again. If this happens, then the gradient flowing through the unit will forever be zero from that point on. That is, the ReLU units can irreversibly die during training since they can get knocked off the data manifold. For example, you may find that as much as 40% of your network can be "dead" (i.e. neurons that never activate across the entire training dataset) if the learning rate is set too high. With a proper setting of the learning rate this is less frequently an issue.



 

Softmax



 上面讨论的sigmoid函数和ReLUs函数,当我们应用于分类问题时候,它们往往不能很好表现。



通常来说,sigmoid函数只能应用于二分类问题(比如逻辑回归),当你遇到多分类问题的时候,这个时候就需要使用softmax激活函数了。



softmax与sigmoid一样将输出控制在0和1之间,但是不同的是,它会将output归一化使它们加和等于1.(这就可以看成是它输出了每一个分类的一个概率的分布)



softmax形式如下,其中z为每一个类别的输入。




神经网络算子融合 神经网络tanh_神经网络算子融合_04

 

所以对于一个observation来说,哪一个类别的概率最大相当于它激活了这个类别。故softmax多用于分类问题(多至上百成千类别)。