Tensorflow:tf.nn.dropout output_keep_prob 实际上是什么?

Tensorflow : What is actually tf.nn.dropout output_keep_prob?

我正在尝试理解 output_keep_prob 的概念:

所以如果我的例子是简单的 RNN :

    with tf.variable_scope('encoder') as scope:
        cells = rnn.LSTMCell(num_units=500)
        cell = rnn.DropoutWrapper(cell=cells, output_keep_prob=0.5)

        model = tf.nn.bidirectional_dynamic_rnn(cell, cell, inputs=embedding_lookup, sequence_length=sequence_le,
                                                dtype=tf.float32)

我的困惑是,如果我给出 output_keep_prob=0.5 它到底是什么意思?我知道通过添加 dropout 可以降低过度拟合(称为正则化)的可能性。它在训练期间随机关闭神经元的激活,好的我明白了这一点但是当我给出

时我很困惑

output_keep_prob=0.5 和我的 no_of_nodes = 500 然后 0.5 意味着它将在每次迭代中随机打开 50% 的节点,或者这意味着它将只保留那些概率大于或等于 0.5 的连接

keep_layers whose probability =>0.5  

turn off 50% randomly nodes unit at each iteration ??

我试图通过这个 来理解这个概念,但也有同样的困惑,即 0.5 究竟意味着什么?它应该在每次迭代中删除 50% 的节点,或者只保留那些概率大于或等于 0.5

的节点

如果答案是第二个keep only those nodes which have probability more or equal to 0.5 :

那么这意味着假设我已经给了 500 个节点单元并且只有 30 个节点有 0.5 的概率所以它会变成剩余的 470 个节点并且将只使用 30 个节点用于传入和传出连接?

因为 this answer 说:

Suppose you have 10 units in the layer and set the keep_prob to 0.1, Then the activation of 9 randomly chosen units out of 10 will be set to 0, and the remaining one will be scaled by a factor of 10. I think a more precise description is that you only keep the activation of 10 percent of the nodes.

而@mrry 的另一边 说:

it means that each connection between layers (in this case between the last densely connected layer and the readout layer) will only be used with probability 0.5 when training.

任何人都可以清楚地解释哪个是正确的以及这个值在 keep_prob 中实际代表什么?

Keep_prop 表示保留任何给定神经元输出的概率(与丢弃相反,即归零。)换句话说,keep_prob = 1 - drop_prob.

tf.nn.dropout() 描述表明

By default, each element is kept or dropped independently.

所以如果你考虑一下,如果你有大量的神经元,比如一层中有 10,000 个,而 keep_prob 比方说,0.3,那么 3,000 就是神经元数量的期望值神经元保留。因此,说 keep_prob 为 0.3 意味着保留 10,000 个神经元中随机选择的 3,000 个神经元的值,这或多或少是一回事。但不完全是,因为实际数字可能与 3,000 略有不同。

缩放是重要的,因为如果你删除一定数量的神经元,那么层的预期总和就会减少。因此,其余的将相乘以前馈与其他情况下相同的值大小。如果您加载预训练网络并希望继续训练但现在使用不同的 keep_prob 值,这一点尤其重要。

(请注意,您可以决定使用 noise_shape 参数将非独立性引入到掉落概率中,请参阅 tf.nn.drouput() description,但这超出了本题的范围。 )

每次调用网络都会重新计算是否丢弃神经元的随机决定,因此每次迭代都会丢弃一组不同的神经元。 dropout 背后的想法是后续层不能过度拟合并学会观察某些激活的任意星座。您总是更改以前可用的激活,从而毁了 "secret plan of lazy neurons to overfit"。

dropout 效率的直观解释如下。

假设您有一个工人团队,总体目标是学习如何建造建筑物。当每个工人都过于专业时,如果一个人生病或犯错,整个大楼都会受到严重影响。 “dropout”技术提出的解决方案是每周随机抽取一些工人,派他们出差。希望整个团队仍然学习如何建造建筑物,从而更能适应噪音或休假的工人。

由于其简单性和有效性,如今在各种体系结构中使用了 dropout,通常紧接在完全连接的层之后。

机器学习中的泛化是指模型学到的概念如何很好地应用于训练期间未见过的示例。大多数机器学习模型的目标是从训练数据中很好地概括,以便在未来对看不见的数据做出良好的预测。当模型从训练数据中很好地学习细节和噪声时,就会发生过度拟合,但泛化效果不佳,因此测试数据的性能很差。当数据集与需要学习的模型参数数量相比太小时,这是一个非常普遍的问题。这个问题在具有数百万个参数的深度神经网络中尤为严重。

这是我找到的视觉解释:

More info 这里