【问题标题】:Why disable dropout during validation and testing?为什么在验证和测试期间禁用 dropout?
【发布时间】:2017-10-28 15:31:31
【问题描述】:

我在多个地方看到您应该在验证和测试阶段禁用 dropout,并且只在训练阶段保留它。有没有理由发生这种情况?我一直找不到一个很好的理由,只是想知道。

我问的一个原因是因为我训练了一个带有 dropout 的模型,结果结果很好 - 准确率约为 80%。然后,我继续验证模型,但忘记将概率设置为 1,模型的准确度下降到 70% 左右。应该这么猛吗?是否像在每个 dropout 层中将 prob 设置为 1 一样简单?

提前致谢!

【问题讨论】:

    标签: neural-network


    【解决方案1】:

    Dropout 是随机禁用层中神经元的随机过程p。这将使某些神经元在每次迭代中都觉得它们是“错误的”——基本上,你是在让神经元对它们的输出感到“错误”,这样它们就更少地依赖前一层节点的输出。这是一种正则化的方法,可以减少过拟合。

    但是,您不应该使用 dropout 来测试数据有两个主要原因:

    • Dropout 使神经元故意输出“错误”值
    • 由于您随机禁用神经元,因此您的网络在每次激活(序列)时都会有不同的输出。这会破坏一致性。

    不过,您可能想了解更多关于验证/测试究竟是什么的内容:

    训练集:一组用于学习的示例:拟合分类器的参数在 MLP 案例中,我们将使用训练集通过反向传播规则找到“最佳”权重

    验证集:用于调整分类器参数的一组示例 在 MLP 案例中,我们将使用验证集来找到隐藏单元的“最佳”数量或确定反向传播算法的停止点

    测试集:一组示例仅用于评估完全训练的分类器的性能在 MLP 案例中,我们将在选择最终模型(MLP 大小和实际权重) 在测试集上评估最终模型后,您不得进一步调整模型!

    为什么要分开测试和验证集?由于验证集用于选择最终模型,因此对验证数据的最终模型的错误率估计将有偏差(小于真实错误率)更进一步!

    来源:Introduction to Pattern Analysis,Ricardo Gutierrez-OsunaTexas A&M University, Texas A&M University (answer)

    即使是为了验证,如果节点具有随机被停用的概率,您将如何确定要删除哪些节点?

    【讨论】:

      【解决方案2】:

      Dropout 是一种使 bagging 实用的方法,适用于非常多的大型神经网络的集合。

      同样,我们可能还记得使用以下错误解释: 对于新数据,我们可以通过取所有学习器结果的平均值来预测它们的类别:

      由于 N 是一个常数,我们可以忽略它,结果保持不变,因此我们应该在验证和测试期间禁用 dropout。


      真正的原因要复杂得多。这是因为权重缩放推理规则:

      我们可以通过在一个模型中评估 p(y|x) 来近似 p_{ensemble}:具有所有单元但权重超出单元 i 的模型乘以包含单元 i 的概率。此修改的动机是从该单元获取正确的输出期望值。对于这种近似推理规则在深度非线性网络中的准确性尚无任何理论论证,但从经验上看它表现得非常好。

      当我们使用 dropout(例如对于一层)训练模型时,我们会将一些神经元的一些输出归零,并将其他神经元的输出放大 1/keep_prob 以保持该层的期望几乎与以前相同。在预测过程中,我们可以使用dropout,但每次只能得到不同的预测,因为我们随机丢弃值,然后我们需要多次运行预测才能得到预期的输出。这样的过程非常耗时,因此我们可以移除 dropout 并且层的期望保持不变。

      参考:

      1. Difference between Bagging and Boosting?
      2. 7.12 of Deep Learning

      【讨论】:

        【解决方案3】:

        简短回答: 辍学以降低对训练数据的过度拟合。它们被用作正则化参数。因此,如果您有很高的方差(即查看训练集和验证集准确性之间的差异),那么对训练数据使用 dropout,因为它不足以像您一样对测试和验证数据应用 dropout'不确定会关闭的神经元,因此忽略了可能很重要的随机神经元的重要性。

        【讨论】:

        • 是的,您不想在测试阶段“避免过度拟合”,所以从实际角度来看,这首先没有意义。
        【解决方案4】:

        最简单的原因可能是,在预测期间(测试、验证或生产部署后)您想使用每个学习到的神经元的能力,并且真的不喜欢随机跳过其中的一些。

        这是我们在测试期间将概率设置为 1 的唯一原因。

        【讨论】:

          【解决方案5】:

          有一种称为Monte Carlo dropout 的贝叶斯技术,在该技术中,dropout 在测试期间不会被禁用。该模型将以相同的 dropout 率(但不同的参数被置零)运行多次,并将计算结果的平均值(下图第 6 行)和方差(下图第 7 行)以确定不确定性。

          这里是Uber's application 来量化不确定性:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-05-10
            • 2018-11-23
            • 1970-01-01
            • 2012-08-20
            • 2020-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多