‘토큰’으로 썰어준다 LLM의 공부 비법 [인공지능 오디세이]

거대언어모델(LLM)은 난해한 글을 이해하고, 유려한 문장을 생성하는 놀라운 능력을 가지고 있다. LLM은 어떻게 복잡한 텍스트를 분석하고 사람이 쓴 것 같은 표현을 만들어낼까. 이번 편에서는 LLM이 텍스트를 분해하고 조합해 글을 창조해가는 과정을 알아보려고 한다.
LLM이 글을 이해하고 생성하는 최소 단위는 ‘토큰(token)’이다. 토큰화(tokenization)는 문장을 여러 개의 토큰으로 나누는 과정으로, 다양한 방식이 있다. 가장 간단하게는 단어(띄어쓰기 기준) 단위로 토큰화할 수 있다. 예컨대 “어제 학교에 갔다”라는 문장을 단어 단위로 토큰화하면 ‘어제’ ‘학교에’ ‘갔다’라는 결과가 나온다.
이 방법은 직관적이고 간단하지만, 어휘 집합(vocabulary)의 크기가 매우 커진다는 단점이 있다. 어휘 집합이란 LLM이 인식할 수 있는 토큰들의 모음이다. 단어 단위 토큰화를 수행하려면 ‘갔다’ 외에 ‘갔었다’ ‘갔었는데’와 같이 모든 활용형이 어휘 집합에 포함되어야 한다. 극단적으로는 어휘 집합 크기가 수백만 개가 되어도 어휘 집합에 포함되지 않는 단어(미등록 토큰)가 생길 수 있다.

문자 단위로 토큰화를 수행하는 방식도 있다. “어제 학교에 갔다”라는 문장을 문자 단위로 나누면 ‘어’ ‘제’ ‘(띄어쓰기)’ ‘학’ ‘교’ ‘에’ ‘(띄어쓰기)’ ‘갔’ ‘다’가 된다. 한글 LLM을 만든다고 하면 한글로 표현할 수 있는 글자는 모두 1만1172개이므로 알파벳, 숫자, 기호 등을 고려해도 어휘 집합 크기는 기껏해야 1만5000개를 넘기 어렵다. 모든 문자가 어휘 집합에 포함되므로 미등록 토큰 문제에서도 자유롭다.
그러나 문자 단위 토큰화 방식은 두 가지 문제점이 있다. 우선 각 문자 토큰은 의미를 가진 단위가 되기 어렵다. 예를 들어 어제의 ‘어’와 (‘~했어’라고 말할 때의) 어미(語尾) ‘어’ 구분이 사라진다. 무엇보다 큰 문제는 어떤 문장에 대해 토큰화를 수행한 뒤 토큰 시퀀스의 길이가 매우 길어진다는 점이다. “어제 학교에 갔다”를 단어 단위로 토큰화하면 토큰 시퀀스의 길이(토큰 갯수)는 3인 반면, 문자 단위는 9다. 토큰 시퀀스가 길어지면 필요 계산량이 곱절로 늘어나 학습에도, 운용에도 많은 비용이 발생한다.
오픈AI, 앤스로픽 같은 주요 기업들은 단어와 문자의 중간에 해당하는 ‘서브워드(subword)’ 단위의 토큰화를 수행한다. 둘의 장점만을 취한 형태다. 어휘 집합 크기를 적당히 유지하면서도 긴 시퀀스 문제를 해결할 수 있다. 가장 많이 사용되는 서브워드 토큰화 기법은 ‘바이트 페어 인코딩(BPE: Byte Pair Encoding)’이다.
BPE는 데이터에서 자주 등장하는(고빈도) 문자열을 병합해 어휘 집합을 만든다. 예를 들어 ‘aaabdaaabac’라는 문자열이 있을 때 가장 많이 등장한 ‘aa’를 병합해 ‘Z’로 표현하면 ‘ZabdZabac’가 된다. 여기에서 ‘ab’를 ‘Y’로 병합하면 ‘ZYdZYac’가 된다. 이후 ‘ZY’ 역시 ‘X’로 병합할 수 있어서 최종적으로는 ‘XdXac’가 된다.
다양한 토큰화 기법들
병합 이전에는 원래 문자열을 표현하기 위한 어휘 집합 크기가 4(a,b,c,d)였다. 그런데 수행 이후에는 그 크기가 7(a,b,c,d,Z,Y,X)로 늘었다. 반면 토큰 시퀀스 길이는 11(aaabdaaabac)에서 5(XdXac)로 줄었다. 이처럼 BPE는 어휘 집합의 크기를 지나치게 늘리지 않으면서도 토큰 시퀀스를 효율적으로 압축할 수 있도록 한다.
아울러 BPE는 빈도만으로 토큰을 분석하고 어휘 집합을 구축하기 때문에 분석 대상 언어에 대한 사전 지식이 필요 없다. 오픈AI 등 주요 빅테크 기업들이 영어뿐 아니라 한국어, 일본어 등을 이해하고 생성하는 LLM을 만들 수 있었던 비결 중 하나이기도 하다.
LLM 학습의 핵심은 ‘다음 토큰 예측’이다. “어제 학교에 ___”라는 문장이 주어졌을 때, ‘갔다’ ‘다녀왔다’ ‘도착했다’ 같은 적절한 다음 토큰을 맞추는 연습을 반복하며 예측 능력을 키워나간다. 여기서 중요한 부분은 LLM의 입출력이다. LLM이 입력으로 받는 것은 ‘어제’ ‘학교에’ 같은 연속된 토큰들이다.

