我亲自研究神经网络的理论并得到了一些问题。
在许多书籍和参考资料中,对于隐藏层的激活函数,都使用了超正切函数。
书籍提出了非常简单的理由,即 tanh 函数的线性组合可以描述几乎所有具有给定误差的函数形状。
但是,来了一个问题。
- 这是使用 tanh 函数的真正原因吗?
- 如果是这样,这是使用 tanh 函数的唯一原因吗?
- 如果是这样,tanh 函数是唯一可以做到这一点的函数吗?
- 如果不是,真正的原因是什么?...
我在这里一直在思考......请帮助我摆脱这个心理(?......)陷阱!
我亲自研究神经网络的理论并得到了一些问题。
在许多书籍和参考资料中,对于隐藏层的激活函数,都使用了超正切函数。
书籍提出了非常简单的理由,即 tanh 函数的线性组合可以描述几乎所有具有给定误差的函数形状。
但是,来了一个问题。
我在这里一直在思考......请帮助我摆脱这个心理(?......)陷阱!
大多数时候 tanh 比 sigmoid 和逻辑函数更快收敛,并且执行更好的准确性[1]。然而,最近由 Hinton [2]提出的整流线性单元 (ReLU)表明 ReLU 的训练速度是 tanh [3]的六倍,以达到相同的训练误差。您可以参考[4]来了解 ReLU 提供了哪些好处。
根据大约 2 年的机器学习经验。我想分享一些使用最多的论文的策略以及我在计算机视觉方面的经验。
规范化好可以获得更好的性能并快速收敛。大多数时候我们会减去平均值使输入均值为零,以防止权重改变相同的方向,从而缓慢收敛[5]。最近谷歌也指出这种现象是在训练深度学习时内部协变量偏移,他们提出了批量归一化[6]以便归一化具有零均值和单位方差的每个向量。
更多的训练数据可以很好地生成特征空间并防止过度拟合。在计算机视觉中,如果训练数据不足,增加训练数据集的大部分使用技巧是数据论证和综合训练数据。
ReLU 非线性激活效果更好,并在深度学习和 MLP 中取得了最先进的结果。此外,它还有一些好处,例如实现简单,反向传播计算成本更低,可以有效地训练更深的神经网络。但是,ReLU 将获得零梯度,并且在单元为零活动时不进行训练。因此提出了一些改进的 ReLU,例如 Leaky ReLU 和 Noise ReLU,最流行的方法是微软提出的 PReLU [7],它推广了传统的 recitifed 单元。
事实上,tanh 和逻辑函数都可以使用。这个想法是您可以将任何实数( [-Inf, Inf] )映射到 [-1 1] 或 [0 1] 之间的数字,分别用于 tanh 和逻辑。通过这种方式,可以证明这些函数的组合可以逼近任何非线性函数。现在关于 tanh 优于逻辑函数的偏好是,第一个关于 0 是对称的,而第二个不是。这使得第二层更容易出现后面的层饱和,使训练更加困难。
加上已经存在的答案,对 0 左右对称的偏好不仅仅是美学问题。LeCun 等人的一篇出色的文章“ Efficient BackProp ”详细说明了为什么输入、输出和隐藏层的平均值为 0,标准差为 1 是个好主意。
试图安抚评论者的更新:纯粹基于观察,而不是上面涵盖的理论,Tanh 和 ReLU 激活函数比 sigmoid 更有效。Sigmoid 似乎也更容易出现局部最优,或最少扩展的“扁线”问题。例如,尝试限制特征的数量以在 XOR 和sigmoid 中强制逻辑进入网络节点很少成功,而Tanh和ReLU更成功。
对于许多给定的示例,Tanh 似乎可能比 ReLU 慢,但正如您所描述的,仅使用线性输入就可以为数据产生更自然的拟合。例如圆形与方形/六边形的东西。
http://playground.tensorflow.org/ <- 这个站点是神经网络激活函数和其他参数的绝佳可视化。不是对您问题的直接回答,而是正如 Andrew Ng 所说,该工具“提供直觉”。
这里的许多答案都描述了为什么 tanh(即 (1 - e^2x) / (1 + e^2x)) 优于 sigmoid/logistic 函数(1 / (1 + e^-x)),但它应该注意到这有一个很好的理由说明为什么这是两个最常见的替代方案,这是应该理解的,那就是在使用反向传播算法训练 MLP 期间,该算法需要激活函数在点的导数的值激活网络中的每个节点。虽然这通常可以为大多数合理的激活函数计算(除了那些不连续的,这对那些来说有点问题),这样做通常需要昂贵的计算和/或存储额外的数据(例如激活函数的输入值,在计算每个节点的输出后不需要)。函数的输出;即如果节点的输入加权和是 v 并且它的输出是 u,我们需要知道 du/dv 可以从u而不是更传统的v计算:对于 tanh,它是 1 - u^2,对于逻辑函数它是 u * (1 - u)。这一事实使得这两个函数在反向传播网络中的使用比大多数替代方法更有效,因此通常需要一个令人信服的理由来偏离它们。
理论上我符合上述回答。根据我的经验,一些问题更倾向于使用 sigmoid 而不是 tanh,这可能是由于这些问题的性质(由于存在非线性效应,很难理解为什么)。
给定一个问题,我通常使用遗传算法优化网络。种群中每个元素的激活函数是在一组可能性(sigmoid、tanh、linear...)之间随机选择的。对于 30% 的分类问题,遗传算法找到的最佳元素以 sigmoid 作为激活函数。
在深度学习中,ReLU 已成为首选的激活函数,因为其数学运算比 tanh 或 logit 等 sigmoid 激活函数要简单得多,尤其是在你有很多层的情况下。要使用反向传播分配权重,您通常会计算损失函数的梯度并对隐藏层应用链式法则,这意味着您需要激活函数的导数。ReLU 是一个斜坡函数,其中导数为 0 的平坦部分和导数为 1 的倾斜部分。这使得数学变得非常容易。如果您使用双曲正切,您可能会遇到衰减梯度问题,这意味着如果 x 小于 -2 或大于 2,则导数会变得非常小并且您的网络可能不会收敛,或者您最终可能会有一个死神经元不再开火。