Добавление отсева между временными шагами в 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 параметр, но это для выпадения между слоями, а не между временными шагами, и поэтому не то, что я хочу).

Мои вопросы:

  1. Правильно ли я понимаю, что бросил Гал?

  2. Интерфейс похож на тот, который мне нужен?

  3. Если нет, то просто реализую некоторые drop_neurons(rnn), return_dropped(rnn) функции, которые обнуляют случайные строки в весовых матрицах и векторах смещения, а затем возвращают свои предыдущие значения после шага обновления, эквивалентны? (Это приводит к тому же выпадению между слоями, что и между шагами, то есть полностью удаляет некоторые нейроны для всей мини-партии, и я не уверен, что делать это "правильно").

0 ответов

Другие вопросы по тегам