ChatGPT, Claude와 같은 LLM은 사실 문장을 만들지 않는다.
LLM은 LLM이 알고 있는 각 단어(토큰)가 지금까지 주어진 입력 텍스트 다음에 올 확률을 반환한다. 예를 들어 LLM이 알고 있는 단어가 [새빨간, 거짓말, 사과, 무언가, 나]밖에 없다면, LLM에 '새빨간'을 입력해 우리가 얻는 결과물은 '새빨간' 뒤에 '새빨간'이 올 확률은 0.1%, '거짓말'이 올 확률은 75%, '사과'가 올 확률은 24%, '무언가'가 올 확률은 0.7%, '나'가 올 확률은 0.2%라는 사실이다.
이러한 확률분포에서 적절한 단어를 골라가며 문장을 완성하는 과정을 '디코딩(Decoding)'이라고 한다.
디코딩 방법도 여러 가지가 있는데, 안전하게 가장 높은 확률의 단어만 선택하는 '그리디(Greedy)' 방식과 확률분포를 활용하는 '샘플링(Sampling)' 방식이 있다. 샘플링은 말 그대로 75%의 확률로 '거짓말'을, 24%의 확률로 '사과'를, 0.7%의 확률로 '무언가'를, 0.2%의 확률로 '나'를, 0.1%의 확률로 '새빨간'을 선택한다는 의미다. 항상 확률이 가장 높은 '거짓말'을 선택하는 그리디 방식과 달리, 샘플링 방식을 사용하면 확률은 매우 낮지만 '사과'나 '무언가'나 '나'나 '새빨간'이 선택될 가능성이 있긴 있다. (실제로는 확률이 지나치게 낮은 단어가 선택되는 것을 방지하기 위해 확률이 가장 높은 k개의 단어로 한정하거나, 확률이 p 이상인 단어로 한정해서 샘플링한다.)
이왕이면 똑똑한 LLM이 가장 추천하는 다음 단어만 골라서 문장을 만드는 게 가장 좋지 않을까? 하지만 일반적으로 그리디 방식은 샘플링 방식보다 성능이 안 좋다. 샘플링 방식이 좀 더 다양하고 유연한 결과물을 만들어낼 수 있기 때문이다. LLM은 구조상 한 번에 하나의 확률분포만 반환할 수 있다. 아직 생성하지 않은 미래의 확률분포를 훔쳐보며 최적의 확률분포로 다듬을 수 없다는 것이다. 그래서 당장은 '새빨간' 뒤에 올 단어로 '거짓말'이 가장 그럴듯해 보여도, 문장을 더 이어나가다 보면 '사과'가 더 어울리는 단어일 수 있다. 그런데 그리디 방식은 무조건 '거짓말'만 생성하니, 오히려 불리하다.
우리도 아직 일어나지 않은 미래를 훔쳐보며 최적의 선택을 내릴 수 없는데, 그렇기 때문에 (지금 보기에) 최적의 선택을 따르지 못했다고 슬퍼할 필요도 없는 것 같다. 지금의 내가 보기에 최적의 학교에 입학하지 못했다거나, 지금의 내가 보기에 최적의 야식 메뉴를 선택하지 못했다고 해서 꼭 나쁜 선택을 한 건 아니다. 별로라고 생각했던 학교에서 평생을 함께할 친구를 만날 수도 있고, 별로라고 생각했던 야식 메뉴가 오늘따라 너무 맛있을 수도 있다.
최고의 선택만 하는 것보다 중요한 건 다양한 선택을 하는 것이다.
LLM은 최적이 아닌 단어들을 모아 최고의 문장을 만든다. 아마 우리도 그렇다!
Thumbnail Image by Riho Kroll on Unsplash