동화 쓰는 작은 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 가 놀고 있었다.

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

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

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

…그러게. 안 나오네.
민준은 서연의 표정은 보지 않고, 같은 출력 파일에서 서연의 이름으로 시작한 이야기를 찾아 읽었다.
### 시작 문장: 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. …

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

세 살은 왜 붙는데.

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

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

아니. 「 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.

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

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

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

통계적으로는 당연해. 「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.」으로 바꾸면 꼬리가 덜 나올 것이라고 예상할 수 있는가? 무엇을 재면 확인할 수 있는가?

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

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

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

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

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

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

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

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