1、神经网络结构
深度神经网络是非线性的、含有多个隐层的神经网络。
1.1、非线性
神经网络为什么强调非线性?
只通过线性的变换,任意层的全链接神经网络和单层的神经网络模型的表达能力没有任何的区别,他们都是线性的模型。多个线性的层也只表达了一层的效果。
激活函数实现去线性化
如果每一个神经元(神经网络中的节点)的输出通过一个非线性的函数,那么整个神经网络的输出就不再线性了,而这个非线性的函数就是激活函数。
Tensorflow提供了7种非线性的激活函数:
1、sigmod函数:
公式:
函数图像:
特点:
优点:它输出映射在(0,1)内,单调连续,非常适合用作输出层,并且求导比较容易;
缺点:具有软饱和性,一旦输入落入饱和区,一阶导数就变得接近于0,很容易产生梯度消失。
(饱和性):当|x|>c时,其中c为常数,此时一阶导数等于0。
2、tanh函数
公式:
函数图像:
特点:
优点:它输出映射在(-1,1)内,单调连续,非常适合用作输出层,并且求导比较容易;且收敛的速度比sigmod更快。
缺点:同样具有软饱和性,一旦输入落入饱和区,一阶导数就变得接近于0,很容易产生梯度消失。
3、relu函数
目前最受欢迎也是用的最多的激活函数。
公式:
函数图像:
特点:
优点:由于当x>0时一阶导数为1。所以,relu函数在x>0时可以保持梯度不衰减,从而缓解梯度消失问题,还可以更快的去收敛。
缺点:随着训练的进行,部分输入会落到硬饱和区,导致对应的权重无法更新。我们称之为“神经元死亡”
除了relu本身外,TensorFlow还定义了relu6,也就是定义在min(max(features, 0), 6)的tf.nn.relu6(features, name=None),以及crelu,也就是tf.nn.crelu(features, name=None).
4、softplus函数
公式:
函数图像:
5、leakrelu函数
leakrelu函数是relu激活函数的改进版本,解决部分输入会落到硬饱和区,导致对应的权重无法更新的问题。
公式:
函数图像:
特点:
优点:左边缩小方差,右边保持方差;方差整体还是缩小的。
缺点:均值得不到保障
6、ELU函数
公式:
函数图像:
7、SELU函数
最近的自归一化网络中提出
公式:
函数图像:
蓝色是:selu,橙色是:elu
特点:
左边缩小方差,右边放大方差,适当选取参数alpha和lambda,使得整体上保持方差与期望。如果选取:
lambda=1.0506,alpha=1.67326,那么可以验证如果输入的x是服从标准正态分布,那么SELU(x)的期望为0,方差为1.
1.2、多层网络解决异或运算
:单层的神经网络有一个很大的问题就是无法进行异或计算,而加入隐层之后异或问题就能得到很好的解决,同时在很多的实例中我们看到深层的神经网络实际上有组合特征提取的功能,这个特征对于解决提取特征向量的问题(如图像识别、语音识别等)有很大的帮助,也是深度神经网络在这些方面容易取得突破的原因。