在 Andrew Ng在 Coursera 上的神经网络和深度学习课程中,他说使用几乎总是比使用更可取。
他给出的原因是使用的输出以0 为中心,而不是的 0.5,这“使下一层的学习更容易一些”。
为什么将激活的输出居中会加速学习?我假设他指的是前一层,因为学习发生在反向传播期间?
是否还有其他使更受欢迎的功能?更陡峭的梯度会延迟梯度消失吗?
是否有任何情况下更可取?
数学轻,直观的答案首选。
在 Andrew Ng在 Coursera 上的神经网络和深度学习课程中,他说使用几乎总是比使用更可取。
他给出的原因是使用的输出以0 为中心,而不是的 0.5,这“使下一层的学习更容易一些”。
为什么将激活的输出居中会加速学习?我假设他指的是前一层,因为学习发生在反向传播期间?
是否还有其他使更受欢迎的功能?更陡峭的梯度会延迟梯度消失吗?
是否有任何情况下更可取?
数学轻,直观的答案首选。
Yan LeCun 等人在Efficient BackProp中争论说
如果训练集上每个输入变量的平均值接近于零,收敛速度通常会更快。要看到这一点,请考虑所有输入都是正数的极端情况。第一个权重层中特定节点的权重按与成比例的量更新,其中是该节点的(标量)误差,是输入向量(参见方程(5)和(10))。当输入向量的所有分量都是正数时,输入节点的所有权重更新都将具有相同的符号(即符号())。结果,这些权重只能一起减少或全部增加对于给定的输入模式。因此,如果权重向量必须改变方向,它只能通过低效且非常缓慢的锯齿形来实现。
这就是为什么您应该标准化输入以使平均值为零的原因。
同样的逻辑也适用于中间层:
这种启发式应该应用于所有层,这意味着我们希望节点输出的平均值接近于零,因为这些输出是下一层的输入。
后记@craq 指出,这句话对 ReLU(x)=max(0,x) 没有意义,它已成为一种广泛流行的激活函数。虽然 ReLU 确实避免了 LeCun 提到的第一个 zigzag 问题,但它并没有解决 LeCun 所说的将平均值推到零很重要的第二点。我很想知道 LeCun 对此有何评论。无论如何,有一篇名为Batch Normalization的论文,它建立在 LeCun 的工作之上,并提供了一种解决这个问题的方法:
众所周知(LeCun et al., 1998b; Wiesler & Ney, 2011)如果输入被白化,网络训练收敛速度更快——即线性变换为具有零均值和单位方差,并且去相关。由于每一层都观察下层产生的输入,因此对每一层的输入实现相同的白化将是有利的。
顺便说一句,Siraj 的这个视频在 10 分钟有趣的时间里解释了很多关于激活功能的内容。
@elkout 说“与 sigmoid (...) 相比,tanh 更受欢迎的真正原因是 tanh 的导数大于 sigmoid 的导数。”
我认为这不是问题。我从未在文献中看到这是一个问题。如果一个导数小于另一个导数让您感到困扰,您可以对其进行缩放。
逻辑函数的形状为。通常,我们使用的另一个值来使您的导数更宽。
Nitpick:tanh 也是一个sigmoid函数。任何具有 S 形状的函数都是 sigmoid。你们所说的 sigmoid 是逻辑函数。逻辑函数之所以更受欢迎是历史原因。它已被统计学家使用了更长的时间。此外,有些人认为它在生物学上更合理。
这一切本质上取决于激活函数的导数,sigmoid 函数的主要问题是其导数的最大值为 0.25,这意味着 W 和 b 的值的更新将很小。
另一方面,tanh 函数的导数高达 1.0,使得 W 和 b 的更新量大得多。
这使得 tanh 函数作为激活函数(对于隐藏层)几乎总是比 sigmoid 函数更好。
为了自己证明这一点(至少在一个简单的情况下),我编写了一个简单的神经网络并使用 sigmoid、tanh 和 relu 作为激活函数,然后我绘制了误差值如何演变的图,这就是我得到的。
我写的完整笔记本在这里https://www.kaggle.com/moriano/a-showcase-of-how-relus-can-speed-up-the-learning
如果有帮助,这里是 tanh 函数和 sigmoid 函数的导数图表(注意垂直轴!)
回答到目前为止尚未解决的部分问题:
Andrew Ng 说,使用逻辑函数(通常称为 sigmoid)只在二元分类网络的最后一层才有意义。
由于网络的输出预计在和之间,因此逻辑是一个完美的选择,因为它的范围正好是。不需要缩放和转换。