목차
AI로 일상 대화를 요약하는 등 자연어 처리(NLP) 프로젝트를 진행하다 보면, 모델을 파인튜닝하는 과정에서 num_beams
라는 파라미터를 마주치게 됩니다. 이 값을 조절하면 결과물의 품질이 달라진다고 하는데, 과연 어떤 원리일까요? 이 글에서는 NLP가 아직 낯선 분들도 쉽게 이해하실 수 있도록, 텍스트 생성의 핵심 기술인 빔 서치(Beam Search)가 무엇이며, num_beams=4
설정이 내부적으로 어떻게 동작하는지 함께 분석해 보겠습니다.
1. 가장 간단한 방식: 그리디 서치 (Greedy Search)
빔 서치를 이해하려면 먼저 가장 기본적이고 직관적인 텍스트 생성 방식인 그리디 서치(Greedy Search)를 알아야 합니다.
그리디 서치는 각 단계에서 가장 확률이 높은 단어 하나만을 선택해 문장을 이어 나가는 방식입니다. 눈앞의 가장 좋아 보이는 길만 따라가는 것과 같죠. 이 방식은 매우 빠르고 간단하지만, 처음에 잘못된 단어를 선택하면 나중에 어색하거나 의미가 맞지 않는 문장으로 이어질 위험이 큽니다.
예를 들어, 장기적으로는 "The cat"으로 시작하는 것이 최적의 문장일 수 있는데도, 첫 단어로 "A"가 아주 약간 더 높은 확률을 가졌다는 이유만으로 "A"를 선택하면 뒤따르는 문장 전체의 품질이 저하될 수 있습니다.
그리디 서치는 빔 서치에서 num_beams=1
로 설정한 것과 기술적으로 동일합니다. 즉, 각 단계에서 고려할 후보 문장(beam)의 개수가 단 하나인 셈입니다.
2. 더 나은 문장을 위한 탐색: 빔 서치 (Beam Search)
빔 서치는 그리디 서치의 단점을 보완하는 기법입니다. 한 번에 하나의 최선책만 보는 대신, 지정된 개수(num_beams
)만큼의 가능성 있는 후보 문장들을 동시에 고려하며 탐색을 진행합니다.
num_beams=4
는 모델이 텍스트를 생성하는 매 단계마다 가장 확률이 높은 후보 시퀀스 4개를 계속 유지하라는 의미입니다. 이 방식은 초반의 선택이 다소 불리해 보여도, 장기적으로 더 나은 문장이 될 가능성을 열어두어 최종적으로 더 자연스럽고 일관된 문장을 만들어 냅니다.
빔 서치(num_beams=4
)의 단계별 동작 과정
그렇다면 num_beams=4
는 실제로 어떻게 문장을 만들어낼까요? 고양이에 대한 대화를 요약하는 상황을 가정하고, 모델의 내부 동작을 단계별로 살펴보겠습니다.
Tip: num_beams와 같은 파라미터는 yaml 파일으로 관리하면 쉽게 편집 할 수 있습니다.
1단계: 첫 단어 생성
모델은 문장을 시작할 때, 가장 확률 높은 단어 하나만 선택하는 대신 가장 유력한 후보 4개를 모두 유지합니다. 이 4개의 후보가 바로 우리의 "빔(beam)"이 됩니다.
# 모델이 첫 단어 생성을 시작하고 상위 4개의 후보(빔)를 유지합니다.
# 점수(Score)는 로그 확률값이며, 0에 가까울수록 확률이 높다는 의미입니다.
+--> "The" (Score: -0.2) # 빔 1
|
------+--> "A" (Score: -0.5) # 빔 2
|
+--> "He" (Score: -0.8) # 빔 3
|
+--> "She" (Score: -0.9) # 빔 4
추천 영상
2단계: 두 번째 단어 생성 및 가지치기(Pruning)
다음으로, 모델은 4개의 각 빔에 대해 다음 단어를 예측합니다. 이렇게 생성된 모든 조합(4xN개)의 누적 점수를 다시 계산한 후, 전체 중에서 가장 점수가 높은 상위 4개의 시퀀스만 남기고 나머지는 버립니다. 이 과정을 통해 "He", "She"처럼 가능성이 낮아진 빔은 자연스럽게 버려지고, 더 유망한 두 단어 조합이 새로운 빔이 됩니다.
# 각 빔에서 파생될 수 있는 모든 경우의 수를 평가하고...
"The" -> "The cat" (Score: -0.4)
\-> "The dog" (Score: -0.7)
"A" -> "A cat" (Score: -0.6)
\-> "A man" (Score: -0.8)
"He" -> "He saw" (Score: -1.1)
\-> "He ran" (Score: -1.2)
"She" -> "She was" (Score: -1.3)
\-> "She sat" (Score: -1.4)
# ...전체 조합 중 가장 좋은 4개의 시퀀스만 다음 단계를 위해 남깁니다.
+--> "The cat" (Score: -0.4) # 새로운 빔 1
|
... --+--> "A cat" (Score: -0.6) # 새로운 빔 2
|
+--> "The dog" (Score: -0.7) # 새로운 빔 3
|
+--> "A man" (Score: -0.8) # 새로운 빔 4
예시
설명: 빔 서치를 통해서 생성할 수 있는 결과 입니다(predictions 참고). 얼핏 보면 약간 이해가 되는 말 같이 보일 수도 있지만 사실 일상 대화 요약을 비극하게 실패한 장면 입니다. 길이 조절과 내용 요약 방법은 다른 파라미터에 달려 있습습니다.
3단계: 과정 반복 및 최종 선택
이처럼 빔을 확장하고 점수가 낮은 빔을 잘라내는(pruning) 과정은 문장이 끝을 의미하는 토큰을 만나거나 최대 길이에 도달할 때까지 반복됩니다. 모든 생성이 끝나면, 최종 후보 빔들 중에서 가장 높은 점수를 받은 시퀀스 하나가 최종 결과물로 선택됩니다.
# ...몇 단계를 더 거친 후, 최종 후보 빔들이 다음과 같다고 가정해 봅시다.
+--> "The cat slept on the mat." (Final Score: -0.8)
|
... --+--> "A cat was sleeping soundly." (Final Score: -0.9)
|
+--> "The dog played with the toy." (Final Score: -1.1)
|
+--> "A man walked down the street." (Final Score: -1.3)
모델은 가장 높은 점수를 받은 "The cat slept on the mat."을 최종 요약문으로 선택합니다.
3. 빔 서치와 다른 생성 전략들
빔 서치는 여러 텍스트 생성(디코딩) 전략 중 하나이며, 크게 결정론적 방식과 확률적 방식으로 나뉩니다.
- 결정론적 방식 (Deterministic Methods)
동일한 입력값에 대해 언제나 똑같은 결과를 출력합니다.- 그리디 서치 (Greedy Search): 가장 단순한 결정론적 방식으로, 실질적으로 빔 서치에서
num_beams=1
로 설정한 것과 같습니다. - 빔 서치 (Beam Search):
num_beams
를 1보다 큰 값으로 설정하여 여러 후보를 동시에 탐색하는, 더 발전된 결정론적 방식입니다.
- 그리디 서치 (Greedy Search): 가장 단순한 결정론적 방식으로, 실질적으로 빔 서치에서
적용 예시
- 확률적 방식 (Stochastic/Sampling Methods)
생성 과정에 무작위성을 도입하여 매번 다른 결과를 생성할 수 있으며, 주로 빔 서치의 대안으로 사용됩니다. 이 때문에 많은 프로젝트 설정에서 빔 서치를 활성화하면 샘플링 옵션(do_sample: false
)은 비활성화하는 것을 볼 수 있습니다.- Top-k 샘플링: 가장 확률이 높은
k
개의 단어 중에서 무작위로 다음 단어를 선택합니다. - Top-p (Nucleus) 샘플링: 확률의 총합이
p
를 넘는 가장 작은 단어 집합 내에서 무작위로 다음 단어를 선택합니다.
- Top-k 샘플링: 가장 확률이 높은
적용 예시
4. 결론
빔 서치(Beam Search)는 단순히 매 순간의 최선이 아닌, 종합적으로 더 완성도 높은 결과물을 찾아 나서는 탐색 기법입니다.
그리디 서치의 근시안적인 단점을 보완하기 위해 여러 개의 유력한 후보(빔)를 유지하고, 가능성이 낮은 경로는 과감히 버리면서 계산 효율성과 결과물의 품질 사이에서 균형을 맞춥니다. 이러한 특성 덕분에 빔 서치는 기계 번역, 텍스트 요약 등 일관되고 자연스러운 문장 생성이 중요한 여러 NLP 작업에서 기본적이면서도 가장 강력한 도구 중 하나로 사용되고 있습니다.