LLM이 다음 단어를 예측하는 방식으로 작동한다는 식으로 많이 표현하는데 결국 이건 다음 토큰을 예측한다는 의미임.
그런데 이 토큰을 뭘로 설정할지는 자유임.
문자 단위로 할 수도 있고 단어 단위로 할 수도 있음.
예전에는 단어 단위로 하는 게 유행이었고 문자 단위로도 하려는 시도도 있었음.
단어 단위로 하면 같은 텍스트를 토큰으로 변환했을 때 길이가 짧아진다는 것이 장점.
다음 토큰 예측을 할 때 한 번에 더 많은 문자가 나오니 속도도 빨라지고 같은 context length에 대해서도 실질 텍스트의 길이가 더 길어지고.
그런데 문자 단위로 하려고 시도했던 건 단어의 수는 엄청나게 많은데 (영어만 국한해도 수십만 개 정도 생각해야할 것) 모델을 만들 때 만든 단어 사전 이외의 단어에 대해서는 대응이 안 된다는 것.
문자 단위로 하면 그런 문제에 대응할 수 있다고 본 것.
물론 그렇다고 실제로 모델 학습에 쓴 단어 외의 단어에 대해서도 정말로 대응이 되는가 하는 것은 별개의 문제이긴 함.
단어와 문자의 중간 지점에 속하는 것이 지금 다들 쓰고 있는 subword 토큰임.
이건 고정된 숫자의 단어 조각으로 텍스트에 나오는 단어들을 대부분 커버할 수 있으면서 텍스트를 변환했을 때 토큰의 길이를 최대한 줄이려는 방법이라고 생각하면 됨.
방법은 여러 가지가 있는데 GPT 시리즈에 쓰이는 BPE 같은 방법의 기본적인 아이디어는 문자들을 쭉 나열한 다음 자주 나오는 문자들의 조합을 합쳐서 새 토큰으로 만든다고 생각하면 됨.
즉 be 같은 문자 조합은 자주 나오니 새 토큰이 되는 것.
이렇게 하면 subword라는 말 그대로 단어를 쪼갤 수도 있음.
happ/y, happ/iness 같은 식으로 단어를 쪼개면 happ는 happy와 happiness, happen 같은 단어에 다 쓸 수 있고 4개 문자가 하나의 토큰으로 합쳐진 것이니 토큰 길이도 줄일 수 있음.
iness 같은 토큰도 다른 단어에 쓸 수 있을 것이고.
(실제 GPT에 쓰인 토큰과 토크나이저는 유니코드 바이트 단위로 처리되어 있어서 이보다 많이 지저분하기는 함.)
결국 등장 빈도를 고려하고 정해진 subword 수에 대해 최적인 토큰을 찾는 것이라 subword를 만들 때 어떤 데이터를 사용하는지에 따라서 결과물이 달라짐.
지금 많이 나온 GPT-3 토큰은 한국어를 문자 수 이상으로 쪼갠다는 이야기는 이것 때문에 발생하는 이야기.
GPT-3 토크나이저를 만들 때 한국어 데이터가 비중이 낮았을 테니 한국어는 단어를 묶어주는 작업이 별로 없고 오히려 쪼개놓은 것.
그러니까 같은 32K context length라고 했을 때 영어는 거의 3만 단어 정도가 될 수도 있겠지만 한국어는 그보다 짧아질 수 있는 것.
뭐 영어 단어의 문자 길이와 한국어 단어의 문자 길이 평균이 다르니까 차이가 좀 더 적을 수는 있지만.
그런데 ChatGPT나 GPT-4의 토크나이저는 토큰 수를 10만 개로 증가시키면서 한국어에 대해 과도하게 쪼개는 경향이 많이 줄어들긴 했음.
지금은 대략 문자 하나가 토큰 하나에 대응하는 듯.
입력 텍스트 길이보다 토큰 길이가 길어지는 경향은 많이 없어진 것으로 보임.
그런데 다국어 대응에 있어 10만 개가 최적인가? 그건 잘 모르겠음.
보통 다국어 모델은 20만 개 이상도 많이 써왔기 때문에 10만 개 정도 쓰는 것은 오히려 짠 것이 아닌가 싶기도 함.
OpenAI 나름의 이유가 있을 수도 있겠지만.
그런데 뭐 subword 토큰 수를 바꾸는 건 그렇게 어려운 일은 아닐 것이고 지금 학습하고 있다는 GPT-5는 이미 다를지도.
궁금한거 있는데 다음 토큰을 예측한다는게 ABCDEF 6토큰을 적는다 치면 A까지 적고 멈추고 A를 읽고 다시 B까지 적고 멈추고 다시 AB를 읽고 다시 C까지 적고 멈추고 다시 ABC를 읽고 ... 이런식으로 가는거임?
ㅇㅇ 맞음.
감사함. 잘읽었음
그냥 빙챗에 물어보면 알려주는거 긁어왓노
그냥 유니코드 쓰면 안 되나?