神经网络的激活函数

Posted

技术标签:

【中文标题】神经网络的激活函数【英文标题】:Activation function for neural network 【发布时间】:2013-08-20 04:20:52 【问题描述】:

我需要帮助来确定合适的激活函数。我训练我的神经网络来检测钢琴音符。所以在这种情况下,我只能有一个输出。注释存在 (1) 或注释不存在 (0)。 假设我引入了 0.5 的阈值,并说如果输出大于 0.5,则存在所需的音符,如果小于 0.5,则不存在音符,我可以使用哪种类型的激活函数。我认为它应该是硬限制,但我想知道是否也可以使用 sigmoid。

【问题讨论】:

【参考方案1】:

为了充分发挥神经网络的威力,神经网络需要连续的、可区分的激活函数。阈值不是多层神经网络的好选择。 Sigmoid 是一个非常通用的函数,可以在大多数情况下应用。当您进行二元分类(0/1 值)时,最常见的方法是定义 一个 输出神经元,如果其输出大于阈值(通常为 0.5),则只需选择 1 类.

编辑

当您处理非常简单的数据(两个输入维度和两个输出类)时,实际上放弃神经网络并从数据可视化开始似乎是最佳选择。二维数据可以简单地绘制在平面上(不同的类别使用不同的颜色)。一旦你这样做了,你就可以调查将一个类与另一个类分开有多难。如果数据位于途中,您可以简单地用一条线将它们分开 - 线性支持向量机将是更好的选择(因为它可以保证一个全局最优值)。如果数据看起来真的很复杂,并且决策边界必须是一些曲线(甚至是一组曲线),我建议使用 RBF SVM,或者至少是正则化形式的神经网络(因此它的训练至少是相当可重复的)。如果您决定使用神经网络 - 情况非常相似 - 如果数据只是在平面上分离 - 您可以使用简单的(线性/阈值)激活函数。如果它不是线性可分的 - 使用 sigmoid 或双曲正切,这将确保决策边界的非线性。

更新

过去两年发生了很多变化。特别是(正如评论中所建议的,@Ulysee),人们对“几乎无处不在”的可区分函数越来越感兴趣,例如ReLU。这些函数在其大部分域中都有有效的导数,因此我们需要在这些点上求导的概率为零。因此,我们仍然可以使用经典方法,如果我们需要计算ReLU'(0),为了完整起见,我们可以使用零导数。 ReLU还有完全可微的逼近,比如softplus函数

【讨论】:

好吧,我实际上并不是在构建网络,而只是在研究它以完成一项任务。输入将是通过使用听觉模型和自适应振荡器(部分跟踪)时间延迟神经网络对输入信号进行预处理获得的频率和幅度,多层前馈网络似乎是具有监督学习的隐藏层的最佳选择。 另外,由于我使用阈值,所以我的输出介于 0 和 1 之间。我发现 sigmoid 函数的这个定义“这个函数特别有利于在由 back- 训练的神经网络中使用传播,因为它易于区分,因此可以显着减少训练的计算负担。它适用于期望输出值在 0 和 1 之间的应用程序。” 我想我现在明白了。谢谢。 如果你在做二进制分类,你应该有 一个 输出神经元,因为来自该神经元的响应足以编码类。此外,需要澄清一点,但神经网络只有在使用非线性激活函数并且包含隐藏层时才是非线性的。对于这样一个简单的问题,我很想先使用逻辑回归,这相当于一个输出节点,带有 sigmoid 激活的两层神经网络,经过训练以最小化交叉熵损失。 这是一个旧答案,但请注意 1) 不需要可微分的激活函数。事实上,分段线性的 RELU 单元非常强大,收敛速度更快,而且 2) sigmoid 单元很糟糕。至少要使用 tanh 单位,但任何类型的饱和单位(大区域中的零梯度)都需要仔细调整输入和初始化权重,这是高度依赖问题且耗时的。【参考方案2】:

***文章有一些有用的“软”连续阈值函数 - 参见图 Gjl-t(x).svg。

en.wikipedia.org/wiki/Sigmoid_function.

遵循奥卡姆剃刀法则,使用一个输出节点的更简单模型是二元分类的良好起点,其中一个类标签在激活时映射到输出节点,而另一个类标签在输出节点未激活时映射。

【讨论】:

以上是关于神经网络的激活函数的主要内容,如果未能解决你的问题,请参考以下文章

激活函数

神经网络激活函数

浅谈神经网络中的激活函数

激活函数总结

神经网络中的激活函数

机器学习神经网络的激活函数并通过python实现激活函数