LLM은 이 입력을 바탕으로 다음 토큰을 예측한다. 이때 어휘 집합에 있는 모든 토큰들 각각에 0에서 1 사이의 확률 값을 매긴다. 예를 들어 ‘갔다’라는 토큰에는 0.6, ‘다녀왔다’에는 0.3, 그리고 다른 토큰들에는 더 낮은 확률 값일 수 있다. 그 값이 높을수록 해당 토큰이 입력 뒤에 오는 게 자연스럽다고 모델이 판단했다는 뜻이다. 이처럼 어휘 집합의 모든 토큰에 확률 값을 매긴 것이 바로 ‘확률분포’다.
LLM의 학습은 이 확률분포를 개선하는 과정이다. 예컨대 “어제 학교에 갔다”라는 문장이 정답이라면, ‘어제 학교에’가 입력되었을 때 출력 확률분포에서 ‘갔다’라는 토큰의 확률 값은 높아지고 나머지 오답 토큰들의 확률 값은 낮아지도록 모델을 조정해나간다. 이 조정은 LLM 내부의 수많은 파라미터(매개변수)의 값들을 바꾸는 방식으로 이뤄진다. 모델 크기를 키우고 오래 학습하면 어떤 임계점을 넘어서는 경우 이전에 보이지 않았던 새로운 능력이 창발(emergence)된다(〈시사IN〉 제894호 ‘갑자기 능력이 튀어나왔다, 크게 했을 뿐인데’ 기사 참조).
학습이 끝난 LLM을 사용해 문장을 만드는 과정도 이와 유사하다. LLM은 입력된 토큰들 다음에 나올 토큰에 대한 확률분포를 출력하고, 이 확률분포에서 적합한 토큰을 선택해 문장을 이어나간다. LLM이 글을 쓴다는 것은 이 과정의 반복이다. 예를 들어 〈그림 3〉은 ‘그’라는 토큰에서 출발해 다음 토큰으로 어떤 것이 적절한지 LLM이 예측한 결과다.
원래대로라면 ‘그’ 다음에 올 토큰으로 어휘 집합 크기(보통 10만 이상)만큼의 경우의 수가 존재한다. 〈그림 3〉에서는 이해를 돕기 위해 3개(책, 집, 사람)로 제한했다. 예시에서 이 모델은 ‘그’ 다음의 두 번째 토큰으로 책(0.5), 집(0.4), 사람(0.1) 순으로 자연스럽다고 판단했다.
세 번째 토큰은 어떻게 고를까. “그 책” “그 집” “그 사람” 3가지를 LLM에 입력하고 출력 확률분포를 각각 계산하면 된다. 네 번째 토큰은 9가지(“그 집 사” “그 집은” ··· “그 사람 누구”)를 입력하고 출력 확률분포를 각각 계산한다. 그런데 이렇게 다음 토큰을 고른다고 하면 경우의 수가 매번 제곱으로 늘어난다. 모든 경우의 수를 따져보는 것은 불가능에 가깝다.
오픈AI 같은 빅테크에서는 출력 확률분포에서 적절한 다음 토큰을 ‘하나만’ 선택하고, 선택된 토큰을 포함한 토큰 시퀀스를 새로운 입력으로 해 다음 토큰 확률분포를 출력하는 방식으로 문장을 생성해나간다. 이렇게 하면 LLM이 계산해야 할 경우의 수를 상당히 줄일 수 있다.
앵무새처럼 똑같은 답변 피하려면
토큰을 선택할 때 가장 간단한 방법은 전체 어휘 가운데 가장 높은 확률 값을 지닌 토큰을 낙점하는 것이다. 〈그림 3〉 예시에서는 ‘그’ ‘책(0.5)’ ‘이(0.4)’가 될 것이다. 이러한 방식을 ‘그리디 서치(greedy search)’라고 한다. 그리디 서치는 LLM에 동일한 입력을 주는 경우 항상 같은 문장을 생성한다.

