为什么 Keras Dropout 中的非零值会发生变化?
Why does non-zero values change in Keras Dropout?
假设我有一个张量:
x = tf.reshape(tf.constant(tf.range(1, 21, dtype=tf.float32)), (5,4))
<tf.Tensor: id=1080557, shape=(5, 4), dtype=float32, numpy=
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 16.],
[17., 18., 19., 20.]], dtype=float32)>
然后我对其应用了 dropout:
dropout = tf.keras.layers.Dropout(0.1)
dropout(x, training=True)
<tf.Tensor: id=1080704, shape=(5, 4), dtype=float32, numpy=
array([[ 1.1111112, 2.2222223, 3.3333335, 0. ],
[ 5.555556 , 6.666667 , 7.777778 , 8.888889 ],
[10. , 11.111112 , 12.222223 , 0. ],
[14.444445 , 15.555556 , 16.666668 , 17.777779 ],
[18.88889 , 0. , 21.111113 , 22.222223 ]], dtype=float32)>
每次我 运行 它都有 1 到 3 个归零值,这不完全是 rate=0.1
。它实际适用的费率范围是多少?为什么非归零值会发生变化?
可视化 Celius Stingher 的答案:
l = 10000; r = range(l)
f = np.zeros((5,4))
for i in r:
d = dropout(x, training=True)
f += d
f = f/l
f
<tf.Tensor: id=1234967, shape=(5, 4), dtype=float32, numpy=
array([[ 1.0006623, 1.999991 , 2.988533 , 4.017763 ],
[ 5.000613 , 6.0477467, 7.0076656, 8.0248575],
[ 9.048 , 10.06455 , 10.980609 , 12.010143 ],
[12.918334 , 14.100925 , 15.039784 , 16.014153 ],
[17.0579 , 18.112 , 19.064175 , 20.024672 ]], dtype=float32)>
因为 dropout 的工作方式是每个神经元都设置为 0,概率等于您传递的值。您可以将其视为具有 p = 0.1
和 n = 20
的二项分布[*] 预期值等于 2 并且 标准偏差等于 ~ 1.34 这样就解释了为什么大多数时候你会看到 1 到 3 个神经元(值)被强制为 0。这就是为什么你可以在 dropout 函数中设置随机种子以确保再现性
[*] 在本文1 中,您可以找到更多细节,他们假设 r(j) 遵循伯努利分布(因此多个伯努利分布的重复遵循二项式分布)。
OP问:谢谢。我明白了,但其他价值观呢?为什么非归零值会改变?
编辑:给定函数的工作方式、您的模型和给定的一组值,应用 dropout 后长 运行 中的预期值必须等于应用它们之前的值。因此,如果您 运行 这段代码让我们说 1000 次迭代,我预计每个 运行 的平均值的平均值趋向于 10.5(或总共 210)。实现这一点的唯一方法是将每个值以与 dropout 相同的速率增加。如果您遇到 worse
情况,您将删除最后 3 个数字,但在 best
情况下,您将删除前 3 个数字,两个平均值的平均值为 10.5,即初始平均值。解释来自我链接的论文。 (第 1933 页)
假设我有一个张量:
x = tf.reshape(tf.constant(tf.range(1, 21, dtype=tf.float32)), (5,4))
<tf.Tensor: id=1080557, shape=(5, 4), dtype=float32, numpy=
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 16.],
[17., 18., 19., 20.]], dtype=float32)>
然后我对其应用了 dropout:
dropout = tf.keras.layers.Dropout(0.1)
dropout(x, training=True)
<tf.Tensor: id=1080704, shape=(5, 4), dtype=float32, numpy=
array([[ 1.1111112, 2.2222223, 3.3333335, 0. ],
[ 5.555556 , 6.666667 , 7.777778 , 8.888889 ],
[10. , 11.111112 , 12.222223 , 0. ],
[14.444445 , 15.555556 , 16.666668 , 17.777779 ],
[18.88889 , 0. , 21.111113 , 22.222223 ]], dtype=float32)>
每次我 运行 它都有 1 到 3 个归零值,这不完全是 rate=0.1
。它实际适用的费率范围是多少?为什么非归零值会发生变化?
可视化 Celius Stingher 的答案:
l = 10000; r = range(l)
f = np.zeros((5,4))
for i in r:
d = dropout(x, training=True)
f += d
f = f/l
f
<tf.Tensor: id=1234967, shape=(5, 4), dtype=float32, numpy=
array([[ 1.0006623, 1.999991 , 2.988533 , 4.017763 ],
[ 5.000613 , 6.0477467, 7.0076656, 8.0248575],
[ 9.048 , 10.06455 , 10.980609 , 12.010143 ],
[12.918334 , 14.100925 , 15.039784 , 16.014153 ],
[17.0579 , 18.112 , 19.064175 , 20.024672 ]], dtype=float32)>
因为 dropout 的工作方式是每个神经元都设置为 0,概率等于您传递的值。您可以将其视为具有 p = 0.1
和 n = 20
的二项分布[*] 预期值等于 2 并且 标准偏差等于 ~ 1.34 这样就解释了为什么大多数时候你会看到 1 到 3 个神经元(值)被强制为 0。这就是为什么你可以在 dropout 函数中设置随机种子以确保再现性
[*] 在本文1 中,您可以找到更多细节,他们假设 r(j) 遵循伯努利分布(因此多个伯努利分布的重复遵循二项式分布)。
OP问:谢谢。我明白了,但其他价值观呢?为什么非归零值会改变?
编辑:给定函数的工作方式、您的模型和给定的一组值,应用 dropout 后长 运行 中的预期值必须等于应用它们之前的值。因此,如果您 运行 这段代码让我们说 1000 次迭代,我预计每个 运行 的平均值的平均值趋向于 10.5(或总共 210)。实现这一点的唯一方法是将每个值以与 dropout 相同的速率增加。如果您遇到 worse
情况,您将删除最后 3 个数字,但在 best
情况下,您将删除前 3 个数字,两个平均值的平均值为 10.5,即初始平均值。解释来自我链接的论文。 (第 1933 页)