COMRAD404 / GLOSSARY

Beam Search

Beam search

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

TL;DR

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

Beam search — это стратегия декодирования, при которой модель на каждом шаге держит не одно продолжение, а несколько наиболее сильных кандидатных последовательностей и расширяет их параллельно. По документации Hugging Face, в Transformers beam search включается, когда num_beams > 1; значение num_beams = 1 эквивалентно greedy search.

Практически это нужно, когда вы не хотите застревать в одном локально лучшем токене на каждом шаге. Beam search пытается выбрать не «лучший следующий токен прямо сейчас», а более сильную последовательность целиком после нескольких шагов расширения.

Английский термин: beam search. В текущих источниках единый русский перевод не фиксируется, поэтому ниже используется английская форма. В документации генерации рядом встречаются режимы beam-search decoding и beam-search multinomial sampling.

Простыми словами

Можно представить это как написание фразы по нескольким черновикам сразу. Жадный режим пишет одну версию и после каждого слова уже не оглядывается назад. Beam search ведёт несколько черновиков, а затем оставляет самый сильный из них по оценке модели.

Это всего лишь аналогия: реальная система не «понимает» фразу по-человечески, а сравнивает вероятностные продолжения токен за токеном. Но для интуиции аналогия полезна: beam search — это не один маршрут, а маленький набор маршрутов, которые конкурируют между собой.

Как это работает

Классическое описание в работе Sequence to Sequence Learning with Neural Networks задаёт left-to-right decoder, который хранит B частичных гипотез, а гипотезы с токеном конца последовательности EOS переносит в отдельный завершённый набор. В современной практике B обычно соответствует параметру num_beams.

  1. Модель получает вход и стартует с одной начальной гипотезы.
  2. На каждом шаге она оценивает возможные следующие токены для каждой текущей гипотезы.
  3. Из всех расширений сохраняются только несколько лучших — размер этого набора и есть beam size.
  4. Если гипотеза породила EOS, она считается завершённой и переносится в finished set.
  5. Процесс продолжается до условия остановки, после чего выбирается последовательность с лучшей общей оценкой.
Шаг 0: входной префикс
  └─ H0

Шаг 1: расширяем H0
  ├─ H1: токен A
  ├─ H2: токен B
  ├─ H3: токен C
  └─ ... оставляем top-B

Шаг 2: расширяем каждую из top-B гипотез
  ├─ H1a, H1b, H1c
  ├─ H2a, H2b, H2c
  └─ H3a, H3b, H3c
       ↓
     снова оставляем top-B

Шаг N:
  ├─ гипотезы с EOS → finished set
  └─ остальные гипотезы продолжают расширяться

Финал: выбирается последовательность с лучшей общей оценкой

В текущем справочнике Transformers для beam-based generation отдельно документированы early_stopping и length_penalty. Это важно на практике: beam search почти всегда обсуждают не сам по себе, а вместе с правилами остановки и сравнением коротких и длинных кандидатов.

Также текущая документация указывает, что prefix_allowed_tokens_fn может ограничивать beam search. Это уже не «чистый» поиск по всем доступным продолжениям, а поиск с разрешённым набором токенов на каждом шаге.

Для тех, кто смотрит в реализацию: текущий исходный код Transformers направляет режимы GenerationMode.BEAM_SEARCH и GenerationMode.BEAM_SAMPLE в внутренний beam-search path. Но это уже уровень реализации, и он чувствителен к версии библиотеки.

Где применяется

  • Оценка машинного перевода в Transformer. В работе Attention Is All You Need beam search используется в настройке оценки для перевода.
  • Классические seq2seq-декодеры. Работа 2014 года описывает left-to-right beam-search decoder с набором частичных и завершённых гипотез.
  • API генерации в Hugging Face. В generate() режим beam-search decoding соответствует num_beams > 1 и do_sample = false. Если num_beams > 1 и do_sample = true, документация описывает это как beam-search multinomial sampling.
  • Ограниченная генерация по допустимым префиксам. Когда нужно разрешать только определённые продолжения, можно подключать prefix_allowed_tokens_fn и тем самым ограничивать beam search.

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

Практический пример

Ниже — минимальный сценарий с текущими параметрами из справочника generate(). Он показывает именно механику включения beam search, а не «лучшие» значения для любой модели.

output_ids = model.generate(
    input_ids,
    num_beams=4,          # > 1 включает beam search
    do_sample=False,      # beam-search decoding по текущей документации
    early_stopping=True,  # один из beam-based controls
    length_penalty=0.8    # ещё один beam-based control
)

Как читать этот пример:

  • num_beams=4 говорит генератору держать несколько кандидатных продолжений одновременно.
  • do_sample=False оставляет вас в режиме beam-search decoding, а не в режиме beam-search multinomial sampling.
  • early_stopping и length_penalty — параметры, которые текущая документация относит к beam-based generation controls.

Если вам нужна ограниченная генерация, документация отдельно указывает на prefix_allowed_tokens_fn. Это удобно, когда выход должен следовать заданному префиксу или жёстким токеновым ограничениям.

