在实现 dropout(或 drop connect)时 - 您是否需要考虑层中的每个节点都被丢弃的情况?
即使这是一个非常小的机会,在这种情况下采取的正确方法是什么?选择一个新的随机集以退出或将下一层的所有输入设置为零?
有谁知道流行的库(TensorFlow、Keras 等)在这种情况下会做什么?
在实现 dropout(或 drop connect)时 - 您是否需要考虑层中的每个节点都被丢弃的情况?
即使这是一个非常小的机会,在这种情况下采取的正确方法是什么?选择一个新的随机集以退出或将下一层的所有输入设置为零?
有谁知道流行的库(TensorFlow、Keras 等)在这种情况下会做什么?
这是一个很少会实现的问题。对于一个中等大小的神经网络,每个隐藏层都有单位,如果辍学概率设置为(通常使用的高端)然后是所有的概率单位为零是这是一个令人难以置信的微小价值。即使对于一个非常小的神经网络,只有隐藏层中的单元,所有单元为零的概率为, 或小于
所以简而言之,在大多数现实世界的情况下,这不是您需要担心的事情,而且在极少数情况下确实会发生这种情况,您可以简单地重新运行 dropout 步骤以获得一组新的丢弃权重。
通过挖掘TensorFlow的源代码,我找到了dropout的实现here。TensorFlow 甚至不会考虑所有单位都为零的特殊情况。如果发生这种情况,那么该层的输出将简单地为零。这些单元在丢弃时不会“消失”,它们只是取零值,从网络中其他层的角度来看,这非常好。它们可以对零向量以及非零值向量执行后续操作。
应该避免这种情况。如果其中一个隐藏层中的所有神经元都被丢弃,则信号将不会向输出神经元前进,并且您的神经网络将无法按预期运行。正如您在下图中看到的,只有一层中的一部分神经元被丢弃。
您通常为每个隐藏层设置辍学率。因此,如果您将辍学率设置为低于 1,则可以避免这种情况。
下面是在Tensorflow和Keras中如何实现 dropout 层。您通常将所有隐藏层的 dropout 率设置为相同的数字 (0.x),以便调整超参数。
# set the dropout rate as any number between 0 and 1
dropout_rate = 0.4
# tensorflow implementation
dropout = tf.nn.dropout(x, keep_prob = dropout_rate)
# keras implementation
dropout = keras.layers.Dropout(dropout_rate)