**函数---神经网络

			--------Andrew的《Neural Networks and Deep Learning》课程学习笔记

为什么使用**函数

**函数---神经网络

如图所示,是一个简单的三层神经网络,如果只使用线性**函数或者恒等**函数(不使用**函数),那么神经网络的输出就只是输入函数的线性变化,因为线性**函数的组合依然是线性**函数。这种情况下,不管使用多少个隐藏层都没有任何作用,和不使用隐藏层的效果是一样的,神经网络也就退化成了简单的线性逻辑回归。
**函数---神经网络

常用的**函数

如果想让神经网络具有强大的功能,那么就必须使用非线性的**函数。常见的**函数为sigmoid函数、双曲正切函数tanh、ReLU函数、leaky ReLU函数。

Sigmoid函数

**函数---神经网络
Sigmoid函数比较简单,由上图知它可以把输入转化成(0,1)区间的数,但是现在很少使用Sigmoid函数。
隐藏层一般不使用Sigmoid**函数,只有在特殊情况下才会使用,比如:压缩问题。
输出层也很少使用Sigmoid**函数,只在一些特殊的情况下会用,比如:二元分类问题。例:给一张图片,让判断图片中是否有猫,那么如果在输出层使用Sigmoid**函数,那么输出结果就会在(0,1)区间,当y^>0.5时,y=1,代表有猫;否则y=0,代表没有猫。

双曲正切函数tanh

**函数---神经网络
由图可知,双曲正切函数tanh可以把输入转换成(-1,1)区间的数。一般情况下,使用双曲正切函数tanh作为**函数的最终结果会严格好于使用Sigmoid函数。下面会讲具体原因。
如果在隐藏层使用双曲正切函数tanh,那么最终效果基本都会严格好于使用Sigmoid函数。因为双曲正切函数tanh的输出介于(-1,1),隐藏层函数输出的平均值会更加逼近于0。有时候,当我们训练一个学习算法时,可能会想中心化数据,使输出结果趋近于0,而不是0.5,那么使用双曲正切函数tanh就可以达到这个效果。这样会使得下一层的学习简单一点。

ReLU函数

双曲正切函数tanh和Sigmoid函数的共同缺陷:当z很大或者很小的时候,函数的斜率值会非常小,几乎接近于0。这会使得梯度下降变得很慢。
那么线性整流函数ReLU正好能解决这个问题。
**函数---神经网络
a等于0和z中较大的那个。
ReLUd的缺点:
(1)在技术上实现时,该函数在(0,0)点导数不存在,但是这个问题不必太担心。因为在实际应用中,我们通常会遇到非常接近于0的0.00000000000…
而很少会遇到0点,即使当遇到0点时,也可以把该点的导数赋值为0或1,不会对问题造成什么影响。
(2)当z为负数时,导数为0,但是这个问题在实际应用也不用太担心。ReLU还有一个版本可以解决这个问题,即:leaky ReLU。但是在实际应用中,ReLU的使用频率更高,不经常使用leaky ReLU。

leaky ReLU

**函数---神经网络

选取**函数的规则

1 如果处理的是二分类问题,那么可以把Sigmoid函数用到输出层。在隐藏层使用ReLU函数。
2 如果不确定使用什么**函数,那么推荐使用ReLU函数,一般情况下,该函数的效果最好。当然也可以不断地去尝试不同的函数作为**函数,看哪种效果更好。
3 在实际应用中,ReLU函数的使用频率最高,其次是双曲正切函数tanh,几乎不使用Sigmoid函数。