Добавление отсева между временными шагами в Ptorch RNN - PullRequest
0 голосов
/ 20 июня 2019

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

Мои вопросы:

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

  2. Доступен ли интерфейс, подобный тому, который я хочу?

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

...