Языковые модели могут рассчитать вероятность того, что любое заданное слово в их словаре будет стоять после входной последовательности. Но как они выбирают, какой из них на самом деле выводить?

На высоком уровне современные языковые модели работают так: вы вводите последовательность слов, затем «сеть кодировщика» обрабатывает их одно за другим. Выход этой сети кодировщика затем передается в «сеть декодера», которая выводит последовательность слов. На каждом этапе сеть декодера может присваивать вероятность каждому слову в известном ей словаре. Но, учитывая вероятности, вам нужно дать модели стратегию выбора слов для вывода. Эта стратегия называется стратегией декодера.

Простейшей из них может быть жадная стратегия: на каждом шаге просто выводить наиболее вероятное слово.

Таким образом, в первом зеленом узле декодер RNN назначит вероятность каждому слову в своем словаре и просто выберет наиболее вероятное из них. Это прекрасная стратегия, и она имеет тенденцию давать согласованные результаты. Но если приложение представляет собой что-то вроде чат-бота, вы можете обнаружить, что разговор получается довольно скучным. Например:

Исходные данные: что вы думаете об этой книге?
Вывод жадной стратегии: да, все в порядке.
Лучший результат: Я нашел это супер интересным.

Простым вариантом жадного поиска является выборка из k лучших: выберите число k, возьмите k наиболее вероятных слов и их соответствующие вероятности. Затем нормализуйте вероятности и выберите их в соответствии с полученным распределением вероятностей. Таким образом, вместо того, чтобы просто брать наиболее вероятное слово на каждом шаге, вы выбираете из k наиболее вероятных слов, и вы выбираете, используя нормализованное распределение вероятностей этих слов. Например, если k=5 и нормализованные вероятности равны [0,45, 0,25, 0,2, 0,05, 0,05], тогда вы выберете наиболее вероятное слово в 45% случаев, второе наиболее вероятное слово в 25% случаев и т. д. это то, что делает GPT-J, альтернатива EleutherAI с открытым исходным кодом для GPT-3.

В идеале мы могли бы вычислить вероятность каждого отдельного возможного выходного предложения (последовательности слов). Это исчерпывающий поиск: если вы хотите получить результат из пяти слов, соберите вместе все возможные предложения из пяти слов, назначьте всем им вероятность и выберите наиболее вероятное. Проблема в том, что если в вашем словарном запасе есть N слов, вам нужно рассмотреть N⁵ возможных выходов. Типичное значение N равно 10000, так что это требует больших вычислительных ресурсов.

Один из способов использовать эту идею и сделать ее менее затратной с точки зрения вычислений — использовать поиск по лучу. Это объединяет идеи из всех вышеперечисленных стратегий. Выберите ширину балки B. На каждом этапе вывода: возьмите B наиболее вероятных слов, затем для каждой из этих B возможностей рассмотрите B наиболее вероятных следующих слов. Делайте это до тех пор, пока на выходе не будет желаемой длины. Затем вычислите вероятность каждого из этих возможных выходов (если мы выведем 3 слова, будет B³ возможностей) и выведите наиболее вероятный.

Подводя итоги:

  • Стратегии декодирования — это то, как языковые модели выбирают слова, которые они должны выводить, когда им известны вероятности.
  • популярные стратегии декодирования включают жадный поиск, выборку по топ-k и поиск по лучу.

Дополнительная литература: