Захват начальных образцов при использовании усеченного обратного распространения по времени (RNN / LSTM)

12

Скажем, я использую RNN / LSTM для анализа настроений, который является подходом «многие к одному» (см. Этот блог ). Сеть обучается по усеченному обратному распространению по времени (BPTT), где сеть разворачивается всего за 30 последних шагов, как обычно.

В моем случае каждый из моих текстовых разделов, которые я хочу классифицировать, намного длиннее, чем 30 развернутых шагов (~ 100 слов). Основываясь на моих знаниях, BPTT запускается только один раз для одного текстового раздела, то есть когда он прошел весь текстовый раздел и вычислил целевую двоичную классификацию , которая затем сравнивается с функцией потерь, чтобы найти ошибку.y

Тогда градиенты никогда не будут вычисляться относительно первых слов каждого текстового раздела. Как RNN / LSTM может по-прежнему корректировать свои веса, чтобы фиксировать определенные шаблоны, которые встречаются только в первых нескольких словах? Например, скажите, что все предложения, помеченные как начинаются с «Я люблю это», а все предложения, помеченные как начинаются с «Я ненавижу это». Как RNN / LSTM перехватывает это, когда он развернут только для последних 30 шагов, когда он достигает конца 100-шаговой длинной последовательности?п е г а т я v еpositivenegative

PIR
источник
обычно аббревиатурой является TBPTT для усеченного обратного распространения во времени.
Чарли Паркер

Ответы:

11

Это правда, что ограничение вашего распространения градиента до 30 временных шагов не позволит ему изучить все возможное в вашем наборе данных. Однако от вашего набора данных сильно зависит, помешает ли это тому, чтобы он узнал важные сведения о функциях вашей модели!

Ограничение градиента во время обучения больше похоже на ограничение окна, в котором ваша модель может с высокой степенью достоверности ассимилировать входные функции и скрытое состояние. Поскольку во время тестирования вы применяете свою модель ко всей последовательности ввода, она все равно сможет включать информацию обо всех функциях ввода в скрытое состояние. Возможно, он не знает точно, как сохранить эту информацию, пока он не сделает свой окончательный прогноз для предложения, но могут быть некоторые (предположительно более слабые) связи, которые он все же сможет установить.

Сначала подумайте над надуманным примером. Предположим, ваша сеть сгенерирует 1, если где-то на входе 1, и 0 в противном случае. Допустим, вы тренируете сеть на последовательности длиной 20 и ограничиваете затем градиент до 10 шагов. Если обучающий набор данных никогда не содержит 1 в последних 10 шагах ввода, то в сети возникнут проблемы с тестовыми входами любой конфигурации. Однако, если в обучающем наборе есть несколько примеров, например [1 0 0 ... 0 0 0], а другие, например, [0 0 0 ... 1 0 0], то сеть сможет определить «присутствие 1 "функция в любом месте на входе.

Вернемся к анализу настроений. Скажем, во время обучения ваша модель встречает длинное отрицательное предложение типа «Я ненавижу это, потому что ... вокруг и вокруг», например, с 50 словами в многоточии. Ограничивая распространение градиента 30 временными шагами, модель не будет связывать «Я ненавижу это, потому что» с выходной меткой, поэтому она не поймет «Я», «Ненависть» или «это» из этого тренинга. пример, Но он поднимет слова, которые находятся в пределах 30 временных шагов от конца предложения. Если ваш обучающий набор содержит другие примеры, которые содержат те же слова, возможно, наряду с «ненавистью», тогда у него есть шанс обнаружить связь между «ненавистью» и ярлыком отрицательного настроения. Также, если у вас есть короткие примеры тренировок, скажите: «Мы ненавидим это, потому что это ужасно!» тогда ваша модель сможет соединить функции «ненависть» и «это» с целевой меткой. Если вам достаточно этих обучающих примеров, то модель должна быть способна эффективно изучить связь.

Во время теста, скажем, вы представляете модель с другим длинным предложением типа «Я ненавижу это, потому что ... на геккона!» Ввод модели начнется с «Я ненавижу это», который в некоторой форме будет переведен в скрытое состояние модели. Это скрытое состояние используется, чтобы влиять на будущие скрытые состояния модели, поэтому даже если до конца предложения может быть 50 слов, скрытое состояние из этих начальных слов имеет теоретический шанс повлиять на вывод, даже если оно никогда не было натренированный на образцах, которые содержали такое большое расстояние между «я ненавижу это» и концом предложения.

lmjohns3
источник
0

@ Imjohns3 имеет право: если вы обрабатываете длинные последовательности (размер N) и ограничивает обратное распространение до последних K шагов, сеть не будет изучать шаблоны в начале.

Я работал с длинными текстами и использую подход, в котором я вычисляю потери и делаю обратное распространение после каждого K шагов. Давайте предположим, что моя последовательность имела N = 1000 токенов, мой процесс RNN сначала K = 100, затем я пытаюсь сделать прогнозирование (вычислить потери) и выполнить обратное распространение. Затем, сохраняя состояние RNN, тормозите цепь градиента (в pytorch-> detach) и начинайте еще k = 100 шагов.

Хороший пример этой техники вы можете найти здесь: https://github.com/ksopyla/pytorch_neural_networks/blob/master/RNN/lstm_imdb_tbptt.py

ksopyla
источник