当前位置: 首页> 体育健身> 体育> 正文

如何理解relu函数(relu函数的特点)

  • ご殇子★狼魂彡ご殇子★狼魂彡
  • 体育
  • 2023-05-03 17:31:01
  • -
Relu函数与Leaky Relu函数的理解

激活函数的选择

“激活函数”,又称“非线性映射函数”,是深度卷积神经网络中不可或缺的关键模块。可以说,深度网络模型其强大的表示能力大部分便是由激活函数的非线性带来的。

Sigmoid型函数也称Logistic函数:

其函数形状如下图(a)所示。很明显可以看出,经过Sigmoid型函数作用后,输出响应的值域被压缩到[0, 1] 之间,而0对应了生物神经元的“抑制状态”,1则恰好对应了“兴奋状态”。但对于Sigmoid函数两端大于5(或小于−5)的区域,这部分输出会被压缩到1(或0)。这样的处理会带来梯度的“饱和效应”(saturation effect)。不妨对照Sigmoid型函数的梯度图(图(b)),大于5(或小于−5)部分亩桥的梯度接近0,这会导致在误差反向传播过程中导数处于该区域的误差很难甚至无法传递至前层,进而导致整个网络无法正常训练。

从上图(a)中可观察到Sigmoid型激活函数值域的均值并非为0,而是全为正,这样的结果实际上并不符合我们对神经网络内数值的期望(均值)应为0的设想。

tanh(x) 型函数是在Sigmoid型函数基础上为解决均值问题提出的激活函数:

tang(x) = 2S(2x)-1。tanh(x) 型函数又称作双曲正切函数(hyperbolic tangent function),其函数范围是(−1,+1),输出响应的均值为0。但由于tanh(x) 型函数仍基于Sigmoid型悔手函数,使用tanh(x) 型函数依然会发生“梯度饱和碧耐嫌”现象。

为了避免梯度饱和现象的发生,将修正线性单元(Rectified Linear Unit,简称ReLU)引入神经网。ReLU函数是目前深度卷积神经网络中最为常用的激活函数之一。ReLU函数实际上是一个分段函数,其定义为:

                                                                     ReLU(x) = MAX{0, x}.

与前两个激活函数相比:ReLU函数的梯度在x ≥ 0 时为1,反之为0(如上图所示);对x ≥ 0 部分完全消除了Sigmoid型函数的梯度饱和效应。计算复杂度上,ReLU函数也相对前两者的指数函数计算更为简单。同时,实验中还发现ReLU函数有助于随机梯度下降方法收敛,收敛速度约快6倍左右。不过,ReLU函数也有自身缺陷,即在x 0 时,梯度便为0。换句话说,对于小于0的这部分卷积结果响应,它们一旦变为负值将再无法影响网络训练——这种现象被称作“死区”。

为了缓解“死区”现象,研究者将ReLU函数中x 0 的部分调整为f(x) = α·x,其中α 为0.01或0.001数量级的较小正数。这种新型的激活函数被称作“Leaky ReLU”:

可以发现,原始ReLU函数实际上是Leaky ReLU函数的一个特例,即α = 0。不过由Leaky ReLU中α 为超参数,合适的值较难设定且较为敏感,因此Leaky ReLU函数在实际使用中的性能并不十分稳定。

参数化ReLU的提出很好的解决了Leaky ReLU中超参数α 不易设定的问题:参数化ReLU直接将α 也作为一个网络中可学习的变量融入模型的整体训练过程。在求解参数化ReLU时,文献中仍使用传统的误差反向传播和随机梯度下降,对于参数α 的更新遵循链式法则,具体推导细节在此不过多赘述,感兴趣的读者可参考文献Surpassing human-level performance on ImageNet classification。实验结果验证方面,曾在一个14层卷积网络上对比了ReLU和参数化ReLU在ImageNet 2012数据集上的分类误差(top-1和top-5)。

网络结构如表1,每层卷积操作后均有参数化ReLU操作。表中第二列和第三列数值分别表示各层不同通道(channel)共享参数α 和独享参数α1时网络自动学习的α 取值。

