如何为隐藏层选择激活函数?

人工智能 神经网络 深度学习 激活函数 超参数优化 超参数
2021-10-24 19:57:19

我根据我需要的输出和我知道的激活函数的属性为输出层选择激活函数。例如,我在处理概率时选择sigmoid函数,在处理正值时选择ReLU,在处理一般值时选择线性函数。

在隐藏层中,我使用leaky ReLU来避免死神经元而不是 ReLU,并使用tanh而不是sigmoid当然,我不在隐藏单元中使用线性函数。

然而,在隐藏层中对它们的选择主要是由于反复试验。

是否有任何经验法则可以确定在某些情况下哪种激活函数可能运行良好?

尽可能笼统地使用术语情况:它可以指层的深度,神经网络的深度,该层的神经元数量,我们选择的优化器,输入特征的数量那个层,这个NN的应用等等。

我发现的激活函数越多,我在选择隐藏层中使用的函数时就越感到困惑。我不认为抛硬币是选择激活函数的好方法。

3个回答

在我看来,您似乎已经了解 ReLU 和 sigmoid 的缺点(就像普通 ReLU 中的死神经元一样)。

您可能想查看ELU(指数线性单位)和SELU(ELU 的自归一化版本)。在一些温和的假设下,后者具有自归一化的良好特性,可以缓解梯度消失和爆炸的问题。此外,它们传播归一化——即,它们保证下一层的输入将具有零均值和单位方差。

然而,推荐一个适用于所有用例的激活函数 (AF) 是非常困难的,尽管我相信 SELU 的设计是为了让它在几乎任何输入的情况下都能做正确的事情。

有许多考虑因素 - 计算导数有多难(如果它完全可微!),具有您选择的 AF 的 NN 收敛速度有多快,它有多平滑,它是否满足通用逼近定理的条件,是否它保留了标准化,等等。您可能关心也可能不关心其中的一些或任何一个。

底线是没有通用的规则来选择隐藏层的激活函数。就个人而言,我喜欢使用 sigmoid(尤其是tanh),因为它们有很好的界限并且计算速度非常快,但最重要的是因为它们适用于我的用例如果您的 NN 无法学习,其他人建议将输入层和隐藏层的 泄漏 ReLU作为首选功能。您甚至可以混合和匹配激活函数来为花哨的应用程序进化 NN

在一天结束的时候,你可能会得到多少人关于正确选择激活函数的意见,所以简短的回答应该是:从当天的 AF 开始(泄漏的 ReLU / SELU?)如果你的 NN 难以学习任何东西,你可以通过其他 AF 来降低受欢迎程度。

***把我的回答作为cantordust给出的旁注:

如果可以验证激活函数在某些情况下表现良好,那么这种良好行为通常可以外推到其他问题。因此,通过在几个不同的问题上测试激活函数,人们通常可以推断出它在大多数问题上的表现如何(或糟糕)。以下视频展示了不同激活函数在不同问题中的表现:

https://www.youtube.com/watch?v=Hb3vIYUQ_I8

可以验证激活函数通常在所有情况下都表现良好,或者反过来:它在所有情况下都表现不佳。正如 cantordust 所说,我建议始终从leaky ReLU 开始:它简单、高效,并且通常在各种各样的问题中都能产生很好的结果。它还规避了濒死的 ReLU 问题,并且不受梯度消失问题的影响。唯一要记住的是,如果神经网络太深,或者如果它是循环神经网络,则会出现梯度爆炸问题,它们本质上是相同的概念。

该视频显示其他值得尝试的激活函数(除了leaky ReLU)是 Gaussian、Sinusoid 或 Tanh。

我不知道您正在研究哪种神经网络。但是在处理循环神经网络时也应该考虑 tanh 激活函数。原因是要避免梯度爆炸问题,因为例如 tanh 函数受限于 RELU 函数的差异。