为啥会存在激活函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥会存在激活函数?相关的知识,希望对你有一定的参考价值。

参考技术A

    在深度学习网络中,我们经常可以看到对于某一个隐藏层节点的激活值计算一般分为两步,如下图:

    激活函数是我们对输入做的一种非线性的转换。转换的结果输出,并当作下一个隐藏层的输入。

    1、首先对于y=ax+b 这样的函数,当x的输入很大时,y的输出也是无限大/小的,经过多层网络叠加后,值更加膨胀的没边了,这显然不符合我们的预期,很多情况下我们希望的输出是一个概率。
    2、线性变换太简单(只是加权偏移),限制了对复杂任务的处理能力。 没有激活函数的神经网络就是一个线性回归模型 。激活函数做的非线性变换可以使得神经网络处理非常复杂的任务。例如,我们希望我们的神经网络可以对语言翻译和图像分类做操作,这就需要非线性转换。同时,激活函数也使得反向传播算法变的可能。因为,这时候梯度和误差会被同时用来更新权重和偏移。没有可微分的线性函数,这就不可能了。
    3、结论:可以用线性激活函数的地方一般会是输出层。

    在深度学习中,常用的激活函数主要有:sigmoid函数,tanh函数,ReLU函数、Leaky ReLU函数。

    该函数是将取值为 (−∞,+∞)(的数映射到 (0,1) 之间。sigmoid函数的公式以及图形如下:

    tanh函数相较于sigmoid函数要常见一些,该函数是将取值为 (−∞,+∞)的数映射到 (−1,1) 之间,其公式与图形为

    ReLU函数又称为修正线性单元(Rectified Linear Unit),是一种分段线性函数,其弥补了sigmoid函数以及tanh函数的梯度消失问题。ReLU函数的公式以及图形如下:

    这是一种对ReLU函数改进的函数,又称为PReLU函数,但其并不常用。其公式与图形如下:

[1] https://blog.csdn.net/qq_35290785/article/details/89349635
[2] https://www.datalearner.com/blog/1051508750742453
[3] https://www.cnblogs.com/lliuye/p/9486500.html

更多自然语言处理、pytorch相关知识,还请关注 AINLPer 公众号,极品干货即刻送达。

神经网络的激活函数

【中文标题】神经网络的激活函数【英文标题】: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.

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

【讨论】:

以上是关于为啥会存在激活函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥门控激活函数(在 Wavenet 中使用)比 ReLU 工作得更好?

为啥NNtool box中神经网络输出激活函数的建议是纯的?

神经网络的激活函数

python做BP神经网络,进行数据预测,训练的输入和输出值都存在负数,为啥预测值永远为正数?

激活函数总结

机器学习总结2 - 关于激活函数损失函数正则化异常检测算法总结