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