혼동하기 쉬운 점과 요약
토론 1. 어휘를 늘리면 늘 좋은가
어휘를 512, 1,024, …, 8,192 로 늘릴수록 같은 검증 글의 토큰 수는 계속 줄었다. 그렇다면 어휘는 크면 클수록 좋은가?

토큰 수만 보면 계속 줄어요. 그런데 4,096 에서 8,192 로 갈 때는 2.91% 밖에 안 줄었어요.

극단까지 가 볼까요. 학습 글에 나온 이야기 한 편을 전부 토큰 하나로 만들면요?

그럼 학습 글은 이야기 수만큼의 토큰이 되니까 엄청 줄겠네요. 근데 처음 보는 이야기는… 한 토큰도 못 쓰겠어요. 바이트로 다 흩어지고요.

어휘가 학습 글을 외워 버리는 거네요. 장난감 문장의 「luna␣sa」가 작게 그런 거였고요.

그리고 모델은 어휘의 토큰마다 벡터 하나와 점수 하나를 배워야 해요. 토큰이 드물수록 배울 데이터가 적고요. 어휘를 늘리면 글은 줄지만, 줄어드는 양은 점점 작아지고 배울 것은 늘어요. 어휘 크기는 데이터와 모델의 크기에 맞춰 고르는 값이에요.
혼동하기 쉬운 점
| 혼동하기 쉬운 생각 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| BPE 는 사람이 만든 낱말 사전으로 글을 자른다고 봄 | 1 | BPE 는 학습 글에서 가장 자주 붙어 나오는 쌍을 합치기를 되풀이해 어휘를 만든다. 합친 순서의 목록이 토크나이저다 |
| 어휘 크기마다 토크나이저를 따로 학습해야 한다고 봄 | 2 | 합치기는 앞의 토큰만 재료로 쓰므로, 큰 어휘 목록의 앞부분을 잘라 쓰면 작은 어휘 토크나이저가 된다 |
| 학습 글을 가장 짧게 줄이는 토크나이저가 좋다고 봄 | 3 | 낱말 경계를 넘는 토큰은 학습 글의 우연을 외운 것이다. 처음 보는 글에서 재야 한다. 조각을 먼저 나누고 그 안에서만 합친다 |
| 토큰당 손실이 작은 모델이 더 잘 맞힌다고 봄 | 4 | 토큰의 크기가 다르면 토큰당 손실은 비교할 수 없다. 바이트당 비트로 바꿔 비교한다 |
| 어휘는 클수록 좋다고 봄 | 5, 토론 1 | 뒤의 합치기일수록 줄어드는 토큰이 적고, 마지막 층은 어휘에 비례해 커지며, 드문 토큰은 배울 데이터가 모자라다 |
| 영어로 배운 토크나이저도 한국어를 비슷하게 자른다고 봄 | 6, 7 | 학습 글에 없던 언어는 바이트 가까이 흩어진다. GPT-2 는 한국어 글자 하나에 2.115 토큰, 영어 글자 하나에 0.249 토큰을 쓴다 |
요약
글자를 하나씩 세는 모델은 앞 여섯 글자를 보면 낱말 하나도 다 보지 못한다. BPE 는 바이트 256 개에서 출발해 학습 글에서 가장 자주 붙어 나오는 이웃 쌍을 새 토큰으로 합치기를 되풀이하고, 합친 순서의 목록을 토크나이저로 삼는다. 1994년 게이지가 파일 압축으로 낸 방법이고, 2016년 젠리히 팀이 드문 낱말을 조각으로 자르는 데 썼으며, 2019년 GPT-2 가 바이트에서 출발하되 글자 종류를 넘는 합치기를 막는 형태로 다듬었다. 장난감 문장에서는 여덟 번 합치기로 42 토큰이 23 토큰이 되었고, 조각을 나누지 않으면 「luna␣sa」처럼 우연을 외운 토큰이 생겼다.
타이니스토리즈로 배운 합치기에서 「 the」는 7번째, 「 Lily」는 149번째, 「 Luna」는 1960번째에 토큰 하나가 되었다. 어휘를 256 에서 512 로 늘리면 토큰 수가 반 아래로 줄지만 4,096 에서 8,192 로 늘리면 2.91% 만 줄고, 마지막 층은 어휘에 비례해 커진다. 1부는 어휘 4,096 을 쓰고, 토크나이저가 다른 모델은 바이트당 비트로 비교한다. 영어로 배운 토크나이저는 한국어를 바이트 가까이 흩어 놓아, GPT-2 는 한국어 글자 하나에 2.115 토큰을 쓴다. 한국어로 배운 BPE 4096 에서도 「루나」는 두 토큰이다.
루나 설정서 점검
| 설정서의 줄 | 이번 장에서 |
|---|---|
| 1. 말이 된다 | 아직. 루나는 이제 글을 토큰 4,096 종류로 읽는다. 토큰 바이그램이 바이트당 비트 1.2818 로, 바이트 바이그램 3.2940 보다 훨씬 잘 맞힌다 |
| 2. 앞에서 한 말을 기억한다 | 아직. 토큰 하나가 4 바이트쯤이라 같은 개수로 더 먼 앞을 볼 준비만 되었다 |

「 Luna」가 한 칸이 됐으니까, 이제 루나가 자기 이름을 한 번에 말할 수 있어.

이름만 한 번에 말하면 뭐 해. 아직 바로 앞 토큰 하나밖에 안 보는데.
막힌 곳
토큰으로 자르자 바로 앞 토큰 하나만 보는 바이그램도 바이트당 비트 1.2818 까지 내려갔다. 그런데 앞을 더 보려고 앞 토큰 다섯 개로 다음 토큰을 맞히는 표를 만들면, 문맥의 종류만 4,096 의 5제곱, 10¹⁸ 개가 넘는다. 학습 토큰 5억 개로는 그 표의 거의 모든 칸이 빈다. 「 Lily was happy」를 본 적이 있으면 「 Mia was happy」도 비슷하게 이어 쓸 수 있을 텐데, 표는 두 문맥을 전혀 다른 칸으로 다룬다. 비슷한 토큰을 비슷하게 다루면서 앞 토큰 여럿을 함께 보려면, 표 대신 무엇을 써야 할까?