目录
一、激活函数定义
二、梯度消失与梯度爆炸
1.什么是梯度消失与梯度爆炸
2.梯度消失的根本原因
3.如何解决梯度消失与梯度爆炸问题
三、常用激活函数
1.Sigmoid
2.Tanh
3.ReLU
4.Leaky ReLU
5.ELU
6.softmax
7.Swish
一、激活函数定义
激活函数 (Activation functions) 对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到神经网络中。在下图中,输入的 inputs 通过加权,求和后,还被作用了一个函数f,这个函数f就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
为什么使用激活函数?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
激活函数有哪些性质?
- 非线性:当激活函数是非线性的,一个两层的神经网络就可以基本上逼近所有的函数。但如果激活函数是恒等激活函数的时候,即f(x) = x,就不满足这个性质,而且如果MLP使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的。
- 可微性:当优化方法是基于梯度的时候,就体现的该本质。
- 单调性:当激活函数是单调的时候,单层网络能够保证是凸函数。
- 输出值的范围:当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练更加高效,不过这种情况很小,一般需要更小的learning rate。
二、梯度消失与梯度爆炸
1.什么是梯度消失与梯度爆炸
梯度消失与梯度爆炸
层数比较多的神经网络模型在训练的时候会出现梯度消失(gradient vanishing problem)和梯度爆炸(gradient exploding problem)问题。梯度消失问题和梯度爆炸问题一般会随着网络层数的增加变得越来越明显。
例如,一个网络含有三个隐藏层,梯度消失问题发生时,靠近输出层的hidden layer 3的权值更新相对正常,但是靠近输入层的hidden layer1的权值更新会变得很慢,导致靠近输入层的隐藏层权值几乎不变,仍接近于初始化的权值。这就导致hidden layer 1 相当于只是一个映射层,对所有的输入做了一个函数映射,这时此深度神经网络的学习就等价于只有后几层的隐藏层网络在学习。梯度爆炸的情况是:当初始的权值过大,靠近输入层的hidden layer 1的权值变化比靠近输出层的hidden layer 3的权值变化更快,就会引起梯度爆炸的问题。
2.梯度消失的根本原因
梯度消失的根本原因
以下图的反向传播为例:
假设σ为sigmoid,C为代价函数。
下图(1)式为该网络的前向传播公式。
根据前向传播公式,我们得出梯度更新公式:
其中由公式(1)得出
sigmoid函数的导数如下图所示
的最大值是。对于2式的链式求导,层数越多,求导结果越小,前面的网络层比后面的网络层梯度变化更小,故权值变化缓慢,最终导致梯度消失的情况出现。
梯度爆炸的根本原因
当
sigmoid和tanh是“饱和激活函数”,而ReLU及其变体则是“非饱和激活函数”。使用“非饱和激活函数”的优势在于两点:(1)”非饱和激活函数”能解决所谓的“梯度消失”问题。(2)它能加快收敛速度。
Sigmoid函数将一个实值输入压缩至[0,1]的范围———σ(x) = 1 / (1 + exp(−x))
tanh函数将一个实值输入压缩至 [-1, 1]的范围———tanh(x) = 2σ(2x) − 1
由于使用sigmoid激活函数会造成神经网络的梯度消失和梯度爆炸问题,所以许多人提出了一些改进的激活函数,如:tanh、ReLU、Leaky ReLU、PReLU、RReLU、ELU、Maxout。
1.Sigmoid
sigmoid的数学公式为
如下图所示,左图为sigmoid的函数图,右图为其导数图.
,如果所有的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。
不是zero-centered产生的一个结果就是:如果数据进入神经元的时候是正的,那么 w 计算出的梯度也会始终都是正的。当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
3.幂运算相对耗时
相对于前两项,这其实并不是一个大问题,我们目前是具备相应计算能力的,但面对深度学习中庞大的计算量,最好是能省则省。之后我们会看到,在ReLU函数中,需要做的仅仅是一个thresholding,相对于幂运算来讲会快很多。
2.Tanh
tanh的数学公式为:
3.ReLU
ReLU的数学表达式为
其导数公式为
其导数公式为
为什么 Leaky ReLU 比 ReLU 更好?
- Leaky ReLU 通过把 x 的非常小的线性分量给予负输入(αx)来调整负值的零梯度(zero gradients)问题;
- leak 有助于扩大 ReLU 函数的范围,通常 a 的值为 0.01 左右;
- Leaky ReLU 的函数范围是(负无穷到正无穷)。
但另一方面, a值的选择增加了问题难度, 需要较强的人工先验或多次重复训练以确定合适的参数值。
LeakyReLU与ReLU和PReLU之间区别
- if α=0 ,则函数是ReLU
- if α>0 ,则函数是Leaky ReLU
- if α是可学习参数,则函数是PReLU(Parametric ReLU)
5.ELU
ELU 的提出也解决了 ReLU 的问题。与 ReLU 相比,ELU 有负值,这会使激活的平均值接近零。均值激活接近于零可以使学习更快,因为它们使梯度更接近自然梯度。
Softmax 与正常的 max 函数不同:max 函数仅输出最大值,但 Softmax 确保较小的值具有较小的概率,并且不会直接丢弃。我们可以认为它是 argmax 函数的概率版本或「soft」版本。
Softmax 函数的分母结合了原始输出值的所有因子,这意味着 Softmax 函数获得的各种概率彼此相关。
Swish 的设计受到了 LSTM 和高速网络中 gating 的 sigmoid 函数使用的启发。我们使用相同的 gating 值来简化 gating 机制,这称为 self-gating。
self-gating 的优点在于它只需要简单的标量输入,而普通的 gating 则需要多个标量输入。这使得诸如 Swish 之类的 self-gated 激活函数能够轻松替换以单个标量为输入的激活函数(例如 ReLU),而无需更改隐藏容量或参数数量。
Swish 激活函数的主要优点如下:
- 「无界性」有助于防止慢速训练期间,梯度逐渐接近 0 并导致饱和;(同时,有界性也是有优势的,因为有界激活函数可以具有很强的正则化,并且较大的负输入问题也能解决);
- 导数恒 > 0;
- 平滑度在优化和泛化中起了重要作用。