实验结果如表2中所示。可以发现,在分类精度上,使用参数化ReLU作为激活函数的网络要优于使用原始ReLU的网络,同时自由度较大的各通道独享参数的参数化ReLU性能更优。另外,需指出表1中几个有趣的观察:

        1)与第一层卷积层搭配的参数化ReLU的α 取值(表1中第一行0.681和0.596)远大于ReLU中的0。这表明网络较浅层所需非线性较弱。同时,我们知道浅层网络特征一般多为表示“边缘”、“纹理”等特性的泛化特征。这一观察说明对于此类特征正负响应(activation)均很重要;这也解释了固定α 取值的ReLU(α = 0)和Leaky ReLU相比参数化ReLU性能较差的原因。

        2)请注意独享参数设定下学到的α 取值(表1中的最后一列)呈现由浅层到深层依次递减的趋势,说明实际上网络所需的非线性能力随网络深度增加而递增。

不过万事皆具两面性,参数化ReLU在带来更大自由度的同时,也增加了网络模型过拟合的风险,在实际使用中需格外注意。

另一种解决α 超参设定的方式是将其随机化,这便是随机化ReLU。对于随机化ReLu中α 的设定,其取值在训练阶段服从均匀分布,在测试阶段则将其指定为该均匀分布对应的分布期望(l+u)/2:

显然,ELU具备ReLU函数的优点,同时ELU也解决了ReLU函数自身的“死区”问题。不过,ELU函数中的指数操作稍稍增大了计算量。实际使用中,ELU中的超参数λ 一般设置为1。

激活函数 sigmoid、tanh、relu

激活函数(activation functions)的目标是,将神经网络非线性化。激活函数是连续的(continuous),且可导的(differential)。

常见的激活函数:sigmoid,tanh,relu。

sigmoid是平滑(smoothened)的阶梯函数(step function),可导(differentiable)。sigmoid可以将任何值转换为0~1概率,用于二分类。细节可以 参考 。

公式:

导数:

导数2:

图(红色原函数,蓝色导函数):

当使用sigmoid作为激活函数时,随着神经网络隐含层(hidden layer)层数的增加,训练误差反而加大。表现为:

这种现象就是梯度弥散(vanishing gradient)。而另一种情况,梯度爆炸(exploding gradient),则是前面层的梯度,通过训练变大,导致后面层的梯度,以指数级增大。

由于sigmoid的导数值小于1/4,x变化的速率要快于y变化的速率,随着层数的增加,连续不断执行sigmoid函数,就会导致,前面更新较大的幅度,后面更新较小的幅度,因此,网络在学习过程中,更倾向于,更新后面(靠近输出层)的参数,而不是前面的参数(靠近输入层)。

sigmoid缺点:

参考1 、 参考2

tanh,即双曲正切(hyperbolic tangent),类似于幅度增大sigmoid,将输入值转换为-1至1之间。tanh的导数取值范围在0至1之间,优于sigmoid的0至1/4,在一定程度上,减轻了梯度消失的问题。tanh的输出和输入能够保枯庆持非线性单调上升和下降关系,符合BP(back propagation)网络的梯度求解,容错性好,有界。

公式:

导数:

图(红色原函数,蓝色导函数):

sigmoid和tanh:

参考1 、 参考2 、 参考3

relu,即Rectified Linear Unit,整流线性单元,激活部分神经元,增加稀疏性,当x小于0时,输出值为0,当x大于0时,输出值为x.

公式:

图:

导数:

图:

relu对比于sigmoid:

relu的缺点:

在训练的时候,ReLU单元比较脆弱并且可能“死掉”。举例来说,当一个很大的梯度没晌握,流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。

如果学谨数习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。

在神经网络中,隐含层的激活函数,最好选择ReLU。

关于RNN中为什么选择tanh,而不是relu, 参考 。

[img]Parametric ReLU激活函数 注意力机制 自适应参数化ReLU激活函数

浅析激活函数之Relu函数

时隔一周 小李又来冒泡啦~下周就要结束在实验室搬砖的日子了诶 但也不能偷懒鸭!

提前的周末愉快鸭~

讲Relu函数前需要先了解关于升让激活正颂函数的概念和作用。

有了大概的概念后举笑郑就可进入正题~

Ending~

参考资料( )

( )

( )

( )

划水愉快!嘻嘻:)

神经网络中ReLU是线性还是非线性函数?如果是线性的话为什么还说它做激活函数比较好?

1、严格来说的话 ReLU算是分段线性函数。中间隐层激活函数采亮孝用线性函数(盯岁例如恒等变换凯键睁)不好是因为,最后算下来多层网络跟单层网络一个效果。其实 激活函数的存在是为了神经网络更好的拟合目标函数而已。

2、ReLU比sigmoid和tanh好是因为它的收敛速度快(sigmoid、tanh函数在自变量比较大的时候 导数很小,采用梯度下降法 变化缓慢,特别是多层网络 就更慢了),计算量比较小(只需要一个阈值进行比较 而不需要做函数运算)。

