Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

9.8 Лучевой поиск

В разделе 9.7 мы предсказывали выходную последовательность поэлементно, пока не появится специальный токен конца последовательности <eos>. В этом разделе сначала рассмотрим стратегию жадного поиска (greedy search) и обсудим её проблемы, а затем сравним её с альтернативами: исчерпывающим поиском (exhaustive search) и лучевым поиском (beam search).

Прежде чем вводить жадный поиск, определим задачу поиска с помощью тех же математических обозначений, что и в разделе 9.7. На любом временном шаге вероятность выхода декодировщика зависит от выходной подпоследовательности до этого шага и от контекстной переменной , которая кодирует информацию о входной последовательности. Чтобы оценить вычислительные затраты, обозначим выходной словарь через , включив в него <eos>. Тогда мощность — это размер словаря. Максимальное число токенов в выходной последовательности обозначим через . Наша цель — найти наилучшую выходную последовательность среди всех возможных. Разумеется, всё, что идёт после <eos>, не относится к предложению и отбрасывается в итоговом выводе.

9.8.1 Жадный поиск

Начнём с простой стратегии — жадного поиска, которую мы уже использовали для предсказания последовательностей в разделе 9.7. На каждом временном шаге выходной последовательности жадный поиск выбирает из токен с наибольшей условной вероятностью:

Генерация завершается, когда в выходе появляется <eos> или когда достигнута максимальная длина .

Рис. 9.8.1. На каждом временном шаге жадный поиск выбирает токен с наибольшей условной вероятностью

Как показано на рис. 9.8.1, предположим, что в выходе есть четыре токена: «A», «B», «C» и <eos>. Четыре числа на каждом временном шаге — это условные вероятности генерации «A», «B», «C» и <eos> на этом шаге. На каждом шаге жадный поиск выбирает токен с наибольшей условной вероятностью. Поэтому на рис. 9.8.1 будет предсказана выходная последовательность «A», «B», «C» и <eos>. Условная вероятность этой последовательности равна .

В чём же проблема жадного поиска? На практике оптимальная последовательность (optimal sequence) — это та выходная последовательность, которая максимизирует произведение , то есть условную вероятность выхода при заданном входе. Однако жадный поиск не может гарантировать, что найдёт оптимальную последовательность.

Рис. 9.8.2. На временном шаге 2 выбран токен «C» со второй по величине условной вероятностью (а не с наибольшей)

Другой пример на рис. 9.8.2 иллюстрирует эту проблему. В отличие от рис. 9.8.1, на временном шаге мы выбираем токен «C» с второй по величине условной вероятностью. Поскольку выходная подпоследовательность на шагах 1 и 2 изменилась с «A» и «B» (рис. 9.8.1) на «A» и «C» (рис. 9.8.2), условные вероятности токенов на шаге 3 тоже меняются. Пусть на шаге 3 выбран токен «B». Тогда текущий шаг 4 зависит от выходной подпоследовательности «A», «C» и «B» из первых трёх шагов, а не от «A», «B» и «C», как на рис. 9.8.1. Поэтому условные вероятности генерации токенов на шаге 4 на рис. 9.8.2 тоже отличаются от рис. 9.8.1. В результате условная вероятность выходной последовательности «A», «C», «B» и <eos> на рис. 9.8.2 равна , и это больше, чем у последовательности жадного поиска на рис. 9.8.1. Этот пример показывает, что последовательность «A», «B», «C» и <eos>, найденная жадным поиском, не обязательно является наилучшей.

9.8.2 Исчерпывающий поиск

Если цель — получить оптимальную последовательность, можно использовать исчерпывающий поиск (exhaustive search): перебрать все возможные выходные последовательности и их условные вероятности, а затем выбрать ту, у которой условная вероятность наибольшая.

Хотя исчерпывающий поиск позволяет найти оптимальную последовательность, его вычислительная сложность может оказаться поразительно высокой. Например, при и нужно перебрать последовательностей — это огромное число, которое современные компьютеры практически не в состоянии обработать. Вычислительная сложность жадного поиска значительно меньше, чем у исчерпывающего поиска. Например, при и нужно оценить лишь последовательностей.

9.8.3 Лучевой поиск

Какую же стратегию поиска выбрать? Если важнее всего точность, очевидный выбор — исчерпывающий поиск. Если важнее всего вычислительные затраты, очевидный выбор — жадный поиск. Практическое применение лучевого поиска лежит между этими крайностями.

Лучевой поиск (beam search) — это улучшенная версия жадного поиска. У него есть гиперпараметр — ширина луча (beam size) . На временном шаге мы выбираем токенов с наибольшей условной вероятностью. Эти токенов станут первыми токенами кандидатных выходных последовательностей. На каждом последующем временном шаге, опираясь на кандидатных выходных последовательностей предыдущего шага, мы продолжаем выбирать из возможных продолжений кандидатных последовательностей с наибольшей условной вероятностью.

Рис. 9.8.3. Процесс лучевого поиска (ширина луча: 2, максимальная длина выходной последовательности: 3). Кандидатные выходные последовательности: , , , , и

На рис. 9.8.3 показан процесс лучевого поиска. Пусть выходной словарь содержит только пять элементов , один из которых — <eos>. Ширина луча равна , а максимальная длина выходной последовательности — . На временном шаге токены с наибольшей условной вероятностью — это и . На временном шаге для всех вычисляем:

Из этих десяти значений выбираем два наибольших, например и . Затем на временном шаге для всех вычисляем:

Из этих десяти значений выбираем два наибольших, а именно и , и получаем шесть кандидатных выходных последовательностей: (1) ; (2) ; (3) ; (4) ; (5) ; (6) .

Наконец, на основе этих шести последовательностей (например, отбросив <eos> и всё, что идёт после него) получаем окончательное множество кандидатных выходных последовательностей. Затем выбираем ту из них, у которой нормированное по длине логарифмическое правдоподобие максимально:

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

Вычислительная сложность лучевого поиска лежит между сложностями жадного и исчерпывающего поиска. Жадный поиск можно рассматривать как частный случай лучевого поиска с шириной луча . Выбирая ширину луча, можно найти компромисс между точностью и вычислительными затратами.

Резюме

  • Стратегии поиска последовательностей включают жадный поиск, исчерпывающий поиск и лучевой поиск.
  • Жадный поиск требует наименьших вычислений, но даёт относительно низкую точность.
  • Исчерпывающий поиск даёт наивысшую точность, но требует наибольших вычислений.
  • Лучевой поиск позволяет найти компромисс между точностью и вычислительными затратами, гибко выбирая ширину луча.

Упражнения

  1. Можно ли рассматривать исчерпывающий поиск как особый случай лучевого поиска? Почему?
  2. Примените лучевой поиск в задаче машинного перевода из раздела 9.7. Как ширина луча влияет на скорость предсказания и на результат?
  3. В разделе 8.5 мы генерировали текст с помощью языковой модели на основе заданного пользователем префикса. Какая стратегия поиска используется в этом примере? Можно ли её улучшить?

Обсуждение