동화 쓰는 작은 GPT: 게이밍 GPU 한 장으로 17분

시작 문장 장난: Seoye, Minjo, 꼬리 달린 로봇

민준이 음료를 사러 자리를 비운 사이, 서연은 노트북의 시작 문장 칸에 한 줄을 넣었다. 「Minjun liked Seoyeon.」 학습 글 270만 편 정도에 Seoyeon 과 Minjun 은 한 번도 나오지 않으니(data_stats.out 2절), 루나는 처음 보는 두 이름으로 이야기를 이어 써야 한다. 시작 문장 다섯 개를 온도 0.8 로 세 번씩 이어 쓰게 한 결과가 train_tinystories.out 끝에 있다.

### 시작 문장: Minjun liked Seoyeon.
[1] Minjun liked Seoyeon. She had a big toy box and she loved to play with her toys. One day, Minjo wanted to play a game and asked Simon to match his sofa. Simon was very excited and he said, "OK, let's find two friends!" …
[3] Minjun liked Seoyeon. He was very happy to visit them and play with them. One day, Minjune and Danbler were playing in the garden when Minjune suddenly noticed something strange. …

민준이 컵 두 개를 들고 돌아왔을 때 화면에는 Simon 과 Danbler 가 놀고 있었다.

김민준 M03
김민준

Minjo 는 누구고 Simon 은 또 누구야? 시작 문장 뭐 넣었어?

이서연 S16
이서연

그, 그냥 처음 보는 이름 시험. 이름 둘을 넣으면 둘 다 기억하나 보려고.

김민준 M06
김민준

둘 다 기억하긴. 서연이 이름은 첫 문장 다음부터 아예 안 나오는데.

이서연 S18
이서연

…그러게. 안 나오네.

민준은 서연의 표정은 보지 않고, 같은 출력 파일에서 서연의 이름으로 시작한 이야기를 찾아 읽었다.

### 시작 문장: Once upon a time there was a girl named Seoyeon.
[1] Once upon a time there was a girl named Seoyeon. She was three years old. One day, Seoye was playing in her garden when she found a big crack in the ground. …
### 시작 문장: Seoyeon was smart and kind. Minjun
[1] Seoyeon was smart and kind. Minjune had a special trick, she was able to reverse to the sports! … A big rock was blocking the road and Sereon couldn't bend it. …
김민준 M02
김민준

너는 세 살이래. 이름은 Seoye, Sereon. 뒤에선 Serelon 도 나와.

이서연 S17
이서연

세 살은 왜 붙는데.

김민준 M01
김민준

학습 글에 「three years old」가 4만 3천 편 넘게 나오거든. 이름을 소개하면 나이를 붙이는 게 동화의 형태야. 이름이 망가지는 건 토큰 때문이고. Lily 나 Lucy 는 토큰 하나인데, Seoyeon 은 ␣S | e | oy | e | on 다섯 개, Minjun 은 ␣M | in | j | un 네 개로 잘려. 앞쪽 조각은 따라 쓰는데 끝을 놓치는 거야.

이서연 S01
이서연

그럼 루나는? 루나도 처음 보는 이름이야?

김민준 M04
김민준

아니. 「 Luna」는 토큰 하나고 학습 글에 5,940 편 나와. 그런데 그 가운데 5,616 편, 94.5% 에 「cat」이 같이 나와. 「robot」이 같이 나오는 건 다섯 편.

민준이 마지막 시작 문장의 출력을 띄웠다.

### 시작 문장: Once upon a time, there was a robot named Luna.
[1] Once upon a time, there was a robot named Luna. Luna loved to serve her friends. She would serve them food and play games with them. … Luna said, "I will serve you if you stop playing so much. I am a reliable robot!" …
[3] Once upon a time, there was a robot named Luna. Luna had a long, pretty tail. She loved to play with her friends in the park. … Luna tried to climb down the tree, but her long tail got stuck in the tree. She cried for help. Tim, the little boy, heard her cries. He ran to the tree and tried to help Luna. But it was too late. Luna's tail was stuck in the tree forever.
이서연 S12
이서연

로봇한테 꼬리가 달렸어. 그리고 영원히 나무에 걸렸어.

