**函数总结
什么是**函数?
**函数对于神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。首先,数据的分布绝大多数是非线性的,而一般神经网络的计算是线性的,引入**函数,是在神经网络中引入非线性,强化网络的学习能力。没有**函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
**函数
1、Sigmoid函数
Sigmoid函数又叫Logistic函数,因为Sigmoid函数可以从Logistic回归中推导得到,同时也是Logistic回归模型指定的**函数。Sigmoid函数的函数图如下,可以看到Sigmoid函数的取值范围为(0, 1)之间,因此它可以将网络的输出映射并压缩在这一范围内,因此可以非常方便计算概率。
Sigmoid公式及其导数
Sigmoid作为**函数的特点:
优点:平滑、易于求导。
缺点:
- **函数计算量大(在正向传播和反向传播中都包含幂运算和除法);
- 反向传播求误差梯度时,求导涉及除法;
- Sigmoid导数取值范围是[0, 0.25],由于神经网络反向传播时的“链式反应”,很容易就会出现梯度消失的情况。例如对于一个10层的网络, 根据,第10层的误差相对第一层卷积的参数的梯度将是一个非常小的值,这就是所谓的“梯度消失”。
- Sigmoid的输出不是0均值(即zero-centered);这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,随着网络的加深,会改变数据的原始分布。
2、tanh函数
tanh为双曲正切函数,其英文读作Hyperbolic Tangent。tanh和 sigmoid 相似,都属于饱和**函数,区别在于输出值范围由 (0,1) 变为了 (-1,1),可以把 tanh 函数看做是 sigmoid 向下平移和拉伸后的结果。
tanh及其导数公式
tanh作为**函数的特点:
相比Sigmoid函数,
- tanh的输出范围时(-1, 1),解决了Sigmoid函数的不是zero-centered输出问题;
- 幂运算的问题仍然存在;
- tanh导数范围在(0, 1)之间,相比sigmoid的(0, 0.25),梯度消失(gradient vanishing)问题会得到缓解,但仍然还会存在。
3、ReLu
整流线性单位函数(Rectified Linear Unit, ReLU),又称修正线性单元, 是一种人工神经网络中常用的激励函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。线性整流被认为有一定的生物学原理,并且由于在实践中通常有着比其他常用激励函数(譬如逻辑函数)更好的效果,而被如今的深度神经网络广泛使用于诸如图像识别等计算机视觉人工智能领域。
Relu函数及其导数的公式
从上图可知,ReLU实际上是一个分段线性函数,该函数将所有负数都变为零,而正数则保持不变,这种操作被称为单侧抑制,使得神经网络中的神经元具备稀疏**性,尤其体现在深度神经网络模型(如CNN)中,当模型增加N层之后,理论上ReLU神经元的**率将降低倍。
ReLu的有效导数是常数1,解决了深层网络中出现的梯度消失问题,也就使得深层网络可训练。同时ReLU又是非线性函数,所谓非线性,就是一阶导数不为常数;对ReLU求导,在输入值分别为正和为负的情况下,导数是不同的,即ReLU的导数不是常数,所以ReLU是非线性的(只是不同于Sigmoid和tanh,relu的非线性不是光滑的)。
ReLU在x>0下,导数为常数1的特点:
导数为常数1的好处就是在“链式反应”中不会出现梯度消失,但梯度下降的强度就完全取决于权值的乘积,这样就可能会出现梯度爆炸问题。解决这类问题:一是控制权值,让它们在(0,1)范围内;二是做梯度裁剪,控制梯度下降强度,如ReLU(x)=min(6, max(0,x))
p.s. 什么是梯度消失问题:当梯度小于1时,预测值与真实值之间的误差每传播一层会衰减一次,如果在深层模型中使用sigmoid作为**函数,这种现象尤为明显,将导致模型收敛停滞不前
ReLU在x<0下,输出置为0的特点:
描述该特征前,需要明确深度学习的目标:深度学习是根据大批量样本数据,从错综复杂的数据关系中,找到关键信息(关键特征)。换句话说,就是把密集矩阵转化为稀疏矩阵,保留数据的关键信息,去除噪音,这样的模型就有了鲁棒性。ReLU 将x<0的输出置为0,就是一个去噪音,稀疏矩阵的过程。而且在训练过程中,这种稀疏性是动态调节的,网络会自动调整稀疏比例,保证矩阵有最优的有效特征。
但是 ReLU 强制将 x<0 部分的输出置为0(置为0就是屏蔽该特征),可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于‘dead’状态,所以使用 ReLU 的网络,学习率不能设置太大。
ReLU作为**函数的特点:
- 简化计算过程:没有了其他复杂**函数中诸如指数函数的影响;同时活跃度的分散性使得神经网络整体计算成本下降
- 解决了梯度消失问题,收敛速度快于Sigmoid和tanh函数,但要防范ReLU的梯度爆炸
- 容易得到更好的模型,但也要防止训练中出现模型‘Dead’情况。
4、ELU
ELU是在ReLU的基础上提出了改进得到的**函数,函数图像如图所示。
由于ReLU的输出值没有负值,所以输出的均值会大于0,当**值的均值非0时,就会对下一层造成一个bias,如果**值之间不会相互抵消(即均值非0),会导致下一层的**单元有bias shift。如此叠加,单元越多时,bias shift就会越大。因此在ReLu的基础上提出了Leaky ReLU、PReLU、RReLU、ELU等**函数,其中最常用的就是ELU。
相比ReLU,ELU可以取到负值,这让单元**均值可以更接近0,类似于Batch Normalization的效果但是只需要更低的计算复杂度。虽然LReLU和PReLU都也有负值,但是它们不保证在不**状态下(就是在输入为负的状态下)对噪声鲁棒。反观ELU在输入取较小值时具有软饱和的特性,提升了对噪声的鲁棒性。如图所示,其中α是一个可调整的参数,它控制着ELU负值部分在何时饱和。
ELU及其导数的公式
ELU函数的特点
优点:
- ELU包含了ReLU的所有优点。
- 神经元不会出现死亡的情况。
- ELU**函数的输出均值是接近于零的。
缺点:
- 计算的时候是需要计算指数的,计算效率低的问题。
参考资料
本文的撰写参考自以下文章及网页,非常感谢这些文章给予我的启发,本人也强烈推荐读者能移步至如下链接去阅读这些文章。
[1] **函数总结
[2] 指数线性单元
[3] 手把手教你理解卷积神经网络
[4] 维基百科:**函数
[5] 深度学习中几种常见的**函数理解与总结