Я обучаю встроенные модули 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)
(примечание: у rnns Pytorch есть параметр dropout
, но это для пропадания между слоями, а не между временемшаги, и так не то, что я хочу).
Мои вопросы:
Правильно ли я понимаю отсев Гала?
Доступен ли интерфейс, подобный тому, который я хочу?
Если нет, то просто реализовал бы некоторые функции drop_neurons(rnn), return_dropped(rnn)
, которые обнуляют случайные строки в весовых матрицах и векторах смещения, а затем возвращаютих предыдущие значения после шага обновления будут эквивалентны?(Это приводит к тому же выпадению между слоями, что и между ступенями, то есть полностью удаляет некоторые нейроны для всей мини-партии, и я не уверен, что это 'правильно').