激活函数ReLU

激活函数ReLU

      • ReLU
      • PReLU(Parametric)
      • E(Exponential)LU
      • 系列文章:

ReLU

  Relu(Rectified Linear Unit)函数也可谓是一个里程碑式的激活函数。我们之前已经谈到过sigmoid函数和tanh函数的缺点,我们接下来就看relu如何回避这些不利之处,同时又会带来什么新的问题。
  先看relu的函数表达式, r e l u ( x ) = m a x ( x , 0 ) relu(x)=max(x,0) relu(x)=max(x,0),或者写成分段函数的表达式 r e l u ( x ) = { x i f   x ≥ 0 0 i f   x < 0 relu(x)=\left\{\begin{matrix} x & if\ x\geq 0& \\ 0 & if\ x<0 & \end{matrix}\right. relu(x)={x0if x0if x<0。这是一个非常简单的函数,但是对于深度学习性能的提升却是非常大的。
激活函数ReLU_第1张图片
  x>0的时候,函数的导数直接就是1,不存在梯度衰减的问题。虽然ReLU函数缓解了梯度消失的问题,但是同时也带来另外一个问题,就是梯度死亡问题。可以看到在x<0的时候,函数是硬饱和的,这个时候导数直接为0了,一旦输入落进这个区域,那么神经元就不会更新权重了,这个现象称为神经元死亡。稍微值得欣慰的一点就是通过良好的初始化和学习率设置可以使得神经元死亡的概率不那么大。
  ReLU的另一个优点就是计算非常简单,只需要使用阈值判断即可,导数也是几乎不用计算。基于以上两个优点,ReLU的收敛速度要远远快于sigmoid和tanh。
  ReLU的第三大优点就是可以产生稀疏性,可以看到小于0的部分直接设置为0,这就使得神经网络的中间输出是稀疏的,有一定的Droupout的作用,也就能够在一定程度上防止过拟合。
  从函数图像上,我们可以很直观的知道ReLU函数同样是不以0位中心的,尽管这种设置为减慢训练速度,但是瑕不掩瑜。ReLU的使用非常广泛。但是追求完美的心理使得算法设计人孜孜不倦的优化,为了解决ReLU带来的以上缺点,演变出来许多ReLU函数的变体。

PReLU(Parametric)

  以上分析可见ReLU的最大缺点在于x<0部分会导致神经元死亡,如果想让神经元不死亡,就得让这一部分的函数能够产生梯度,也就是这部分的函数需要是变换的。既然大于0的部分 f ( x ) = x f(x)=x f(x)=x的效果很好,能不能让x<0的时候 f ( x ) = x f(x)=x f(x)=x呢?这个问题之前谈到过,显然是不行的,因为激活函数要为神经元提供非线性,这样就是线性函数了,非线性能力就失去了。但是一个线性函数不行,可以把两个线性函数复合。
  PReLU的形式是 f ( x ) = m a x ( a x , x ) f(x)=max(ax,x) f(x)=max(ax,x),分段表达式形式 p r e l u ( x ) = { x i f   x ≥ 0 a x i f   x < 0 prelu(x)=\left\{\begin{matrix} x & if\ x\geq 0& \\ ax & if\ x<0 & \end{matrix}\right. prelu(x)={xaxif x0if x<0只要a不等于1,这样就既保证了非线性,又保证了神经元不会死亡。这里的超参数 a a a是可以学习的,但是一般直接设置一个比较小的数字。
激活函数ReLU_第2张图片
  如果我们固定设置超参数 a a a,PReLU就退化得到Leaky Relu,注意到上述图像中x<0的时候,f(x)和f’(x)分别略微小于0,和略微大于0。

E(Exponential)LU

  看这个名字,我们就知道应该是在线性单元中加入了指数部分,使用 e x e^x ex来替换x<0的部分,但是这样的话函数就不连续了,更不存在可导的情况,为了避免出现这种阶跃的形式,将两个分段函数拼接为连续的。 e x = 1 ∣ x = 0 e^x=1|_{x=0} ex=1x=0,我们可以将函数向下平移,得到 f ( x ) = e x − 1 f(x)=e^x-1 f(x)=ex1,但是可能 e x e^x ex还是在x<0的部分向左下降太快,干脆我们再乘一个因子,来减缓这种下降。 f ( x ) = a ( e x − 1 ) f(x)=a(e^x-1) f(x)=a(ex1),来看完整的分段函数表达式 p r e l u ( x ) = { x i f   x ≥ 0 a ( e x − 1 ) i f   x < 0 prelu(x)=\left\{\begin{matrix} x & if\ x\geq 0& \\ a(e^x-1) & if\ x<0 & \end{matrix}\right. prelu(x)={xa(ex1)if x0if x<0。函数图像见下图,其中a=1。
激活函数ReLU_第3张图片
  ELU因为左侧采用指数下降的策略,容易证明左侧是软饱和的,一定程度上提升了噪声鲁棒性。对ELU函数求导之后很容易得出当x<0的时候 f ′ ( x ) = f ( x ) + a f'(x)=f(x)+a f(x)=f(x)+a。可见导函数的计算也是非常之简单。但是天下没有免费的午餐,指数的计算计算量就会大一些。
  除了普通的ELU函数外,针对ELU函数的改进也有很多,如S(Scaled)ELU函数,通过线性缩放超参数 λ λ λ来是得激活函数具有自归一化的能力,但是没有深入了解。还有一个激活函数叫GELU前面的GE叫是高斯误差的意思(Gaussian Error),和ELU没有什么太大联系。
  对这几种ReLU相关的激活函数做个总结,尽管ReLU会在x<0的时候神经元死亡,但是带来一定的稀疏性,而后两者为了避免神经元的死亡,扩充了函数的x<0部分的函数值,引入了 f ( x ) < 0 f(x)<0 f(x)<0的部分,可以让激活均值更接近于0,事实证明避免神经元的死亡比稀疏性更重要。
  当然相关的研究中还有很多我没整理到由Relu衍生出来的激活函数,大家可以自行查阅相关资料。

系列文章:

神经网络中的激活函数总述
sigmoid激活函数
tanh激活函数
ReLU系列激活函数
maxout激活函数
Swish激活函数
激活函数发展的新里程——EvoNorms

你可能感兴趣的:(深度学习)