Beam Search

Sigrid Jin
5 min readJun 1, 2024

--

vLLM 인퍼런스 시, 아래와 같은 에러가 발생할 수 있습니다.

"llm": {
"chat_engine": "vllm",
"model": "xionic-ko-llama-3–70b",
"endpoint": "http://sionic.chat:8001/v1",
"api_key": "934c4bbc-c384–4bea-af82–1450d7f8128d",
"n": 5,
"use_beam_search": true
},

위 설정에서 `n`은 생성할 문장의 개수를 나타내는 파라미터입니다. 그리고 `use_beam_search`는 beam search 알고리즘을 사용할 것인지를 결정하는 파라미터입니다.

`n`이 5로 설정되어 있다는 것은 5개의 문장을 생성하겠다는 의미입니다. 이때는 `use_beam_search`를 `true`로 설정해야 합니다. 왜냐하면 beam search는 여러 개의 가능한 문장을 동시에 고려하면서 문장을 생성하기 때문입니다. Beam search에서의 beam size는 일반적으로 5에서 10 사이의 값을 사용합니다. 따라서 `n`을 5로 설정한 경우, beam search를 사용하여 5개의 가능한 문장을 생성하는 것이 적절합니다.

반면에 `n`이 1로 설정되어 있다면, 오직 하나의 문장만 생성하겠다는 의미입니다. 이 경우에는 `use_beam_search`를 `false`로 설정해도 무방합니다. 왜냐하면 단 하나의 문장만 생성할 때는 greedy decoding을 사용해도 충분하기 때문입니다. Greedy decoding은 매 타임 스텝마다 가장 확률이 높은 단어를 선택하여 문장을 생성하는 방식으로, 한 번 선택한 단어에 대해서는 되돌아갈 수 없다는 단점이 있지만, 연산량이 적고 빠르다는 장점이 있습니다.

따라서 `n`의 값에 따라 `use_beam_search`의 값을 적절히 설정해야 합니다. `n`이 1보다 큰 경우에는 `use_beam_search`를 `true`로 설정하여 beam search를 사용하는 것이 좋습니다. 반면 `n`이 1인 경우에는 `use_beam_search`를 `false`로 설정하고 greedy decoding을 사용해도 충분할 것입니다.

vLLM 추론 시, 아래와 같은 에러가 발생할 수 있습니다.

**BadRequestError("Error code: 400 - {'object': 'error', 'message': 'best_of must be 1 when using greedy sampling.Got 5.', 'type': 'BadRequestError', 'param': None, 'code': 400}")**

이 에러는 OpenAI의 GPT-3 API를 사용할 때 발생하는 BadRequestError로, greedy sampling을 사용할 때 `best_of` 값이 반드시 1이어야 하는데, 현재 `best_of` 값이 5로 설정되어 있어서 발생한 에러입니다.

Greedy Decoding

Greedy decoding은 매 타임 스텝마다 가장 높은 확률을 가지는 단어 하나만을 선택하여 문장을 생성해 나가는 방식입니다. 이는 당시 상황에서의 최선의 선택을 하는 것과 유사하여 그리디 알고리즘과 비슷한 개념입니다.

하지만 greedy decoding은 한 번 선택한 단어에 대해서는 되돌아갈 수 없다는 단점이 있습니다. 즉, 이전에 선택한 단어가 최적이 아니었더라도, 이후의 단어 선택에 영향을 미칠 수 있습니다.

Exhaustive Search

이러한 greedy decoding의 단점을 보완하기 위해, joint probability를 사용하여 모든 가능한 단어 조합을 고려하는 exhaustive search 방식이 있습니다. 이 방식은 이전 단어의 확률이 낮더라도, 이후 단어들의 확률이 높으면 전체적인 문장의 확률이 높아질 수 있다는 점을 고려합니다.

하지만 exhaustive search는 모든 가능성을 고려하기 때문에 시간 복잡도가 매우 높다는 단점이 있습니다.

Beam Search

Greedy decoding과 exhaustive search의 중간 지점에 beam search가 있습니다. Beam search는 k개의 가능성을 동시에 고려하면서 문장을 생성해 나갑니다. 여기서 k는 beam size라고 하며, 일반적으로 5에서 10 사이의 값을 사용합니다.

Beam search에서는 각 타임 스텝마다 확률 값을 곱하는 대신, log를 사용하여 확률을 더해 나갑니다. 이렇게 하면 숫자가 너무 작아지는 것을 방지할 수 있습니다.

Beam search는 <’end’> 토큰을 만나면 해당 hypothesis를 종료합니다. 종료 조건으로는 미리 설정한 타임 스텝 T에 도달하거나, <’end’> 토큰이 n개 이상 나올 때까지 진행하는 방법이 있습니다.

최종적으로는 완성된 hypothesis 중에서 log probability가 가장 높은 문장을 선택합니다. 다만, 이 방식은 상대적으로 짧은 문장에 높은 스코어를 주는 경향이 있어, 이를 보정하기 위해 문장 길이로 나누어 정규화하기도 합니다.

Reference

https://velog.io/@bo-lim/Beam-Search

--

--