В чем разница между обучением RNN для предсказания последнего слова данной последовательности и предсказанием сдвига всей последовательности в PyTorch?

Допустим, я пытаюсь обучить языковую модель RNN в PyTorch. Предположим, я перебираю пакеты последовательностей слов и каждый тензор обучающего пакета имеет следующую форму:

data.shape = [batch_size, sequence_length, vocab_dim]

Мой вопрос: в чем разница между использованием только последнего слова в каждой последовательности в качестве целевой метки:

X = data[:,:-1]
y = data[:,-1]

и обучение, чтобы минимизировать потери, используя предсказание softmax последнего слова,

vs установка цели, чтобы вся последовательность была сдвинута вправо:

X = data[:,:-1]
y = data[:,1:]

и обучение, чтобы минимизировать сумму потерь каждого предсказанного слова в сдвинутой последовательности?

Какой здесь правильный подход? Мне кажется, я видел оба примера в Интернете. Связано ли это с развертыванием цикла и BPTT?


person user1500142    schedule 08.06.2020    source источник


Ответы (1)


Рассмотрим задачу прогнозирования последовательности a b c d, в которой вы хотите обучить RNN с помощью принуждения учителя.

Если вы используете только последнее слово в предложении, вы решаете следующую задачу классификации (слева - входные данные; справа - выходные данные, которые вы должны предсказать):

a b c -> d

Для вашего второго подхода, где y установлено, что вся последовательность сдвинута вправо, вы решаете три задачи классификации:

a -> b
a b -> c
a b c -> d

Задача прогнозирования промежуточных слов в последовательности имеет решающее значение для обучения полезной RNN (в противном случае вы бы знали, как получить от c с учетом a b, но не знали бы, как действовать после всего лишь a ).

Аналогичным образом можно было бы определить ваши обучающие данные как полную последовательность a b c d, так и все неполные последовательности (a b, a b c). Тогда, если бы вы сделали только предсказание «последнего слова», как упоминалось ранее, вы бы получили тот же контроль, что и формулировка, где y - вся последовательность, сдвинутая вправо. Но это расточительно с точки зрения вычислений - вы не хотите повторно запускать RNN как на a b, так и на a b c (состояние, которое вы получаете от a b, можно повторно использовать для получения состояния после использования a b c).

Другими словами, цель выполнения «сдвига y вправо» состоит в том, чтобы разделить одну последовательность (a b c d) длины N на N - 1 независимых задач классификации вида: «заданные слова до времени t, предсказать слово t + 1», при этом необходимо всего один проход RNN вперед.

person jayelm    schedule 08.06.2020