在pytorch RNN的时间步骤之间添加删除

时间:2019-06-20 12:09:48

标签: pytorch recurrent-neural-network dropout timestep

我正在训练内置的pytorch rnn模块(例如torch.nn.LSTM),并希望在每个时间步之间添加每微型批次固定的丢失(如果我正确理解,则为Gal丢失)。

最简单的是,我可以展开网络并单批计算正向计算,如下所示:

dropout = get_fixed_dropout()
for sequence in batch:
    state = initial_state 
    for token in sequence:
        state, output = rnn(token,state)
        state, output = dropout(state, output)
        outputs.append(output)
    loss += loss(outputs,sequence)
loss.backward()
optimiser.step()

但是,假设python中的循环非常慢,我宁愿充分利用pytorch的能力,一次调用就完全处理一批几个序列(就像在rnn(batch,state)中进行常规正向计算一样)。

即,我希望这样的东西:

rnn_with_dropout = drop_neurons(rnn)
outputs, states = rnn_with_dropout(batch,initial_state)
loss = loss(outputs,batch)
loss.backward()
optimiser.step() 
rnn = return_dropped(rnn_with_dropout)

(注意:Pytorch的rnns确实有一个dropout参数,但它是用于层之间的丢失,而不是时间步之间的丢失,因此不是我想要的)。

我的问题是:

  1. 我什至正确地理解了Gal辍学吗?

  2. 像我想要的界面一样吗?

  3. 如果不是,是否只需实现一些drop_neurons(rnn), return_dropped(rnn)函数,该函数会将rnn的权重矩阵和偏差向量中的随机行置零,然后在更新步骤之后返回其先前的值,是否等效? (这在各步骤之间在各层之间施加了相同的缺失,即,完全去除了整个微型批处理中的一些神经元,我不确定这样做是否正确)。

0 个答案:

没有答案