ReLU激活函数(优势、稀疏性、神经元坏死)

ReLU

ReLU(rectifiedlinear unit)是一种激活函数。数学上,它定义为y = max(0,x)
ReLU激活函数(优势、稀疏性、神经元坏死)_第1张图片

优势

ReLU是神经网络中最常用的激活函数,尤其是在CNN中。如果您不确定要在网络中使用哪种激活功能,通常最好选择ReLU。

对于所有正值,ReLU是线性的(identity),对于所有负值,ReLU是零的。这意味着:

  • 由于没有复杂的数学运算,因此计算开销小。因此,该模型可以花费更少的时间进行训练或预测。
  • 它收敛更快。线性意味着当x变大时,斜率不会平稳或“饱和” 。它没有其他激活函数具有的梯度消失问题(如Sigmoid或tanh)。
  • 它可以被稀疏地激活。由于所有负输入的ReLU均为零,因此任何给定的单元都可能根本无法激活。

稀疏性

注意:我们在这里讨论模型稀疏性。数据稀疏性(缺少信息)是不同的,通常是不好的。

为什么模型稀疏性好?如果我们考虑一下人工神经网络试图模仿的生物神经网络,这在直觉上是有意义的。尽管我们体内有数十亿个神经元,但并非所有时间都为我们所做的所有事情激发。相反,它们具有不同的作用,并由不同的信号激活。

稀疏性导致简洁的模型,这些模型通常具有更好的预测能力和更少的过拟合。在稀疏网络中,神经元更有可能实际上正在处理问题的有意义的方面。例如,在检测图像中猫的模型中,可能存在可以识别耳朵的神经元,如果图像是关于建筑物的,则显然不应激活该神经元。

最后,稀疏网络比密集网络更快,因为要计算的东西更少。

Dying ReLU

对于所有负值均为零的不利之处是一个问题,称为“Dying ReLU”(神经元坏死)。

如果ReLU神经元卡在负侧并且始终输出0,则它是“死”的,**因为ReLU在负范围内的斜率也为0,因此一旦神经元变为负数,它就不太可能恢复。**这样的神经元在区分输入中没有任何作用,并且基本上是无用的。随着时间的流逝,您可能最终会在网络的大部分工作中无所作为。

您可能会对零斜率部分的工作方式感到困惑。注意,单个步骤(例如,在SGD中)涉及多个数据点。只要不是所有数据都为负,我们仍然可以从ReLU中获得一个斜率。当学习率太高或负偏大时,可能会出现坏死的问题。

较低的学习率通常可以缓解该问题。除此之外,leaky ReLU和ELU也是尝试的不错选择。它们在负范围内略有倾斜,因此可以防止出现此问题。

变体

leaky ReLU和Parametric ReLU(PReLU)

leaky ReLU的负值斜率较小,而不是零。例如,当x <0时,leaky ReLU可能具有y = 0.01x。

Parametric ReLU(PReLU)是一种leaky ReLUReLU,它没有像0.01这样的预定斜率,而是使它成为神经网络计算自身的参数:y = ax当x <0时。

ReLU激活函数(优势、稀疏性、神经元坏死)_第2张图片

Leaky ReLU有两个好处:

  • 它没有零斜率部分,因此可以解决“Dying ReLU”问题。

  • 它加快了训练速度。有证据表明,“平均激活”接近0可使训练更快。(它有助于使Fisher信息矩阵的非对角项保持较小,但您可以放心地忽略它。)与ReLU不同,Leaky
    ReLU更“平衡”,因此学习起来可能更快。

注意,结果并不总是一致的。Leaky ReLU并不总是优于普通的ReLU,而应仅作为替代方法。

指数线性(ELU,SELU)

类似于Leaky ReLU,ELU的负值斜率较小。它使用如下所示的对数曲线代替直线:
ReLU激活函数(优势、稀疏性、神经元坏死)_第3张图片

它的设计目的是结合ReLU的线性部分和Leaky
ReLU。虽然它没有Dying ReLU问题,但是在大的负数部分梯度为0,导致神经元不活跃。

ELU是在 论文首次提出的。由于常数因子a的存在,它有时被称为比例ELU (SELU)。

代码

TensorFlow

TensorFlow 在tf.nn.module模块中提供了ReLU及其变体。以下代码块创建了带有ReLu的卷积层

import tensorflow as
tfconv_layer = tf.layers.conv2d(
    inputs=input_layer,
    filters=32,
    kernel_size=[5, 5],
    padding='same',
    activation=tf.nn.relu,
)

keras

keras 通过keras.layers提供ReLU及其变体。激活模块。下面为模型添加ReLU层

from keras.layers import
Activation, Densemodel.add(Dense(64, activation='relu'))

PyTorch

PyTorch通过torch.nn提供ReLU及其变体。

from torch.nn import
RNNmodel = nn.Sequential(
    nn.Conv2d(1, 20, 5),
    nn.ReLU(),
    nn.Conv2d(20, 64, 5),
    nn.ReLU()
)

# 也可以直接使用nn.ReLu()
import torch
from torch import autograd, nnrelu = nn.ReLU()
var = autograd.Variable(torch.randn(2))
relu(var)

某些PyTorch层类将relu作为其非线性参数的值。例如,下面用ReLU创建一个RNN层:

rnn = nn.RNN(10, 20, 2,
nonlinearity='relu')

博客:https://medium.com/@danqing/a-practical-guide-to-relu-b83ca804f1f7

你可能感兴趣的:(深度学习基础,神经网络)