我正在训练内置的 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 的权重矩阵和偏置向量中的随机行归零,然后在更新步骤之后返回它们之前的值是否等效?(这会在层之间施加与步骤之间相同的丢失,即完全删除整个小批量的一些神经元,我不确定这样做是否“正确”)。