激活函数是考虑非线性因素,因为线性模型的表达能力不够。引入非线性激活函数,可使深层神经网络的表达能力更加强大
优秀的激活函数应满足:
- 非线性:多层神经网络可逼近所有函数
- 可微性:通过梯度下降来更新参数
- 单调性:激活函数单调,保证单层网络的损失函数是凹函数
- 近似恒等性:f(x)约等于x,当参数初始化为随机值时,神经网络更稳定
目录
sigmoid
sigmoid函数将输入值变换到0-1之间的值输出,若输入值是非常大的负数,则输出为0;若输入值是非常大的正数,则输出值为1,相当于对输入进行归一化。
现在sigmoid函数用的很少,主要的原因是,深层神经网络更新参数时,需要从输出层到输入层,逐层进行链式求导,而sigmoid函数的导数输出是0-0.25之间的小数,链式求导需要多层导数连续相乘,会出现多个0-0.25之间的小数连续相乘,并且随着层数的加深,梯度的衰减会非常的大,结果将趋于0,产生梯度消失,使得参数无法继续更新。
我们希望输入每层神经网络的特征是以0为均值的小数值,但是过sigmoid激活函数后的数据都是正数,会使收敛变慢。而且sigmoid函数存在幂运算,计算复杂度大,计算时间长
优点:
- 输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可用作输出层;
- 求导容易
缺点:
- 易造成梯度消失;
- 输出非0均值,收敛慢;
- 幂运算复杂,训练时间长。
应用:
sigmoid函数可应用在训练过程中。然而,当处理分类问题作为输出时,sigmoid却无能为力。简单地说,sigmoid函数只能处理两个类,不适用于多分类问题。而softmax可以有效解决这个问题,并且softmax函数大都运用在神经网路中的最后一层网络中,使得值得区间在(0,1)之间,而不是二分类的。
tanh
从函数图像看,tanh函数的输出为0均值了,但是依旧存在梯度消失和幂运算问题
优点:
- 比sigmoid函数收敛速度更快。
- 相比sigmoid函数,其输出以0为中心
缺点:
- 易造成梯度消失;
- 幂运算复杂,训练时间长。
ReLU
relu函数非常符合好的激活函数应该具有近似恒等性这一要求,
优点:
- 解决了梯度消失问题(在正区间);
- 只需判断输入是否大于0,计算速度快;
- 收敛速度远快于sigmoid和tanh,因为sigmoid和tanh涉及很多expensive的操作;
- 提供了神经网络的稀疏表达能力。
缺点:
- 输出非0均值,收敛慢;
- Dead ReLU问题:某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。即送入激活函数的特征是负数时,激活函数输出是0,反向传播得到的梯度是0,导致参数无法更新,造成神经元死亡
其实,导致神经元死亡的根本原因是送入神经元的负数特征过多导致的,我们可以改进随机初始化,避免过多的负数特征送入relu函数,可以通过设置更小的学习率,减少参数分布的巨大变化,避免训练中产生过多负数特征进入relu函数
Leaky ReLU
Leaky ReLU是为解决relu负区间为0,引起神经元死亡问题而设计的,Leaky ReLU的负区间引入了一个固定的斜率a,使得Leaky ReLU的负区间不再恒等于0
理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。实际使用中,大部分仍然选用relu
Softmax
Softmax函数,或称归一化指数函数,是逻辑函数的一种推广。它能将一个含任意实数的K维向量
“压缩”到另一个K维实向量中,使得每一个元素的范围都在之间,并且所有元素的和为1。一般在神经网络中, softmax可以作为分类任务的输出层。其实可以认为softmax输出的是几个类别选择的概率,比如我有一个分类任务,要分为三个类,softmax函数可以根据它们相对的大小,输出三个类别选取的概率,并且概率和为1。
其中, j = 1, …, K