神经网络(ANN)
- 神经网络 即 人工神经网络(Artificial Neural Network,简写为ANN)是一种模仿生物神经网络结构和功能的 计算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激活函数(activation function) 。
激活函数 (Activation function)
定义
- 所谓激活函数,就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
- 在人工神经网络中,一个节点的激活函数定义了该节点在给定的输入或输入集合下的输出。
- 在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。类似于人类大脑中基于神经元的模型,激活函数最终决定了是否传递信号以及要发射给下一个神经元的内容。
为什么使用激活函数?
- 激活函数能够向神经网络引入非线性因素,使得网络可以拟合各种曲线,这样神经网络就可以应用到众多的非线性模型中。
- 如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。这样的网络称为感知机,它只能解决线性可分问题,无法处理非线性问题。
激活函数有哪些性质?
- 非线性:当激活函数是非线性的,一个两层的神经网络就可以逼近基本上所有的函数。这是因为非线性激活函数能够引入非线性因素,使得神经网络能够学习和逼近复杂的函数关系。
- 可微性:对于基于梯度的优化方法,激活函数的可微性是必要的。因为神经网络的训练通常使用梯度下降法进行优化,这就要求激活函数必须是可微的,或者至少部分可微,以便计算梯度并进行参数更新。
- 单调性:当激活函数是单调的时候,单层网络能够保证是凸函数。这有助于简化优化问题,因为在凸优化中,局部最优解即全局最优解,这有助于加快训练过程的收敛速度。
- 输出值的范围:激活函数的输出值范围对于模型的训练和特征表示有重要影响。当输出值有限时,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著。而当输出值无限时,模型的训练会更加高效,但可能需要更小的学习率来避免学习过程中的不稳定。
常用的激活函数
- 激活函数分为两类,饱和激活函数和非饱和激活函数。
- 饱和激活函数包括sigmoid、tanh;非饱和激活函数包括ReLU、PReLU、Leaky ReLU、RReLU、ELU等。
- 使用“非饱和激活函数”的优势在于两点:
(1)“非饱和激活函数”能解决所谓的“梯度消失”问题。
(2)它能加快收敛速度。
一、Sigmoid激活函数
- Sigmoid函数也叫Logistic函数,它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。函数的表达式及图像如下:
优点
- Sigmoid函数输出值限定在0到1,因此它对每个神经元的输出进行了归一化;
- 用于将预测概率作为输出的模型。由于概率的取值范围是0到1,因此 Sigmoid 函数非常合适;
缺点
- 如果x取值绝对值非常大,输出会饱和,表现为函数图像的两端都很平,此时对输入的变化不敏感。
- 其导数值很大或者很小的时候都趋近于0,反向传播求导时,很容易梯度消失(权重不再更新)。
- 因为是指数形式,计算复杂度较高。
- 输出不是0均值,会导致后层的神经元的输入是非0均值的信号,会对梯度产生影响。
二、tanh/双曲正切激活函数
- Tanh激活函数与Sigmoid函数类似,但Tanh函数将其压缩至-1到1的区间内。输出以零为中心。Tanh与sigmoid的关系如下:tanh(x)=2sigmoid(2x)−1。函数表达式及图像如下:
- 与sigmoid函数相比,tanhx是0均值的。但是其导数在两端也存在饱和的现象,导致反向传播无法进行。
sigmoid与tanh的比较
- 首先,当输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。二者的区别在于输出间隔,tanh 的输出间隔为 1,并且整个函数以 0 为中心,比 sigmoid 函数更好;
-------------------------梯度消失问题-----------------------------
- 梯度消失(Gradient Vanishing) 是深度神经网络训练过程中常见的一个问题,特别是在使用基于梯度的优化算法(如反向传播)时。梯度消失的原因主要包括激活函数的导数值小、链式法则的乘积效应以及不恰当的参数初始化等。 梯度消失指的是在网络的较深层(靠近输入层的层,因为梯度是从输出层往前传,反向传播,所以靠近输入层的层是较深层)中,梯度逐渐变得非常小,甚至接近于零,导致这些层的参数几乎没有更新,从而使得这些层无法有效地学习到数据的特征。
- 为了解决梯度消失问题,可以采取以下几种方法:
1、选择合适的激活函数:使用ReLU及其变种(如Leaky ReLU、ELU等),这些激活函数的导数不会随着输入值的增大而减小,有助于缓解梯度消失问题。
2、合适的初始化权重:采用He初始化或Xavier/Glorot初始化等策略,根据网络中每层的输入和输出尺寸来适当设定权重的初始化值,从而帮助梯度更平稳地流动。
3、使用Batch Normalization:通过对每一层的输入进行规范化,将输入值变到0附近,当激活函数的输入值在0附近时,其导数最大,可以有效缓解梯度消失问题。
4、使用残差网络结构:通过添加跳跃连接,使得梯度可以直接从输出层传递到较浅的层,从而缓解梯度消失的问题。
三、Relu激活函数
- ReLU函数是一种分段线性函数,其弥补了sigmoid函数以及tanh函数的梯度消失问题,在目前的深度神经网络中被广泛使用。ReLU函数本质上是一个斜坡(ramp)函数,函数表达式及图像如下:
对比sigmoid,tanh函数,relu有明显的优点
- x>0时,不会有梯度消失的现象,反向传播可以顺利进行。
- 没有指数运行,计算简单。
- 收敛速度比上面的激活函数要快。
缺点
- 和Sigmoid函数类似,ReLU函数的输出不以零为中心,ReLU函数的输出为0或正数,给后一层的神经网络引入偏置偏移。
- 其主要缺点是Dead ReLU Problem(神经元坏死现象)。如果参数初始化不当,或者学习率太高导致在训练过程中参数更新太大,当x<0时候,梯度为0,那么这个神经元以及后面的神经元梯度一直为0,所有的数据将不再被更新。
参考链接:
神经网络基础部件-激活函数详解
一文搞懂激活函数
常用激活函数总结