brunch

You can make anything
by writing

C.S.Lewis

by 여운 Mar 10. 2024

ChatGPT는 어떻게 여러 개의 답변을 준비할까?

큰 그림 그리는 디코딩 방법, Beam Search


ChatGPT는 하나의 입력(프롬프트)에 대한 답변을 여러 개 생성해 줄 수 있다. ChatGPT API에선 생성할 답변의 개수를 n으로 지정하면 된다. 

https://platform.openai.com/docs/api-reference/chat/create#chat-create-n

익히 들었다시피 ChatGPT는 주어진 입력을 참고하여 그다음에 올 만한 가장 그럴듯한 단어를 예측하는 모델이다. 그런데 가장 그럴듯한 단어만 예측하다 보면 1개의 답변만 생성할 수 있는 게 아닌가?


이 의문에 대한 답을 알려면 ChatGPT를 비롯한 모든 LLM의 디코딩 방법을 알아야 한다. 입력문 또는 프롬프트를 넣었을 때 LLM이 반환하는 순수한 출력물은 사실 어떤 단어가 아니라 무수한 숫자들이다. 이를 'logits'이라고 부른다. 이 숫자들의 개수는 LLM이 알고 있는 모든 단어들의 개수와 일치하는데, 입력문 다음에 각 단어가 나올 만한 점수로 해석할 수 있다. 이러한 'logits'을 확률로 변환한 뒤 실제 단어를 선택해 문장을 생성해 나가는 과정을 '디코딩(Decoding)'이라고 한다. 


가장 쉽게 생각할 수 있는 디코딩 방법은 Greedy Search 방식이다. 계속해서 그 순간 가장 확률이 높은 단어만 선택하는 것이다. 

아래 그림에서 보면 앞의 문맥이 "The"까지만 주어졌을 때 그다음에 "dog"가 올 확률은 0.4, "nice"가 올 확률은 0.5, "car"가 올 확률은 0.1이다. 따라서 확률이 가장 높은 "nice"라는 단어를 선택한다. 그러면 다음 문맥은 "The nice"가 되고, "The nice" 뒤에 "woman"이 올 확률은 0.4, "house"가 올 확률은 0.3, "guy"가 올 확률은 0.3이다. 이번에도 확률이 가장 높은 "woman"이라는 단어를 선택한다. 이후 문장의 끝을 의미하는 <end_of_sentence> 토큰이 생성될 때까지 이 과정을 반복한다.  



하지만 Greedy Search에는 아쉬운 점이 있다. 당장 눈앞의 확률만 고려하기 때문에 문장을 다 생성하고 나서 따져보면, Greedy Search 방식으로 생성한 문장이 가장 그럴듯한 문장이 아닐 수 있다는 것이다. 위의 그림에서 "The nice woman"이라는 구는 0.5 * 0.4 = 0.2의 확률을 가지지만, "The dog has"라는 구는 0.4 * 0.9 = 0.36의 확률을 가진다. 

이를 보완한 방식이 Beam Search이다. Beam Search는 디코딩 시작 전에 미리 정해둔 beam의 개수만큼의 후보를 기억해 둔다. 아래 그림에선 0.5의 확률을 갖는 "The nice" 뿐만 아니라, 0.4의 확률을 가져 2인자로 전락한 "The dog"까지 기억해 둔다. 그다음 "The nice"와 "The dog" 각각을 이어서 생성한다. "The nice"를 이어서 생성하니 0.5 * 0.4 = 0.2의 확률로 "The nice woman"이 생성되었고, "The dog"를 이어서 생성하니 0.4 * 0.9 = 0.36의 확률로 "The dog has"가 생성되었다. 만약 여기서 디코딩 과정이 중단된다면 후보 2개 중 전체 확률이 가장 높은 "The dog has"가 최종 결과로 선택된다. 



따라서 이 beam의 개수를 몇 개로 설정하느냐에 따라 다양한 답변을 생성할 수 있다. beam 개수가 10개라면 모델이 10개의 후보 문장을 가지고 있는 것이다. 따라서 ChatGPT에게 10개의 답변을 요구하면 (뒤로 갈수록 덜 그럴듯한 문장이긴 하겠지만) 10개의 답변을 내놓을 수 있게 된다. 




참고 

 https://huggingface.co/blog/how-to-generate

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari