神经网络构成
人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型,由神经元构成(加权和+激活函数)
神经元
神经元就是将多个输入值进行加权累加计算再通过激活函数进行输出的地方。
神经网络
由多个神经元相互连接即可构成神经网络,相邻层之间的神经元相互连接,并给每一个连接分配一个强度,如图所示:
神经网络中信息只向一个方向移动,即从输入节点向前移动,通过隐藏节点,再向输出节点移动。其中的基本部分是:
- 输入层:即输入x的那一层
- 输出层:即输出y的那一层
- 隐藏层:输入层和输出层之间的都是隐藏层
特点有:
- 同一层的神经元之间没有连接
- 第N层的每个神经元和第N-1层的所有神经元相连,这就是全连接神经网络
- 第N-1层神经元的输出就是第N层神经元的输入
- 每个连接都有一个权重值和偏置(weight系数和bias系数)
激活函数
激活函数用于对每层的输出数据进行变换, 进而为整个网络注入了非线性因素。此时, 神经网络就可以拟合各种曲线。
- 如果没有引入非线性因素(激活函数)的网络等价于使用一个线性模型进行拟合
- 通过给网络输出增加激活函数,实现引入非线性因素,使得网络模型可以逼近任意函数,提升网络对复杂问题的拟合能力
sigmoid激活函数
激活函数公式:
激活函数求导公式:
其函数及其导数图像如下:
- sigmoid 函数可以将任意的输入映射到 (0, 1) 之间,当输入的值大致在 <-6 或者 >6 时,意味着输入任何值得到的激活值都是差不多的,这样会丢失部分的信息。比如:输入 100 和输出 10000 经过 sigmoid 的激活值几乎都是等于 1的,但是输入的数据之间相差 100 倍的信息就丢失了。
- 对于 sigmoid 函数而言,输入值在 [-6, 6] 之间输出值才会有明显差异,输入值在 [-3, 3] 之间才会有比较好的效果。
- 导数数值范围是 (0, 0.25),当输入 <-6 或者 >6 时,sigmoid 激活函数图像的导数接近为 0,此时网络参数将更新极其缓慢,或者无法更新.
- 一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。而且,该激活函数并不是以 0 为中心的,所以在实践中这种激活函数使用的很少。sigmoid函数一般只用于二分类的输出层。
tanh函数
tanh激活函数公式:
求导公式:
则tanh激活函数及其导函数图像如下:
- Tanh 函数将输入映射到 (-1, 1) 之间,图像以 0 为中心,在 0 点对称,当输入 大概<-3 或者>3 时将被映射为 -1 或者 1。其导数值范围 (0, 1),当输入的值大概 <-3 或者 > 3 时,其导数近似 0
- 与 Sigmoid 相比,它是以 0 为中心的,且梯度相对于sigmoid大,使得其收敛速度要比Sigmoid 快,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成梯度消失
- 若使用时可在隐藏层使用tanh函数,在输出层使用sigmoid函数
ReLU函数
ReLU公式:
求导公式:
ReLU函数及其导函数图像:
- ReLU 激活函数将小于 0 的值映射为 0,而大于 0 的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率
- 当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为“神经元死亡”
ReLU是目前最常用的激活函数。与sigmoid相比,RELU的优势是:
采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。 sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
SoftMax函数
softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。
SoftMax函数公式:
计算方法如下图所示:
Softmax 就是将网络输出的 logits 通过 softmax 函数,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)节点,作为我们的预测目标类别。
其他常见的激活函数
激活函数选择方法
对于隐藏层:
- 优先选择ReLU激活函数
- 如果ReLU效果不好,那么尝试其他激活,如Leaky ReLU等
- 如果使用ReLU,需要注意Dead ReLU问题,避免出现大的梯度从而导致过多的神经元死亡
- 少使用sigmoid激活函数,可以尝试使用tanh激活函数
对于输出层:
- 二分类问题选择sigmoid函数
- 多分类问题选择softmax函数
- 回归问题使用identity函数()