동화 쓰는 작은 GPT: 게이밍 GPU 한 장으로 17분
혼동하기 쉬운 점과 요약
토론 1. 바이트당 비트 0.4253 이면 웹 글 모델보다 잘 맞히는가
동화 GPT 의 검증 바이트당 비트는 0.4253 이다. 웹 글로 학습한 큰 공개 모델들이 웹 글 검증에서 이보다 높은 바이트당 비트를 낸다면, 우리 루나가 그 모델들보다 다음 토큰을 잘 맞힌다고 말해도 되는가?

바이트당 비트는 토크나이저랑 상관없게 만든 숫자라서 서로 다른 모델끼리 비교할 수 있다고 했잖아요. 우리가 더 낮으면 우리가 더 잘 맞히는 거 아니에요?

두 숫자는 같은 글에서 잰 것인가요?

아… 우리는 타이니스토리즈 검증 글, 그 모델들은 웹 글이요.

낱말 세기에서 웹 글은 서로 다른 낱말이 8배 많았어. 글 자체가 덜 예측되니까, 아무리 좋은 모델도 웹 글에서는 바이트당 비트가 높게 나오겠지.

바이트당 비트가 없애 주는 것은 토크나이저의 차이뿐이에요. 데이터의 차이는 그대로 남아요. 같은 검증 글에서 잰 숫자끼리만 비교할 수 있어요.

그럼 반대로, 우리 루나한테 웹 글을 주면요?

해 볼 만해요. 아마 아주 높은 숫자가 나올 거예요. 좁은 글을 잘 맞히는 것과 넓은 글을 맞히는 것은 다른 일이니까요.
혼동하기 쉬운 점
| 혼동하기 쉬운 생각 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 작은 모델은 어떤 글로 학습해도 영어를 못 한다고 봄 | 1 | 타이니스토리즈는 서로 다른 낱말이 웹 글의 8분의 1 이 안 되고 흔한 1,000 낱말이 92.7% 를 덮는다. 좁은 글이면 2,760만 개로도 이야기 한 편을 쓴다 |
| 큰 모델은 같은 시간에 늘 덜 배운다고 봄 | 2 | 같은 토큰에서 동화 GPT 가 0.04~0.05 비트 낮았고, 처리 속도는 1.5배만 느렸다. 작은 모델은 GPU 를 다 쓰지 못한다 |
| 손실, 퍼플렉서티, 바이트당 비트를 서로 다른 성적으로 봄 | 3 | 퍼플렉서티 = e^손실, 바이트당 비트 = 손실 ÷ ln 2 ÷ 토큰당 바이트(3.96)다 |
| 학습 전 모델도 낱말은 안다고 봄 | 4 | 토큰 하나가 낱말 하나라 아무 토큰이나 뽑아도 낱말이 나온다. 낱말이 제자리에 오는 것은 50 스텝부터다 |
| 같은 이름이 반복되면 인물을 기억한다고 봄 | 4 | 200 스텝의 「Lily and Lily and Lily」는 흔한 토큰을 많이 쓴 것이다. 학습 글에 없는 이름으로 확인한다 |
| 시작 문장에 적은 대로 모델이 쓴다고 봄 | 5 | 「robot named Luna」에도 꼬리가 달렸다. 학습 글의 Luna 5,940 편 가운데 94.5% 에 cat 이 있었다 |
| 바이트당 비트는 데이터가 달라도 비교할 수 있다고 봄 | 토론 1 | 토크나이저의 차이만 없앤다. 같은 검증 글에서 잰 숫자끼리만 비교한다 |
요약
엘단과 리(2023)는 1억 2,500만 개 급 모델도 웹 글에서는 몇 낱말 넘게 잇지 못하는데, 서너 살이 알아듣는 낱말만 쓴 합성 동화 타이니스토리즈로는 1,000만 개 미만의 모델도 여러 문단의 이야기를 쓴다고 보고했다. 우리가 센 바로는 타이니스토리즈의 서로 다른 낱말은 같은 바이트의 웹 글보다 8배 적고(9,351 대 73,449), 이야기의 60% 가 「Once upon a time」으로 시작한다. 데이터는 GPT-3.5·GPT-4 가 쓴 합성 글이고 CDLA-Sharing-1.0 을 따르며, 이 책은 GPT-4 판(V2)을 쓴다.
같은 GPT 코드에 8층, 폭 512, 문맥 512 를 넣은 파라미터 27,579,392 개 모델을 4억 5,875만 토큰(학습 글의 0.83 바퀴) 학습했다. RTX 4090 한 장에서 1,044초(17.4분), 초당 439,318 토큰이 걸렸고, 검증 글 전체의 손실은 1.1685, 바이트당 비트는 0.4253, 토큰당 퍼플렉서티는 3.22 다. 체크포인트 샘플에서 루나는 낱말 이음(50 스텝), 가장 흔한 첫 문장(200 스텝), 문장의 문법(500 스텝), 이름을 지어 이어 쓰기와 사건의 앞뒤(2,000~14,000 스텝) 순으로 배웠다. 학습 글에 없는 이름 Seoyeon, Minjun 은 여러 토큰으로 잘려 Seoye, Minjo 로 망가지고, 학습 글에서 거의 고양이였던 Luna 는 로봇이라고 소개해도 꼬리를 얻었다.
루나 설정서 점검
| 설정서의 줄 | 이번 장에서 |
|---|---|
| 1. 말이 된다 | 그림책 영어만큼은. 앞뒤가 맞는 동화 한 편을 쓴다(바이트당 비트 0.4253). 낱말 9,351 개 밖의 말과 한국어는 아직 못 한다 |
| 2. 앞에서 한 말을 기억한다 | 반쯤. 첫 문장에서 지은 이름을 끝까지 쓰지만, 처음 보는 이름은 Seoye 처럼 끝을 놓친다 |
| 3. 별과 우주를 안다 | 아직. 루나는 고양이다 |

첫째 줄은 「네 살 수준으로」라고 덧붙여 둘게.

옛 루나는 관제 AI 였는데. 지금 루나는 꼬리 달린 세 살이야.
막힌 곳
같은 시작 문장 「Once upon a time there was a boy named Minjun.」을 세 번 이어 쓰게 하자 세 번 모두 다른 이야기가 나왔다. 하나는 하늘의 흰 구름을 쫓았고, 하나는 괴물을 만났고, 하나는 성에서 사탕 방을 찾았다. 모델은 학습이 끝나 파라미터가 그대로인데 이야기가 어디서 갈라졌을까? 우리가 매번 「온도 0.8」이라고 적어 둔 숫자는 무엇을 정하고, 온도를 바꾸면 루나의 이야기는 어떻게 달라질까?