什么是ReLU(修正线性单元)激活函数?2025 年 2 月 3 日 | 阅读 9 分钟 Sigmoid 和 Tanh 激活函数的局限性神经网络由一组节点组成,这些节点在层中将输入转换为输出。对于每个节点,输入被加权并求和,以创建求和激活,然后将其通过转换函数以确定节点的输出。 不进行任何转换的激活函数称为线性函数,也是最简单的函数。只有线性激活函数网络易于训练;然而,它们无法模拟复杂关系,通常用于回归的输出层。节点的非线性函数有助于网络理解复杂的数据结构。一些最常用的非线性函数包括 Sigmoid 和双曲正切(Tanh)。 在激活函数之前,通过 sigmoid 函数(也称为逻辑函数)转换特定输入,以生成介于 0.0 和 1 之间的值。这意味着差异比的范围为 0(最低值)到 1(变量的最高值)。0 并逐渐减小到几乎 0.0,从而形成 S 形曲线。在 20 世纪 90 年代早期之前,这种激活函数是神经网络中唯一使用的函数。 tanh 函数,就像双曲正切函数一样,输出范围在 -1 到 1.0 之间。在 21 世纪的训练中,tanh 取代了 sigmoid,因为它更容易训练并且准确性略好。 然而,这两种函数都有以下缺点。它们会饱和,这意味着大值会非常快地趋近于 1。较小的数通过 ~ 补偿该数并防止在 - 和 + 之间选择,而中间值则趋近于 0(或 -1.0)。这种饱和使这些函数仅对函数接近中间属性值敏感,即 sigmoid 为 0.5,tanh 为 0.0,这降低了从节点计算激活和的效率。最终,学习算法被禁用,因为粗糙的网络无法改变权重并提高模型的性能。 此外,在后期,随着硬件规格的提升,特别是 GPU,使用 sigmoid 和 tanh 函数训练非常深的神经网络带来了问题。利用这些函数的大型网络中的元素无法接收到有价值的梯度数据,因为用于权重更新的误差信号通过网络时会随着每一层急剧减少。这是因为在较高层中,梯度往往变得非常小,导致一个称为“梯度消失问题”的问题,它阻碍了深度网络学习。 至于 sigmoid 和 tanh 激活函数的历史意义,它们具有饱和的缺点,以及深度神经网络中梯度消失问题导致收敛速度慢的主要缺点。为了解决这些问题,当今的深度学习使用不同类型的激活函数。 什么是修正线性激活函数?一种非线性激活函数已被证明有助于提高神经网络速度,称为修正线性激活函数,缩写为 ReLU。 为了使用反向传播的 SMSG 训练深度神经网络,一个行为线性但非线性的函数至关重要。该函数必须对激活和输入更敏感,并且必须避免轻易饱和。这个需求的解决方案,尽管在文献中已描述了一段时间,但在 2009 年和 2011 年的论文中才变得引人注目。在这种情况下,解决方案是修正线性激活函数,也称为 ReLU。 这种函数有许多版本,但实现它的节点将被称为修正线性激活单元(ReLU)。使用修正器函数作为隐藏层的网络称为修正网络。ReLU 的使用被广泛认为是深度学习革命的主要事件之一,催生了创建非常深的神经网络的惯例。 修正线性激活函数执行一个简单的计算:如果输入值大于 0.0,则它直接返回输入值而不进行修改,否则返回 0。换句话说,如果输入大于 0,则返回 1,如果输入小于或等于 0.0,则返回 0。因此,它也成为当代深度学习架构的基石之一。 我们可以使用简单的 if-else 块来描述它 代码 在数学上,我们可以使用 max() 函数和 0.0 以及输入 z 来表示这个函数 g(z):g(z) = max{0, z} 该函数的行为对于正输入是线性的,并提供了训练使用反向传播算法的神经网络所需的线性激活属性。然而,这个过程并没有使其成为线性函数,因为任何负值在输出时总是等于零。 如何编写修正线性激活函数的代码?在 Python 中实现修正线性激活函数很简单。 最简单的方法是使用 max() 函数,如下所示 代码 任何正值都将按原样返回,而 0 值预计也将返回。如果输入小于 0 或零,则返回 0.0。 以下是修正线性激活函数的几个示例:要输出:更具体地说,以下可以是修正线性激活函数的输入和相应的输出 代码 运行示例时,我们观察到正值会原样返回,无论其大小如何,而负值则设置为 0.0。 输出 rectified(1.0) is 1.0 rectified(1000.0) is 1000.0 rectified(0.0) is 0.0 rectified(-1.0) is 0.0 rectified(-1000.0) is 0.0 为了可视化输入和输出之间的关系,我们可以绘制一系列输入及其相应的输出。 以下示例生成从 -10 到 10 的一系列整数,计算每个输入的修正线性激活,然后绘制结果。 代码 运行此示例会生成一条线图,表明所有负值和零输入都设置为 0.0。相比之下,正输入按原样返回,导致正值呈线性增长的斜率。 输出 修正线性函数的导数同样容易计算。在误差反向传播过程中,需要激活函数的导数来调整节点的权重。 对于修正线性函数,导数(表示斜率)为:对于修正线性函数,导数(表示斜率)为 负值为 0.0 正值为 1.0 最初,神经网络避免使用充其量只是部分可微分的激活函数,这可能推迟了修正线性函数和其他分段线性函数的使用。然而,可以理解的是,从技术上讲,当输入值为 0 时,导数无法确定。因此,如果 AL Alonso 等于 0,那么实际上它等价于 0,这不会产生任何实际问题。 修正线性激活函数的优点修正线性激活函数(ReLU)由于其几个关键优势,已迅速成为大多数神经网络开发的默认选择 以下是修正线性激活函数的一些优点。修正线性激活函数(ReLU)由于其众多优点已迅速成为大多数神经网络的默认选择 计算简单性
表示稀疏性
线性行为
训练深度网络
ReLU 如何实现交互和非线性相互作用参照神经网络模型中的随机节点。为简单起见,假设它有两个输入,输入 A 和输入 B。输入 A 和 B 的权重分别为 2 和 3。因此,节点的输出等于函数 f(2A + 3B)。我们将使用 ReLU 函数作为 f。因此,如果节点的输入 (2A+3B) 为正,则输出值也将为 2A+3B。如果 2A+3B 为负,则指示的输出值将为“0”。 示例 在此示例中,我们设 ?=1 且 B=1。输出为 2A+3B,因此表明随着 A 的增加,输出也增加。但如果 B 为 -100,则输出为 0,A 的适度增加将意味着输出仍为 0。因此,“这”可能会使 A 增加变换器的输出,也可能不会,具体取决于值。因此,这个简单的例子展示了节点如何捕获交互。随着节点和层数的增加,互连的可能性和潜力也随之增加。这表明激活函数如何帮助识别正确的交互。 非线性在这种情况下,非线性函数是指切线斜率在每一点上都不相等的函数。ReLU 函数是正激活的,并且在原点附近是非线性的,负输入的导数为零,正输入的导数为一。这是一种相当简单的非线性形式,因为它只帮助您建议某些变化模式。 然而,深度学习模型的两个关键方面使得通过组合 ReLU 节点能够创建各种非线性 1. 偏置项通常,所有模型中每个节点总会有一个偏置,它对应于在训练过程中学习到的一个常数。为简单起见,我们来关注一个具有单个输入 A 和一个偏置的节点。如果偏置为 7,则节点的输出为 f(7+A)。如果 A 小于 -7,则输出为零,并且也观察到基本斜率为零。如果 A 大于 -7,则输出为 7+A,并且它与斜率 1 的关系是直接的。偏置项还允许我们定位调节斜率变化的断点。它最初可能看起来只给出两个独特的斜率。 2. 多个节点真实模型包含许多节点,每个节点又可以具有不同的偏置,这使得每个节点都能够随着输入改变其斜率。 当我们共同添加这些结果函数时,我们得到一个累积函数,它在不同点具有不同的斜率。 这些模型可以生成非线性函数形式;因此,它们可以预测交互并改进估计。每层中更多的节点(或卷积模型中更多的卷积层)为模型带来了更大的能力来表示上述交互和非线性。 结论修正线性激活函数(ReLU)由于其简单的计算、识别表示能力和线性函数,有助于解决梯度消失问题,因此成为当前神经网络世界中应用最广泛的激活函数。与 sigmoid 和 tanh 相比,ReLU 能够更好地处理深度网络决策边界中的非线性,因为它饱和度较低且更容易训练。它可以借助偏置项和多个节点捕获交互和非线性,从而能够开发出更复杂的模型,更好地描述深度学习模式并因此实现更高的性能。 下一主题2021 年十大机器学习课程 |
我们请求您订阅我们的新闻通讯以获取最新更新。