김민준 M18
김민준

관제 AI 였던 루나가 나무에 꼬리가 낀 고양이 로봇이 됐어…

이서연 S01
이서연

「I am a reliable robot!」은 좀 너 같은데. 믿음직한 척하는 거.

김민준 M01
김민준

통계적으로는 당연해. 「named Luna」 다음 문장에서 루나에게 무엇이 달려 있을지는 학습 글의 Luna 들이 정하니까. Luna 가 나오는 이야기 열 편 가운데 아홉 편 넘게 고양이가 나와.

이름이 망가지는 일과 꼬리가 달리는 일은 원인이 다르다. Seoyeon 은 학습 글에 없는 이름이라 루나는 이야기 앞에 나온 토큰 조각들을 보고 이어 써야 하는데, 다섯 조각을 끝까지 맞게 잇지 못하면 「Seoye」가 된다. 이름의 앞 조각을 이어 쓰는 계산이 모델 안 어디서 일어나는지는 모델 속을 들여다보며 찾는다. 반면 Luna 는 루나가 이미 아는 이름이고, 루나는 그 이름에 학습 글이 붙여 준 성질을 그대로 붙인다. 시작 문장의 「robot」 한 낱말이 고양이가 함께 나오는 5,616 편을 이기지 못했다.

문제 5. 로봇 루나에게 꼬리가 달린 이유

시작 문장 「Once upon a time, there was a robot named Luna.」를 이어 쓴 세 샘플 가운데 하나에서 로봇 루나에게 꼬리가 생겼다. 학습 글에서 Luna 가 나오는 이야기는 5,940 편, 그 가운데 cat 이 함께 나오는 이야기 5,616 편, tail 341 편, robot 5 편이다. (가) 「루나가 고양이라고 믿어서 꼬리를 붙였다」고 말해도 되는가? (나) 시작 문장을 「Once upon a time, there was a robot named Rob.」으로 바꾸면 꼬리가 덜 나올 것이라고 예상할 수 있는가? 무엇을 재면 확인할 수 있는가?

이서연 S01
이서연

(가)부터 따져 볼게요. 「믿는다」는 말이 좀 걸려요. 모델 안에 「루나 = 고양이」라는 문장이 있는 건 아니잖아요.

선생님 T01
선생님

그럼 무엇이라고 말하면 정확할까요?

이서연 S01
이서연

음… 앞 글에 「Luna」가 있으면 다음 토큰들에 고양이 이야기에서 자주 오던 토큰이 높은 확률을 받는다, 정도요. tail 은 Luna 이야기의 5.7% 에 나오니까 흔하지는 않아도 뽑힐 수 있는 토큰이고요.

김민준 M01
김민준

근데 시작 문장에 robot 이 있었잖아. robot 도 앞 글에 있으니까 로봇 이야기 쪽 토큰도 확률을 받았을 거야. 실제로 [1] 은 「I am a reliable robot!」이었고.

선생님 T02
선생님

둘 다 앞 글에 있었어요. 그런데 왜 고양이 쪽이 이길 때가 있을까요?

김민준 M07
김민준

Luna 와 고양이가 같이 나온 이야기는 5,616 편인데, Luna 와 로봇은 다섯 편이니까요. 학습 글에서 「Luna 이야기」로 배운 건 거의 다 고양이 이야기예요. robot 이 끼어도 그 무게를 다 뒤집지는 못하고요.

이서연 S01
이서연

그럼 (나)는 꼬리가 덜 나올 거라고 예상할 수 있겠네요. Rob 은 Luna 처럼 고양이 이름으로 많이 쓰이지 않았을 테니까요. 확인하려면 Rob 이 학습 글에서 무엇과 같이 나오는지 세고, 두 시작 문장으로 샘플을 많이 뽑아서 tail 이 나오는 비율을 비교하면 돼요.

선생님 T01
선생님

그래요. 샘플 세 개로 하는 말은 짐작이고, 샘플 수백 개로 센 비율이어야 결론이 돼요. 그리고 꼬리가 나오는 비율은 시작 문장보다 학습 글이 더 크게 정한다는 것을 기억해 두세요.