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.
- Модель получает вход и стартует с одной начальной гипотезы.
- На каждом шаге она оценивает возможные следующие токены для каждой текущей гипотезы.
- Из всех расширений сохраняются только несколько лучших — размер этого набора и есть beam size.
- Если гипотеза породила
EOS, она считается завершённой и переносится в finished set. - Процесс продолжается до условия остановки, после чего выбирается последовательность с лучшей общей оценкой.
Шаг 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. В одном случае ищется лучшая последовательность токенов, в другом — похожие векторы в индексе.
Источники
- Generation strategies · Hugging Face Transformers
- Generation · Hugging Face Transformers
- transformers/src/transformers/generation/utils.py at main · huggingface/transformers
- Releases · huggingface/transformers
- Attention Is All You Need
- Sequence to Sequence Learning with Neural Networks
- Beam Search Strategies for Neural Machine Translation
Актуальность этой подборки: по 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, поэтому выгодность нужно проверять на практике.