Практический вывод: beam search имеет смысл включать, когда вы готовы обменять часть скорости на более широкий поиск по кандидатам. Универсального значения num_beams в источниках нет, поэтому подбирать его нужно на вашей задаче.

Чем отличается от других стратегий декодирования

Стратегия Что удерживает Как включается в текущих docs Когда уместна
Greedy search Только одно лучшее продолжение на каждом шаге num_beams = 1 Когда важна простота и минимальный поиск
Beam search Несколько лучших частичных гипотез num_beams > 1 и do_sample = false Когда нужно сравнивать несколько траекторий генерации
Beam-search multinomial sampling Несколько гипотез, но с sampling-компонентом num_beams > 1 и do_sample = true Когда нужен beam-based режим, но не строгое детерминированное расширение
Constrained beam search Несколько гипотез с ограничениями на допустимые токены Через prefix_allowed_tokens_fn Когда генерация должна соблюдать токеновые ограничения

Главное различие простое: greedy search идёт по одному пути, beam search — по нескольким, а constrained beam search добавляет правила, какие пути вообще можно рассматривать.

Ограничения и заблуждения

  • Заблуждение: «чем больше beams, тем всегда лучше». Работа Beam Search Strategies for Neural Machine Translation прямо обсуждает компромисс: увеличение beam size может улучшать результат, но замедляет decoding; поэтому появились и адаптивные стратегии, снижающие стоимость поиска.
  • Ограничение по скорости. Beam search дороже жадного режима, потому что расширяет и ранжирует несколько гипотез вместо одной.
  • Заблуждение: beam search и sampling — это одно и то же. Текущая документация разделяет beam-search decoding и beam-search multinomial sampling как разные режимы generate().
  • Ограничение по версии. В release notes Transformers v5.15.0 от 2026-08-10 есть исправления model-parallel beam-search bugs для семейств Qwen2-VL, Qwen2.5-VL и Qwen3-VL MoE. Это напоминание, что поведение beam search зависит не только от идеи алгоритма, но и от конкретной реализации.
  • Заблуждение: beam search сам по себе гарантирует «лучший» ответ для человека. Источники надёжно описывают механику поиска и ранжирования по оценкам модели, но не дают универсального обещания качества для любой задачи и любой модели.

Редакционное ограничение: часть кратких формулировок о beam search взята из versioned page Hugging Face v4.50.0, а часть — из текущего reference-раздела. По source pack их базовая семантика совпадает, но wording и детали интерфейса могут меняться между версиями.

Связанные термины и инструменты

В продакшене beam search почти всегда рассматривают вместе с model serving и batching, потому что размер пучка напрямую влияет на стоимость декодирования и задержку ответа.

В агентных сценариях полезно сопоставить его с ReAct: там важна структура шага «рассуждение + действие», а beam search остаётся всего лишь стратегией генерации токенов.

И ещё одна полезная граница: не путайте beam search с similarity search в векторных БД вроде Qdrant. В одном случае ищется лучшая последовательность токенов, в другом — похожие векторы в индексе.

Источники

Актуальность этой подборки: по source pack на 2026-08-15.

Вопросы и ответы

Что делает параметр num_beams?

В текущей документации Transformers значение num_beams > 1 включает beam search, а num_beams = 1 эквивалентно greedy search.

Beam search и sampling — одно и то же?

Нет. Текущий reference-раздел различает beam-search decoding при num_beams > 1 и do_sample = false, а также beam-search multinomial sampling при num_beams > 1 и do_sample = true.

Зачем нужны early_stopping и length_penalty?

Текущая документация относит их к beam-based controls. Они используются как параметры остановки и управления сравнением кандидатов по длине, но точную настройку стоит сверять с вашей версией документации и задачей.

Можно ли ограничить beam search допустимыми продолжениями?

Да. В текущем справочнике Transformers указано, что prefix_allowed_tokens_fn может ограничивать beam search.

Почему не стоит бездумно увеличивать beam size?

Потому что это увеличивает стоимость декодирования. Работа по стратегиям beam search для NMT отмечает, что больший beam size может улучшать результат, но также замедляет decoding, поэтому выгодность нужно проверять на практике.

Источники

SOURCES

Вопросы и ответы

FAQ
Что делает параметр num_beams?

В текущей документации Transformers значение num_beams > 1 включает beam search, а num_beams = 1 эквивалентно greedy search.

Beam search и sampling — одно и то же?

Нет. Reference-раздел различает beam-search decoding при num_beams > 1 и do_sample = false, а также beam-search multinomial sampling при num_beams > 1 и do_sample = true.

Зачем нужны early_stopping и length_penalty?

Текущая документация относит их к beam-based generation controls: это параметры остановки и управления сравнением кандидатов по длине.

Можно ли ограничить beam search допустимыми продолжениями?

Да. В текущем справочнике Transformers указано, что prefix_allowed_tokens_fn может ограничивать beam search.

Почему не стоит бездумно увеличивать beam size?

Работа по стратегиям beam search для NMT отмечает компромисс: больший beam size может улучшать результат, но также замедляет decoding.

Читайте также

LINKS