直线激活函数如何解决神经网络中的梯度消失问题?

机器算法验证 机器学习 神经网络 深度学习 梯度下降
2022-01-16 09:24:17

我发现整流线性单元 (ReLU) 在几个地方被称赞为解决神经网络梯度消失问题的解决方案。也就是说,使用 max(0,x) 作为激活函数。当激活为正时,很明显这比 sigmoid 激活函数要好,因为它的导数始终为 1,而不是大 x 的任意小值。另一方面,当 x 小于 0 时,推导正好为 0。在最坏的情况下,当一个单元从未被激活时,该单元的权重也将永远不会改变,并且该单元将永远无用 - 这似乎甚至比几乎消失的小梯度还要糟糕得多。学习算法在使用 ReLU 时如何处理这个问题?

4个回答

这是一篇解释这个问题的论文。我引用其中的一部分来说明问题。

整流器激活函数允许网络轻松获得稀疏表示。例如,在对权重进行统一初始化后,大约 50% 的隐藏单元连续输出值是实零,并且这个比例很容易随着稀疏诱导正则化而增加。

所以整流器激活函数在网络上引入了稀疏效应。以下是同一篇论文中稀疏性的一些优点;

  • 信息解开深度学习算法(Bengio,2009)声称的目标之一是解开解释数据变化的因素。密集表示是高度纠缠的,因为输入中的几乎任何变化都会修改表示向量中的大多数条目。相反,如果一个表示既稀疏又对小的输入变化具有鲁棒性,则非零特征集几乎总是通过输入的小变化而大致保持不变。

  • 高效的可变大小表示不同的输入可能包含不同数量的信息,并且使用可变大小的数据结构更方便地表示,这在信息的计算机表示中很常见。改变活动神经元的数量允许模型控制给定输入的表示的有效维度和所需的精度。

  • 线性可分性稀疏表示也更可能是线性可分的,或者更容易用较少的非线性机器进行分离,这仅仅是因为信息是在高维空间中表示的。此外,这可以反映原始数据格式。例如,在与文本相关的应用程序中,原始原始数据已经非常稀疏。

  • 分布但稀疏密集分布式表示是最丰富的表示,可能比纯粹的本地表示更有效(Bengio,2009)。稀疏表示的效率仍然呈指数级增长,指数的幂是非零特征的数量。相对于上述标准,它们可能代表了良好的权衡。

它还回答了您提出的问题:

有人可能会假设,0 处的硬饱和可能会通过阻止梯度反向传播来损害优化。为了评估这种效应的潜在影响,我们还研究了 softplus 激活:softplus(x)=log(1+ex)(Dugas et al., 2001),一个平滑版本的整流非线性。我们失去了精确的稀疏性,但可能希望获得更容易的训练。然而,实验结果往往与该假设相矛盾,这表明硬零实际上可以帮助监督训练。我们假设,只要梯度可以沿着某些路径传播,硬非线性就不会受到伤害,即,每一层中的一些隐藏单元是非零的更均匀地,我们假设优化更容易。

您可以阅读论文Deep Sparse Rectifier Neural Networks了解更多详细信息。

这就是为什么使用 PReLU、ELU 或其他类似泄漏的 ReLU 激活可能是一个更好的主意,这些激活不仅会消失为 0,而且当 x 变为负数时会下降到 0.1*x 以继续学习。长期以来,在我看来,ReLU 就像 sigmoid 一样是历史,尽管出于某种原因,人们仍然使用这些发表论文。为什么?我不知道。

Dmytro Mishkin 和其他人实际上用大量不同的激活类型测试了一个网络,你应该看看他们对不同激活函数和其他东西的性能的发现. 但是,使用普通 ReLU 可以更好地学习某些函数,例如 XOR。不要用教条的术语来思考任何神经的东西,因为神经网络正在进行中。世界上没有人真正了解和理解他们足以说出神圣的真相。没有人。尝试一下,做出自己的发现。请注意,使用 ReLU 本身是一个非常新的发展,几十年来,该领域所有不同的博士都使用了过于复杂的激活函数,我们现在只能笑了。经常“知道”太多会给你带来不好的结果。重要的是要了解神经网络不是一门精确的科学。数学中没有任何东西能说明神经网络实际上会像它们一样好用。这是启发式的。所以它的延展性很强。

仅供参考,即使绝对值激活在某些问题上也能取得很好的结果,例如 XOR 类问题。不同的激活函数更适合不同的目的。我用 abs() 尝试了 Cifar-10,但它似乎表现更差。虽然,我不能说“它是视觉识别的一个更差的激活函数”,因为我不确定,例如,我的预初始化是否最适合它等等。事实上它正在相对学习好让我吃惊。

此外,在现实生活中,传递给反向传播的“导数”不一定必须与实际的数学导数相匹配。

