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

How to understand SpatialDropout1D and when to use it?

偶尔我看到一些模型使用 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 的文档,它说:

This version performs the same function as Dropout, however it drops entire 1D feature maps instead of individual elements.

但是,我无法理解entrie 1D feature的含义。更具体地说,我无法在 quora 中解释的同一模型中可视化 SpatialDropout1D。 有人可以使用与 quora 中相同的模型来解释这个概念吗?

还有,什么情况下我们会用SpatialDropout1D代替Dropout

噪声形状

为了理解 SpatialDropout1D,您应该习惯 噪声形状 的概念。在普通的 vanilla dropout 中,每个元素都是独立保留或丢弃的。例如张量为[2, 2, 2],8个元素中的每一个都可以通过随机抛硬币(有一定的"heads"概率)归零;总共将有 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]。在这种情况下,每个批次和通道组件将独立保存,但每个行和列将保存或不保存在一起。换句话说,whole [l, m] feature map 将被保留或删除。

您可能想要这样做以解释相邻像素的相关性,尤其是在早期的卷积层中。实际上,您希望防止像素与其相邻特征图之间的像素共同适应,并让它们像不存在其他特征图一样学习。这正是 SpatialDropout2D 正在做的事情:它促进了特征图之间的独立性。

SpatialDropout1D 非常相似:给定 shape(x) = [k, l, m] 它使用 noise_shape = [k, 1, m] 并丢弃整个一维特征图。

参考:Efficient Object Localization Using Convolutional Networks 乔纳森·汤普森 (Jonathan Tompson) 在 al.

为了简单起见,我首先要说明的是,所谓的特征图(一维,二维等)是我们的常规渠道。让我们看例子:

  1. Dropout():让我们定义二维输入:[[1, 1, 1], [2, 2, 2]]。 Dropout 将独立考虑每个元素,并可能导致类似于 [[1, 0, 1], [0, 2, 2]]

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