2

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

4

0 回答 0