原来ReLU这么好用!一文带你深度了解ReLU激活函数!

在神经网络中,激活函数负责将来自节点的加权输入转换为该输入的节点或输出的激活。ReLU 是一个分段线性函数,如果输入为正,它将直接输出,否则,它将输出为零。它已经成为许多类型神经网络的默认激活函数,因为使用它的模型更容易训练,并且通常能够获得更好的性能。在本文中,我们来详细介绍一下ReLU,主要分成以下几个部分:

1、Sigmoid 和 Tanh 激活函数的局限性

2、ReLU(Rectified Linear Activation Function)

3、如何实现ReLU

4、ReLU的优点

5、使用ReLU的技巧

一个神经网络由层节点组成,并学习将输入的样本映射到输出。对于给定的节点,将输入乘以节点中的权重,并将其相加。此值称为节点的summed activation。然后,经过求和的激活通过一个激活函数转换并定义特定的输出或节点的“activation”。

最简单的激活函数被称为线性激活,其中根本没有应用任何转换。 一个仅由线性激活函数组成的网络很容易训练,但不能学习复杂的映射函数。线性激活函数仍然用于预测一个数量的网络的输出层(例如回归问题)。

非线性激活函数是更好的,因为它们允许节点在数据中学习更复杂的结构 。两个广泛使用的非线性激活函数是 sigmoid 函数和 双曲正切 激活函数。

Sigmoid 激活函数 ,也被称为 Logistic函数神经网络,传统上是一个非常受欢迎的神经网络激活函数。函数的输入被转换成介于0.0和1.0之间的值。大于1.0的输入被转换为值1.0,同样,小于0.0的值被折断为0.0。所有可能的输入函数的形状都是从0到0.5到1.0的 s 形。在很长一段时间里,直到20世纪90年代早期,这是神经网络的默认激活方式。

双曲正切函数 ,简称 tanh,是一个形状类似的非线性激活函数,输出值介于-1.0和1.0之间。在20世纪90年代后期和21世纪初期,由于使用 tanh 函数的模型更容易训练,而且往往具有更好的预测性能,因此 tanh 函数比 Sigmoid激活函数更受青睐。

Sigmoid和 tanh 函数的一个普遍问题是它们值域饱和了 。这意味着,大值突然变为1.0,小值突然变为 -1或0。此外,函数只对其输入中间点周围的变化非常敏感。

无论作为输入的节点所提供的求和激活是否包含有用信息,函数的灵敏度和饱和度都是有限的。一旦达到饱和状态,学习算搭局法就需要不断调整权值以提高模型的性能。

最后,随着硬件能力的提高,通过 gpu 的非常深的神经网络使用Sigmoid 和 tanh 激活函数不容易训练。在大型网络深层使用这些非线性激活函数不能接收有用的梯度信息握隐。错误通过网络传播回来,并用于更新权重。每增加一层,错误数量就会大大减少。这就是所谓的 消失梯度 问题,它能有效地阻止深层(多层)网络的学习。

虽然非线性激活函数的使用允许神经网络学习复杂的映射函数,但它们有效地阻止了学习算法与深度网络的工作。在2000年代后期和2010年代初期,通过使用诸如波尔兹曼机器和分层训练或无监督的预训练等替代网络类型,这才找到了解决办法。

为了训练深层神经网络, 需要一个激活函数神经网络,它看起来和行为都像一个线性函数,但实际上是一个非线性函数,允许学习数据中的复杂关系 。该函数还必须提供更灵敏的激活和输入,避免饱和。

因此,ReLU出现了, 采用 ReLU 可以是深度学习革命中为数不多的里程碑之一 。ReLU激活函数是一个简单的计算,如果输入大于0,直接返回作为输入提供的值;如果输入是0或更小,返回值0。

我们可以用一个简单的 if-statement 来描述这个问题,如下所示:

对于大于零的值,这个函数是线性的,这意味着当使用反向传播训练神经网络时,它具有很多线性激活函数的理知皮让想特性。然而,它是一个非线性函数,因为负值总是作为零输出。由于矫正函数在输入域的一半是线性的,另一半是非线性的,所以它被称为 分段线性函数(piecewise linear function ) 。

我们可以很容易地在 Python 中实现ReLU激活函数。

我们希望任何正值都能不变地返回,而0.0或负值的输入值将作为0.0返回。

下面是一些修正的线性激活函数的输入和输出的例子:

输出如下:

我们可以通过绘制一系列的输入和计算出的输出,得到函数的输入和输出之间的关系。下面的示例生成一系列从 -10到10的整数,并计算每个输入的校正线性激活,然后绘制结果。

运行这个例子会创建一个图,显示所有负值和零输入都突变为0.0,而正输出则返回原样:

ReLU函数的导数是斜率。负值的斜率为0.0,正值的斜率为1.0。

传统上,神经网络领域已经不能是任何不完全可微的激活函数,而ReLU是一个分段函数。从技术上讲,当输入为0.0时,我们不能计算ReLU的导数,但是,我们可以假设它为0。

tanh 和 sigmoid 激活函数需要使用指数计算, 而ReLU只需要max(),因此他 计算上更简单,计算成本也更低 。

ReLU的一个重要好处是,它能够输出一个真正的零值 。这与 tanh 和 sigmoid 激活函数不同,后者学习近似于零输出,例如一个非常接近于零的值,但不是真正的零值。这意味着负输入可以输出真零值,允许神经网络中的隐层激活包含一个或多个真零值。这就是所谓的稀疏表示,是一个理想的性质,在表示学习,因为它可以加速学习和简化模型。

ReLU看起来更像一个线性函数,一般来说,当神经网络的行为是线性或接近线性时,它更容易优化 。

这个特性的关键在于,使用这个激活函数进行训练的网络几乎完全避免了梯度消失的问题,因为梯度仍然与节点激活成正比。

ReLU的出现使得利用硬件的提升和使用反向传播成功训练具有非线性激活函数的深层多层网络成为可能 。

很长一段时间,默认的激活方式是Sigmoid激活函数。后来,Tanh成了激活函数。 对于现代的深度学习神经网络,默认的激活函数是ReLU激活函数 。

ReLU 可以用于大多数类型的神经网络, 它通常作为多层感知机神经网络和卷积神经网络的激活函数 ,并且也得到了许多论文的证实。传统上,LSTMs 使用 tanh 激活函数来激活cell状态,使用 Sigmoid激活函数作为node输出。 而ReLU通常不适合RNN类型网络的使用。

偏置是节点上具有固定值的输入,这种偏置会影响激活函数的偏移,传统的做法是将偏置输入值设置为1.0。当在网络中使用 ReLU 时, 可以将偏差设置为一个小值,例如0.1 。

在训练神经网络之前,网络的权值必须初始化为小的随机值。当在网络中使用 ReLU 并将权重初始化为以零为中心的小型随机值时,默认情况下,网络中一半的单元将输出零值。有许多启发式方法来初始化神经网络的权值,但是没有最佳权值初始化方案。 何恺明的文章指出Xavier 初始化和其他方案不适合于 ReLU ,对 Xavier 初始化进行一个小的修改,使其适合于 ReLU,提出He Weight Initialization,这个方法更适用于ReLU 。

在使用神经网络之前对输入数据进行缩放是一个很好的做法。这可能涉及标准化变量,使其具有零均值和单位方差,或者将每个值归一化为0到1。如果不对许多问题进行数据缩放,神经网络的权重可能会增大,从而使网络不稳定并增加泛化误差。 无论是否在网络中使用 ReLU,这种缩放输入的良好实践都适用。

ReLU 的输出在正域上是无界的。这意味着在某些情况下,输出可以继续增长。因此,使用某种形式的权重正则化可能是一个比较好的方法,比如 l1或 l2向量范数。 这对于提高模型的稀疏表示(例如使用 l 1正则化)和降低泛化误差都是一个很好的方法 。

.

Relu激励函数

因为Sigmod函数的梯汪散度有困顷氏可能会下降很慢。甚至梯度消失。在分类的时候很多都使用这个Relu激励函数,尤其是深度学习中。

线性整流函数(Rectified Linear Unit, ReLU),Relu激励函数,也称“热鲁”激励函数。是一种人工神经网络中常见的激活函数。相比于Sigmoid函数,

Relu函数的优点:

梯度不饱和。梯度计算公式为:1{x0}。因乎档此在反向传播过程中,减轻了梯度弥散的问题,神经网络前几层的参数也可以很快的更新。

计算速度快。正向传播过程中,sigmoid和tanh函数计算激活值时需要计算指数,而Relu函数仅需要设置阈值。如果x0,f(x)=0,如果x0,f(x)=x。加快了正向传播的计算速度。

f(x)=max(o,x)

在神经元中输出为:

是不是很简单。

常见激活函数的理解与选择