如果 ReLU 如此接近线性,为什么它的性能比线性函数好得多?

数据挖掘 机器学习 深度学习
2022-03-06 17:14:16

ReLU 被定义为并且对于负数是常数为零。xxx0

我是深度学习研究和方法的初学者,但我已经看到几个例子声称在网络上使用 ReLU 作为激活函数将优于其他常见函数,当然包括简单的线性函数。

ReLU 有 1 个点的“剧烈”变化,并且是“否则线性”。

我的问题是:

  1. 是否有关于为什么这种变化会显着影响网络性能的研究或意见?

  2. 有什么独特之处,即变化点吗?例如,如果我们将更改点移至会怎样?01

我的直觉是,当分隔线时,它会分隔符号函数,并且可能对某些依赖正/负分类的数据类型有很大影响。0

  1. 正在学习的数据集的相关性如何?我们是否看到 ReLU 在大多数数据集示例上“更好”?

为什么 ReLU 比其他激活函数更好

上面的问题是相关的。我更关注 ReLU 和线性函数之间的区别。

4个回答
  1. 神经网络是一系列层(密集/线性,卷积)。在每一层之后,您需要一个非线性激活函数。为什么需要非线性激活函数?因为组合两个线性变换相当于有一个线性变换:

    (xW1+b1)W2+b2=x(W1W2)+(b1W2+b2)

    因此,堆叠线性变换将毫无意义,因为整个网络将等效于线性变换。

    ReLU 可能看起来类似于线性函数,但它的非线性特性使网络能够对非线性函数进行建模。

  2. 是变化点并没有什么独特之处。大多数神经网络层都有一个偏差项,它使变化点无关紧要,因为在训练期间,偏差将被调整到适当的值。0

  3. 虽然在深度学习中一切都依赖于数据,但 ReLU 的变化点无关紧要这一事实与数据无关(参见前面的答案)。

ReLU 的优势在于对抗其他非线性,例如 sigmoid 和 tanh,它们会遇到梯度消失问题ReLU 本身也有自己的问题,即“垂死的 ReLU 问题”

除了我认为很好的ncasas 答案之外,我想指出 ReLU 的计算成本很低,与 sigmoid 激活函数相比。它们只需要if / then比较,而例如逻辑函数需要求幂、加法和除法。这种实际考虑使 ReLU 具有吸引力,尤其是当计算要在更简单的处理单元(如 GPU)上执行时。

ReLU 用作非线性 激活函数如果网络具有线性激活函数,那么它将无法映射输入特征与其目标之间的任何非线性关系。这将使所有隐藏层变得多余,因为您的模型只是一个更复杂的逻辑回归。

所以我认为你应该问的一个更好的问题是:为什么需要非线性激活函数?

作为一个直观的示例,您可以前往TensorFlow 游乐场并亲自尝试一下。只需更改激活函数;其余的默认设置很好地说明了这一点。

  • 使用 ReLU 进行试用的URL
  • 具有线性激活的相同函数的URL 。

免责声明:这些只是我的观点,以及我如何理解 ReLU 的直觉。

ReLU 有 1 个点的“剧烈”变化,并且是“否则线性”。

没错,这一切都不同!

假设第一层中的神经元输出的负值。然后,使用 ReLU 激活函数,神经元计算线z=wTx+bz=0

的正值然后,第二个神经元计算线zz=z

希望下图能说明 ReLU 如何变得有用。

通过 ReLU 激活和适当的权重调整,第 2 层可能会计算一个新特征(三角形)。如果我们添加第 3 层,则对应的第三个神经元可能可以计算出一个看起来像四边形的特征,依此类推……(这甚至可以想象成和孩子玩积木游戏!)
ReLU 的这个属性它帮助每一层充当下一层的构建块,使其非常强大(无论我们训练的数据集如何)。此外,ReLU 在计算上比任何其他激活函数更高效和简单(它要么是 0,要么是相同的东西,z)。因此,ReLU 成为大多数类型数据的最佳选择(除非数据本身具有一些可以通过其他激活函数(如 sigmoid 或 tanh)更好地建模的属性)。

相比之下,没有不连续点的完全线性激活函数(如 ReLU 中的 0)只能一遍又一遍地计算相同的特征——它只是改变幅度或尺度。


关于你的第二个问题 - 不,我认为奇点(或不连续点)是什么没有任何意义,但必须至少有一个点,任何点 - 只是为了让不同层的神经元计算不同的功能(这里是线条)。但是 0 是一个“好”的值,它很容易将数字线分为负边和正边(很容易想象),也有助于加快计算速度。

但是对于 ReLU,也会出现死亡 ReLU 的问题——当每个连续层中相应神经元然后,我们又回到了我们的模型中只有一个线性函数。在这种情况下,我们使用 ReLU 的一种变体,称为leaky ReLU,它计算一条斜率较小的线,即使为 0。 (leaky ReLU 函数由. 通常,我们不希望我们的激活值在负值上变大,所以我们将乘以一个非常小的因子,而 0.01 是一个可以做到这一点的常数。同样,我不认为对值 0.01 - 它必须是任何小的因子,默认值为 0.01。)zz
g(z)=max(0.01z,z)z