我什至会说我们应该禁止称它们为“衍生物”并开始称它们为别的东西,例如,error activation functions不要关闭我们的思想来修补它们的可能性。例如,您实际上可以使用 ReLU 激活,但提供 0.1 或类似的值而不是 0 作为 x<0 的导数。在某种程度上,你有一个普通的 ReLU,但神经元不能“死于适应性”。我把这个叫做 NecroRelu,因为它是一个不会死的 ReLU。在某些情况下(当然不是大多数情况下),它比普通的 LeakyReLU 效果更好,后者实际上在 x<0 处具有 0.1 导数,并且比通常的 ReLU 更好。我认为没有太多其他人研究过这样的函数,不过,这个或类似的东西实际上可能是一个很酷的激活函数,没有人考虑过,因为他们过于专注于数学。

至于通常使用什么,对于 tanH(x) 激活函数,通常会传递 1 - x² 而不是 1 - tanH(x)² 作为导数,以便更快地计算。

此外,请注意 ReLU 并不比 TanH 等“明显更好”。在某些情况下,TanH 可能会更好。只是,看起来,不是视觉识别。但是,例如,ELU 对它有一点 sigmoid 柔软度,它是目前最知名的视觉识别激活函数之一。我还没有真正尝试过,但我敢打赌,可以在同一层级别上设置多个具有不同激活功能的组,这将是一种优势。因为,不同的逻辑可以用不同的激活函数更好地描述。有时您可能需要几种类型的评估。

请注意,具有与您的激活函数类型相对应的初始化非常重要。例如,Leaky ReLU 需要与普通 ReLU 不同的其他初始化。

编辑:实际上,与现代架构相比,标准 ReLU 似乎不太容易过度拟合。至少在图像识别方面。似乎如果您要使用大量参数的非常高精度的网络,那么坚持使用普通 ReLU 与泄漏选项可能会更好。但是,当然,您自己测试所有这些。也许,如果给予更多的正则化,一些泄漏的东西会更好地工作。

这是一个启发式的解释:

  • 反向传播中的每个梯度更新都包含许多相乘的因子。
  • 你越接近网络的起点,就越多的这些因素被相乘以获得梯度更新。
  • 其中许多因素是神经元激活功能的衍生物——其余的是权重、偏差等。
  • 在这些因素中,直觉上重要的是权重、偏差等。激活函数导数更像是一种调整参数,旨在让梯度下降以正确的速度朝着正确的方向前进。
  • 如果您将一堆小于 1 的项相乘,那么您拥有的项越多,它们就会趋向于零。因此,如果您的激活函数的斜率 < 1,那么当您离输出层越远时,梯度就会消失。
  • 如果你将一堆大于 1 的项相乘,它们将趋于无穷大,因此如果你的激活函数的斜率 > 1,那么随着你离输出层越远,梯度就会爆炸。
  • 如果我们能够以某种方式神奇地让激活函数的导数贡献的这些项为 1。这直观地意味着对梯度更新的所有贡献都来自问题和模型的输入——权重,输入,偏差 - 而不是选择的激活函数的一些人工制品。
  • 当输出 > 0 时,RELU 的梯度为 1,否则为零。
  • 因此,在反向传播方程中将一堆 RELU 导数相乘具有很好的特性,即要么为 1,要么为 0——更新要么什么都没有,要么完全来自其他权重和偏差。

你可能认为最好有一个线性函数,而不是在 x < 0 时展平。这里的想法是,RELU 生成的稀疏网络具有相对较少的有用链接,这具有更多的生物学合理性,因此一堆权重实际上是有帮助的。此外,只有在激活函数中存在一些非线性时,才能使用神经网络模拟有趣的函数。线性激活函数导致线性输出,这根本不是很有趣。

让我们考虑定义误差信号反向传播的主要递归关系。

为层的权重矩阵和偏置向量,为激活函数。Wibiif

的激活向量计算如下:hii

si=Wi(hi1)+bi

hi=f(si)

的误差信号定义为:δi

δi=Wi+1(δi+1f(si))

其中是两个向量的元素乘法。

为网络中的每一层计算这种递归关系,并表示误差信号从输出层向后传输的方式。现在,如果我们将作为 tanh 函数,我们有除非正好是 1 或 -1,否则这个表达式是 0 到 1 之间的分数。因此,每一层,误差信号都乘以分数,并且变得越来越小:消失的梯度。ff(si)=(1hi2)hi

但是,如果我们采用,我们有对于每个触发了某些东西的神经元,即 1,即激活不为零的神经元(在 numpy 中,这将是)。在这种情况下,误差信号完全传播到下一层(乘以 1)。因此,即使对于具有多层的网络,我们也不会遇到梯度消失的情况。f=Relu=max(0,x)ff=numpy.where(hi>0,1,0)

这个方程还展示了 relu 激活的另一个问题特征 - 死神经元:如果给定的神经元碰巧以某种方式初始化,它不会为任何输入触发(它的激活为零),它的梯度也将为零,并且因此它永远不会被激活。