在多层神经网络中,每一层的输入与输出呈线性关系,多层的话,该多层神经网络的输入和输出之间关系仅是内部多层隐藏层和输出层多个线性关系式的联合,即输入和输出之间仍是线性关系,这样的话,多层神经网络就跟单层神经网络相同了,做起来就没有什么意义。即全连接层只对数据做仿射变换,而多个仿射变换的叠加依旧是一个仿射变换。
在上述情况下,解决该问题的方法之一就是引入非线性变换,如:对隐层变量使用按元素运算的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为激活函数(activation function)。
常见的激活函数有以下几个:
- ReLU函数:该函数只保留正数元素,负数均置为0。该函数现常用于神经网络中。
- 表达式:ReLU(x) = max(x, 0)
- 函数图像:
-
优点:
-
解决了gradient vanishing问题 (在正区间)
-
计算速度非常快,只需要判断输入是否大于0
-
收敛速度远快于sigmoid和tanh
-
-
缺点:
-
输出不是zero-centered
-
Dead ReLU Problem,某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。
-
参数初始化不合适
-
学习率太高导致在训练过程中参数更新太大,使网络进入这种状态
-
-
- sigmoid函数:它可以将元素的值变换到0到1之间。
- 函数表达式:
- 函数图像:
- 特点:它能够把输入的连续实值变换为0和1之间的输出,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
- 缺点:sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。
- 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失
- sigmoid 的 output 不是0均值(即zero-centered),这样会倒是收敛缓慢
- 解析式中含有指数运算,计算机求解时相对来讲比较耗时
- tanh函数:又称双曲正切函数,它可以将值变换到-1到1之间。
- 函数表达式:
- 函数图像:
- 它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。