6

我正在从deeplearning.ai课程中学习神经网络中的正则化。在 dropout 正则化中,教授说如果应用了 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)?任何数字示例都会有所帮助。

4

2 回答 2

10

在花了一些时间了解倒置辍学后,我自己得到了答案。这是直觉:

我们以概率 保留任何层中的神经元keep_prob。比方说kepp_prob = 0.6。这意味着关闭任何层中 40% 的神经元。如果在关闭 40% 的神经元之前该层的原始输出是x,那么在应用 40% 的 dropout 之后,它将减少 0.4 * x. 所以现在将是x - 0.4x = 0.6x

为了保持原始输出(期望值),我们需要将输出除以keep_prob(或0.6此处)。

于 2019-07-27T08:58:03.323 回答
0

另一种看待它的方式可能是:

TL;DR:即使由于 dropout,我们的神经元更少,但我们希望神经元对输出的贡献量与我们拥有所有神经元时的输出量相同。

有了dropout = 0.20,我们“关闭了 20% 的神经元”,这也与“保留 80% 的神经元”相同。

假设神经元的数量是x。“保持80%”具体而言0.8 * xx再次除以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 )。

当我们按比例缩小时a3keep_prob我们无意中也缩小了z4(Since, z4 = W4 * a3 + b4) 的值。为了补偿这种缩放,我们需要将其除以keep_prob, 以将其放大。(堆栈溢出

# 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

尽管这只是一个具有一个数据集的示例,但我不确定它是否会对浅层神经网络产生重大影响。也许它更多地与更深层次的架构有关。

于 2020-07-23T05:55:40.423 回答