如何理解SpatialDropout1D以及何时使用它?

46

偶尔我会看到一些模型使用 SpatialDropout1D 而不是 Dropout。例如,在词性标注神经网络中,他们使用:

model = Sequential()
model.add(Embedding(s_vocabsize, EMBED_SIZE,
                    input_length=MAX_SEQLEN))
model.add(SpatialDropout1D(0.2)) ##This
model.add(GRU(HIDDEN_SIZE, dropout=0.2, recurrent_dropout=0.2))
model.add(RepeatVector(MAX_SEQLEN))
model.add(GRU(HIDDEN_SIZE, return_sequences=True))
model.add(TimeDistributed(Dense(t_vocabsize)))
model.add(Activation("softmax"))

根据Keras文档,它说:

此版本执行与Dropout相同的功能,但丢弃整个1D特征映射而不是单个元素。

然而,我无法理解整个1D特征映射的含义。更具体地说,我无法在quora中解释的相同模型中可视化SpatialDropout1D。有人能否通过使用与quora中相同的模型来解释这个概念?

此外,在什么情况下我们会使用SpatialDropout1D而不是Dropout

2个回答

53

为了简单起见,我首先要指出所谓的特征图(1D,2D等)就是我们常规的通道。让我们看一些例子:

  1. Dropout():假设有一个2D输入:[[1, 1, 1],[2, 2, 2]]。Dropout会独立考虑每个元素,并可能得到类似[[1, 0, 1],[0, 2, 2]]的结果。

  2. SpatialDropout1D():在这种情况下,结果将类似于[[1, 0, 1],[2, 0, 2]]。请注意,第二个元素被在所有通道中清零。


37

噪声形状

要理解SpatialDropout1D,您需要习惯于“噪声形状”概念。在普通的dropout中,每个元素都是独立保留或丢弃的。例如,如果张量是[2, 2, 2],则根据随机抛硬币(具有一定的“正面”概率),可以将其中的8个元素中的任意数量变成零;总共会有8次独立的抛硬币,并且任何数量的值都可能变为零,从08

有时需要做更多的事情。例如,可能需要沿着0轴删除整个切片。这种情况下的noise_shape[1, 2, 2],dropout仅涉及4个独立的随机抛硬币。第一个组件将一起保留或一起丢弃。零元素的数量可以是02468。它不能是15

另一种看待这个问题的方法是将输入张量实际上视为[2, 2],但每个值都是双精度(或多精度)。该层不是丢弃中间的字节,而是丢弃完整的多字节值。

它有什么用处?

上面的例子仅是为了说明,并不常见于实际应用中。更现实的例子是: shape(x) = [k, l, m, n]noise_shape = [k, 1, 1, n]。在这种情况下,每个批次和通道组件将被独立地保留,但每行和每列将被一起保留或不保留。换句话说,整个 [l, m] 特征图将被保留或丢弃。
您可能希望这样做以考虑相邻像素的相关性,特别是在早期的卷积层中。有效地,您想要防止像素与其邻居在特征图上共同适应,并使它们学习,就好像不存在其他特征图一样。这正是 SpatialDropout2D 所做的事情:它促进了特征图之间的独立性。 SpatialDropout1D 非常类似:给定 shape(x) = [k, l, m],它使用 noise_shape = [k, 1, m] 并丢弃整个一维特征图。
参考文献:Jonathan Tompson等人的Efficient Object Localization Using Convolutional Networks

根据代码,[k,1,1,n] 似乎是在删除某些样本和某些通道,而不触及任何空间维度。 - Daniel Möller
1
好的...我想我的问题在于文本解释...当我读到“独立保留”时,我认为它意味着“无论如何都不会被丢弃”,但实际上它可能意味着“可以与其他轴独立丢弃”。 - Daniel Möller
@DanielMöller 是的,我的理解也是一样的,并且我在我的回答中用一个例子来说明它。 - Maxim
@Maxim 当您解释SpatialDropout1D时,您是否假设输入张量仍为(2,2,2),噪声形状为(1,2,2)? 如果是这样,我认为零元素的数量可以是02468。 而不能是1357。 我理解正确吗? - Raven Cheuk
@Maxim 我看到这个答案有点晚了。看起来我们也可以在正常的Dropout层中使用自定义噪声形状。所以,假设我的输入张量的形状为10, 8, 5,并且我使用一个噪声形状为10, 8, 1的正常Dropout层,那么这是否会给我与使用SpatialDropout1D相同的输出? - Asif Iqbal
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接