이를 방지하기 위해 업계에서는 샘플링(sampling)을 자주 사용한다. 다음 토큰을 확률적으로 선택하는 방식이다. 예시처럼 ‘그’라는 토큰 뒤에 올 수 있는 후보가 책(0.5), 집(0.4), 사람(0.1)이라면, 50% 확률로 ‘책’이 선택될 가능성이 가장 크지만 ‘사람’도 10% 확률로 선택될 수 있다. 복권 당첨 확률이 아주 낮지만 당첨되는 사람이 나오는 것과 비슷하다. 샘플링은 같은 입력이라도 생성할 때마다 다른 결과가 나올 수 있다.
샘플링 방식은 다양하게 변형될 수 있다. 예를 들어 ‘톱k 샘플링’은 확률 값이 높은 상위 k개의 토큰 중에서만 선택한다. k가 2라면 ‘그’ 다음에 ‘집’이나 ‘책’ 중에서만 선택하고, k가 1이면 그리디 서치와 동일하다. ‘톱p 샘플링’은 누적 확률(p)을 기준으로 상위 토큰들에서만 선택한다. 톱k, 톱p 샘플링 모두 확률이 낮은 토큰은 선택에서 배제함으로써 문장의 생성 품질을 높인다.
또 다른 방식으로는 ‘템퍼러처 스케일링(temperature scaling)’이 있다. 다음 토큰의 확률분포를 대소 관계의 역전 없이 모양만 바꿔서 샘플링한다. 예를 들어 템퍼러처 스케일링으로 확률분포를 뾰족하게 조정하면 ‘책(0.75), 집(0.23), 사람(0.02)’처럼 원래 높았던 ‘책’의 확률을 더 높이고, 낮았던 ‘사람’의 확률은 더 낮게 만든다. 이렇게 되면 모델이 보기에 자연스러운 토큰(높은 확률 값)이 선택될 가능성이 더욱 높아져, 상대적으로 더 정확한 문장이 생성된다. 반대로 분포를 평평하게 하면 다양한 문장을 생성할 가능성이 커진다.
오픈AI와 앤스로픽의 API는 ‘max_tokens(최대 입출력 토큰 수)’ ‘top_k(상위 k개 중 샘플링)’ ‘top_p(누적 확률 p 내에서 샘플링)’ ‘temperature(확률분포를 변형하는 정도)’ 같은 다양한 옵션을 제공한다. 이러한 옵션의 의미를 이해하고 활용하면 원하는 스타일의 텍스트를 더욱 효과적으로 만들어낼 수 있다.
요컨대 LLM은 주어진 텍스트를 바탕으로 다음에 올 토큰을 예측하며 문장을 학습/생성한다. 효율적인 토큰화 방식과 샘플링 기법은 모델 성능과 생성 품질을 좌우하는 핵심 요소다. 이 단순한 원리가 쌓이고 반복되어 복잡한 언어 능력이 구현된다. 언어를 확률적 예측으로 풀어냈다는 점에서, 이 같은 LLM의 작동 원리는 우리가 언어를 이해하고 사용하는 방식에 대한 새로운 시각을 제공한다.
개발자 M (필명·AI 개발자) editor@sisain.co.kr
▶좋은 뉴스는 독자가 만듭니다 [시사IN 후원]
©시사IN, 무단전재 및 재배포 금지
Copyright © 시사IN. 무단전재 및 재배포 금지.