2

我正在尝试在 tensorflow 中实现一个带有 dropout 的神经网络。

tf.layers.dropout(inputs, rate, training)

来自文档:“Dropout 包括在训练期间的每次更新时将输入单元的分数率随机设置为 0,这有助于防止过度拟合。保留的单元按 1 / (1 - rate) 缩放,因此它们的总和在训练时间和推理时间没有变化。”

现在我明白了,如果 dropout 应用在严格高于零的 sigmoid 激活之上,则会出现这种行为。如果一半的输入单元归零,所有输出的总和也将减半,因此将它们缩放 2 倍是有意义的,以便在下一层之前重新获得某种一致性。

现在,如果使用以零为中心的 tanh 激活怎么办?上面的推理不再成立,那么按上述因素缩放 dropout 的输出仍然有效吗?有没有办法防止 tensorflow dropout 缩放输出?

提前致谢

4

2 回答 2

1

如果您有一组节点输入和一组权重,则它们的加权和是一个值 S。您可以通过选择原始随机变量的随机分数 f 来定义另一个随机变量。这样定义的随机变量使用相同权重的加权和为S*f。从中可以看出,如果目标是总和的平均值在有和没有缩放的情况下保持不变,则重新缩放的论点是精确的。当激活函数在子集的加权和的范围内是线性时,这将是正确的,如果激活函数在子集的加权和的范围内是近似线性的,则近似正确。

在通过任何非线性激活函数传递线性组合之后,重新缩放准确地保留预期均值不再是真的。但是,如果对一个节点的贡献不是由少数节点主导,那么一个随机选择的子集的总和的方差会相对较小,如果激活函数是近似线性的,那么相当接近输出值,重新缩放将很好地产生具有大致相同平均值的输出。例如,logistic 和 tanh 函数在任何小区域上都是近似线性的。请注意,函数的范围无关紧要,只有其值之间的差异。

使用 relu 激活,如果原始加权和足够接近于零,使得子集的加权和在零的两侧,激活函数中的一个不可微分点,重新缩放不会那么好,但这是一个相对罕见的情况并且仅限于小输出,所以可能不是一个大问题。

这里的主要观察结果是,重新缩放在大量节点做出重大贡献时效果最佳,并且依赖于激活函数的局部近似线性。

于 2017-11-04T15:55:57.667 回答
0

将节点设置为输出为零的目的是使神经元对它所馈送的神经元没有影响。这会产生稀疏性,因此会尝试减少过度拟合。使用 sigmoid 或 tanh 时,该值仍设置为零。

我认为您在这里的推理方法是不正确的。考虑贡献而不是总和。

于 2017-08-04T10:48:20.677 回答