我正在训练内置的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
参数,但它是用于层之间的丢失,而不是时间步之间的丢失,因此不是我想要的)。
我的问题是:
我什至正确地理解了Gal辍学吗?
像我想要的界面一样吗?
如果不是,是否只需实现一些drop_neurons(rnn), return_dropped(rnn)
函数,该函数会将rnn的权重矩阵和偏差向量中的随机行置零,然后在更新步骤之后返回其先前的值,是否等效? (这在各步骤之间在各层之间施加了相同的缺失,即,完全去除了整个微型批处理中的一些神经元,我不确定这样做是否正确)。