反转 dropout 如何补偿 dropout 的影响并保持预期值不变?
How inverting the dropout compensates the effect of dropout and keeps expected values unchanged?
我正在通过 deeplearning.ai
课程学习神经网络中的正则化。在 dropout 正则化中,教授说如果应用 dropout,计算出的激活值将比不应用 dropout 时(测试时)小。所以我们需要扩展激活以保持测试阶段更简单。
我明白这个事实,但我不明白缩放是如何完成的。这是一个用于实现反向丢弃的代码示例。
keep_prob = 0.8 # 0 <= keep_prob <= 1
l = 3 # this code is only for layer 3
# the generated number that are less than 0.8 will be dropped. 80% stay, 20% dropped
d3 = np.random.rand(a[l].shape[0], a[l].shape[1]) < keep_prob
a3 = np.multiply(a3,d3) # keep only the values in d3
# increase a3 to not reduce the expected value of output
# (ensures that the expected value of a3 remains the same) - to solve the scaling problem
a3 = a3 / keep_prob
在上面的代码中,为什么激活除以 0.8
或者将节点保留在层中的概率 (keep_prob
)?任何数值示例都会有所帮助。
我花了一些时间了解反向丢弃后得到了自己的答案。这是直觉:
我们以 keep_prob
的概率保留任何层中的神经元。假设 keep_prob = 0.6
。这意味着关闭任何层中 40% 的神经元。如果在关闭 40% 的神经元之前该层的原始输出是 x
,那么在应用 40% 的 dropout 之后,它将 减少 0.4 * x
。所以现在它将是 x - 0.4x = 0.6x
.
为了保持原来的输出(期望值),我们需要将输出除以keep_prob
(这里是0.6
)。
另一种看待它的方式可能是:
TL;DR:尽管由于 dropout,我们的神经元变少了,但我们希望神经元对输出的贡献与我们拥有所有神经元时的贡献相同。
dropout = 0.20
,我们“关闭了 20% 的神经元”,这也等同于“保留了 80% 的神经元”。
假设神经元的数量是x
。 “保留80%”具体是0.8 * x
。将 x
再次除以 keep_prob
有助于“缩小”到原始值,即 x/0.8
:
x = 0.8 * x # x is 80% of what it used to be
x = x/0.8 # x is scaled back up to its original value
现在,反相的目的是确保Z值不会受到W减少的影响。(Cousera)。
当我们将 a3
缩小 keep_prob
时,我们无意中也缩小了 z4
的值(因为 z4 = W4 * a3 + b4
)。为了补偿这种缩放,我们需要将它除以 keep_prob
,以将其放大。 (Whosebug)
# keep 80% of the neurons
keep_prob = 0.8
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3, d3)
# Scale it back up
a3 = a3 / keep_prob
# this way z4 is not affected
z4 = W4 * a3 + b4
如果不缩放会怎样?
With scaling:
-------------
Cost after iteration 0: 0.6543912405149825
Cost after iteration 10000: 0.061016986574905605
Cost after iteration 20000: 0.060582435798513114
On the train set:
Accuracy: 0.9289099526066351
On the test set:
Accuracy: 0.95
Without scaling:
-------------
Cost after iteration 0: 0.6634619861891963
Cost after iteration 10000: 0.05040089794130624
Cost after iteration 20000: 0.049722351029060516
On the train set:
Accuracy: 0.933649289099526
On the test set:
Accuracy: 0.95
虽然这只是一个数据集的单个示例,但我不确定它是否对浅层神经网络产生重大影响。也许它更适合更深层次的架构。
我正在通过 deeplearning.ai
课程学习神经网络中的正则化。在 dropout 正则化中,教授说如果应用 dropout,计算出的激活值将比不应用 dropout 时(测试时)小。所以我们需要扩展激活以保持测试阶段更简单。
我明白这个事实,但我不明白缩放是如何完成的。这是一个用于实现反向丢弃的代码示例。
keep_prob = 0.8 # 0 <= keep_prob <= 1
l = 3 # this code is only for layer 3
# the generated number that are less than 0.8 will be dropped. 80% stay, 20% dropped
d3 = np.random.rand(a[l].shape[0], a[l].shape[1]) < keep_prob
a3 = np.multiply(a3,d3) # keep only the values in d3
# increase a3 to not reduce the expected value of output
# (ensures that the expected value of a3 remains the same) - to solve the scaling problem
a3 = a3 / keep_prob
在上面的代码中,为什么激活除以 0.8
或者将节点保留在层中的概率 (keep_prob
)?任何数值示例都会有所帮助。
我花了一些时间了解反向丢弃后得到了自己的答案。这是直觉:
我们以 keep_prob
的概率保留任何层中的神经元。假设 keep_prob = 0.6
。这意味着关闭任何层中 40% 的神经元。如果在关闭 40% 的神经元之前该层的原始输出是 x
,那么在应用 40% 的 dropout 之后,它将 减少 0.4 * x
。所以现在它将是 x - 0.4x = 0.6x
.
为了保持原来的输出(期望值),我们需要将输出除以keep_prob
(这里是0.6
)。
另一种看待它的方式可能是:
TL;DR:尽管由于 dropout,我们的神经元变少了,但我们希望神经元对输出的贡献与我们拥有所有神经元时的贡献相同。
dropout = 0.20
,我们“关闭了 20% 的神经元”,这也等同于“保留了 80% 的神经元”。
假设神经元的数量是x
。 “保留80%”具体是0.8 * x
。将 x
再次除以 keep_prob
有助于“缩小”到原始值,即 x/0.8
:
x = 0.8 * x # x is 80% of what it used to be
x = x/0.8 # x is scaled back up to its original value
现在,反相的目的是确保Z值不会受到W减少的影响。(Cousera)。
当我们将 a3
缩小 keep_prob
时,我们无意中也缩小了 z4
的值(因为 z4 = W4 * a3 + b4
)。为了补偿这种缩放,我们需要将它除以 keep_prob
,以将其放大。 (Whosebug)
# keep 80% of the neurons
keep_prob = 0.8
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3, d3)
# Scale it back up
a3 = a3 / keep_prob
# this way z4 is not affected
z4 = W4 * a3 + b4
如果不缩放会怎样?
With scaling:
-------------
Cost after iteration 0: 0.6543912405149825
Cost after iteration 10000: 0.061016986574905605
Cost after iteration 20000: 0.060582435798513114
On the train set:
Accuracy: 0.9289099526066351
On the test set:
Accuracy: 0.95
Without scaling:
-------------
Cost after iteration 0: 0.6634619861891963
Cost after iteration 10000: 0.05040089794130624
Cost after iteration 20000: 0.049722351029060516
On the train set:
Accuracy: 0.933649289099526
On the test set:
Accuracy: 0.95
虽然这只是一个数据集的单个示例,但我不确定它是否对浅层神经网络产生重大影响。也许它更适合更深层次的架构。