The Importance of Generation Order in Language Modeling

Nicolas Ford, Daniel Duckworth, Mohammad Norouzi, George E. Dahl

Google Brain, 2018



#nlp #nlg #nonautoregressive #transformer



Статья: https://arxiv.org/abs/1808.07910



Основная часть NLG моделей авторегрессионна, т.е. они пишут текст слева направо, по одному токену за итерацию. Как можно отойти от такой схемы? Авторы придумали использовать двухпроходный алгоритм — общий словарь можно разделить на две части, а затем обучить две независимые трансформерные модели: первая генерирует текст только из токенов первой части словаря + специального placeholder-токена, затем вторая модель получает этот текст с плейсхолдерами на вход и заполняет пропуски словами из второго словаря. Работа описывает различные стратегии разбиения словаря на две части и сравнения их эффективности.



Какие стратегии рассматривались?

* Common First (частотные в первом проходе) / Rare First (редкие в первом проходе) -- разбиение словаря токенов по частоте в корпусе, отсечка выбиралась так, чтобы матожидание числа "частых" и "редких" в предложении было примерно одинаковым.

* Function First (сначала функциональные) and Content First (сначала содержательные) -- разбивали по роли слова, в функциональные попали также предлоги, союзы, модальные глаголы, вопросительные слова и прочее. Омонимию по роли разрешали просто выбирая наиболее частотную роль слова в корпусе (согласно Parsey McParseface).

* Odd First -- контрольный вариант, где в первую половину словаря попали токены с нечётными индексами (по эффекту это должно быть экививалентно равномерно случайному разбиению)



Эксперименты гоняли на датасете LM1B, lowercase, со общим словарём в 64К токенов, только целые слова, без subword tokens. В качестве бейзлайна использовали просто Transformer без энкодера, т.е. простую LM. В качестве “enhanced baseline” его же, но по числу параметров подогнанного до размера анализируемых архитектур. Сравнивали модели по perplexity.



Человеческая интуиция подсказывает, что разумнее сначала передать главную мысль, записать ключевые смысловые слова, а затем уже вокруг них выстраивать предложение (многие люди так делают конспекты и быстрые записки в блокнотах). Здесь, однако, вышло, что наиболее эффективно писать сначала все служебные слова, т.е. фиксировать структуру предложения, а потом уже заполнять её смыслом. Хуже всех при этом отработал Odd First, он оказался заметно слабее всех остальных, это, в целом, показывает, что сама генерация в два прохода — задача существенно более сложная, чем обычная генерация. Вероятно, поэтому ни один из двухпроходных вариантов не смог обойти “enhanced baseline” (хотя Function First почти сравнялся с ним). Другая возможная причина — из требований равенства параметров в моделях каждая из трансформер-сетей в двухпроходной архитектуре заметно меньше чем трансформер в “enhanced baseline”, и качество может падать из-за недостаточного размера.



Обсуждая причины победы Function First над остальными вариантами авторы формулируют две мысли:

* для написания корректного правдоподобного предложения проще сначала задать его синтаксическую структуру, а потом уже заполнять её смыслом

* выгоднее до последнего избегать генерации редких токенов, потому что последующая за ними генерация будет обусловлена маловероятным контекстом (поэтому, кстати, на втором месте после Function First стоит Common First)



Я бы добавил третью мысль — у второй сетки нет возможности вставлять столько слов, сколько ей надо, каждый плейсхолдер она может заполнять только одним словом. Поэтому сценарий "накидать ключевые смыслом слова, а потом выписать вокруг них структуру" тут просто не реализуем в чистом виде.