LabHub
はじめる
배우기 러닝패스 코스

MiniMind — 小さな言語モデルを最初から最後まで自分で学習する

小さなモデルでは暗記と学習の境界がはっきりしている

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

한 줄 요약

평가는 '손실이 낮다' 를 넘어 무엇을 할 수 있고 무엇을 못 하는지를 가르는 일이다. 퍼플렉서티와 BPB 로 언어 모델로서의 품질을 재고, 학습·검증 손실의 틈으로 과적합을 보고, 본 적 없는 질문·자리수·길이에서 무너지는 모습을 숫자로 남긴다. 100만 파라미터 모델은 그 경계가 아주 선명해서, 큰 모델에서 흐릿하게 섞여 보이는 현상들을 하나씩 떼어 볼 수 있다.

왜 이게 필요했나

앞 모듈들에서 손실은 잘 내려갔고 SFT 모델은 학습 때 본 질문에 전부 맞게 답한다. 그런데 이 모델을 '마을에 대해 아는 챗봇' 이라고 부를 수 있을까? MiniMind README 는 자기 zero 모델의 대화 예시를 그대로 싣는다 — 중국어 질문에는 그럴듯하게 답하지만 영어 질문에는 뜻 없는 말을 이어 붙인다. 그리고 '사실 지식과 일반화 능력은 여전히 제한적' 이라고 적는다. 평가는 그 '제한' 이 어디서 시작하는지 찾아내는 일이고, 그 경계를 모르면 모델을 잘못된 곳에 쓰게 된다.

어떻게 동작하나

퍼플렉서티와 BPB. 퍼플렉서티는 exp(평균 손실) 로, '모델이 매 토큰 평균 몇 개 후보 사이에서 망설이는가' 쯤으로 읽는다. 다만 토큰의 크기에 따라 달라진다. BPB 는 전체 손실(나트)을 ln 2 로 나눠 비트로 바꾸고 같은 글의 바이트 수로 나눈 값이라, 토크나이저가 달라도 견줄 수 있다. 우리 기준 사전학습 모델은 검증 퍼플렉서티 2.48, BPB 0.21 이다. 같은 자리에서 기준 SFT 모델은 퍼플렉서티가 수백이 된다 — 채팅 형식만 1e-3 이라는 큰 학습률로 배우며 말뭉치를 이어 쓰는 능력을 잊었다(파국적 망각).

과적합. 문서 100개로 오래 학습하면 학습 손실은 계속 내려가는데 검증 손실은 어느 순간부터 오른다. 모델이 규칙 대신 그 100개를 외우기 시작한 지점이다. 이 코스의 말뭉치는 틀로 찍어 낸 문장이라 오히려 과적합이 늦게 온다 — 실제 글이었다면 더 일찍 벌어진다.

본 것과 못 본 것. 기준 SFT 모델은 SFT 에서 본 질문에는 100% 답한다. 그런데 사전학습 말뭉치에는 있었지만 SFT 에서 그 질문 모양을 본 적 없는 사실은 0% 다. 이유를 가르려면 사전학습 모델이 그 사실을 아는지부터 봐야 한다 — '○○ 마을의 특산물은' 뒤를 이어 쓰게 해 보면, 수호 동물은 대부분 맞히는데 특산물은 몇 개만 맞힌다. 아는 것도 질문 형식으로 꺼내지 못하고, 모르는 것은 당연히 못 꺼낸다. 덧셈은 다르다 — 본 적 없는 한 자리 덧셈 쌍의 77%를 맞힌다. 반복되는 규칙은 일반화하고, 하나씩 외워야 하는 사실은 일반화하지 못한다.

분포 밖. 한 자리 덧셈만 본 모델에게 두 자리 덧셈을 물으면 형식은 맞는 한 자리 답을 낸다. 128토큰으로만 학습한 모델에게 256토큰을 넣으면 뒤쪽 자리의 손실이 올라간다. RoPE 는 상대 위치를 쓰므로 무너지지는 않지만, 본 적 없는 거리에서는 덜 정확하다. MiniMind 는 이 문제를 추론 때 RoPE 를 늘리는 YaRN(inference_rope_scaling)으로 다루는데, eval_llm.py 의 인자 설명은 이것이 위치 인코딩 문제만 풀 뿐이라고 적는다 — 긴 글을 다루는 능력 자체를 주지는 않는다.

현장에서 만나는 모습

사내 모델을 평가할 때 학습 때 쓴 질문과 비슷한 것만 모아 두면 점수가 부풀어 보인다. 질문 모양·주제·길이를 학습 분포 밖으로 한 칸씩 옮긴 평가 세트를 따로 두어야 경계가 보인다. 또 SFT·DPO 뒤에는 원래 능력(말뭉치 이어 쓰기의 퍼플렉서티, 일반 지식)을 다시 재야 한다 — 새로 가르친 것만 재면 잊은 것은 아무 데도 기록되지 않는다. 틀린 답을 볼 때는 '모르는가, 알지만 못 꺼내는가, 범위 밖인가' 를 먼저 가른다. 셋은 처방이 다르다 — 모르면 자료를 더하고, 못 꺼내면 질문 모양을 다양하게 한 SFT 자료를 더하고, 범위 밖이면 그 범위의 자료를 넣거나 쓰임새를 좁힌다.

MiniMind 원본과 이 코스가 다른 점

MiniMind 의 eval_llm.py 는 학습한 가중치를 불러 준비된 질문 몇 개에 답하게 하고 속도(tokens/s)를 찍는 도구다 — 사람이 읽고 판단한다. 그와 별개로 MiniMind 는 C-Eval·C-MMLU·OpenBookQA 같은 외부 벤치마크로 모델을 잰다 — 수만 문항의 객관식이라 64M 모델도 무작위보다 나은지를 가를 수 있다. 1M 모델은 그런 벤치마크에서 무작위와 구별되지 않으므로, 이 코스는 세계를 닫아 두고(마을 12곳·덧셈 100개) 그 안에서 본 것·못 본 것·범위 밖을 정확히 나눠 잰다. 닫힌 세계의 장점은 틀린 이유를 하나씩 가를 수 있다는 것이고, 단점은 숫자를 바깥 세계로 옮길 수 없다는 것이다. 이 모델의 정답률 100% 는 '마을 퀴즈를 잘 푼다' 는 뜻일 뿐, 언어를 이해한다는 뜻이 아니다. 평가 세트를 만들 때는 늘 그 세트가 무엇을 대표하는지부터 적어 두어야 한다.

다음 실습에서 할 것

두 기준 모델의 퍼플렉서티와 BPB 를 재고, 문서 100개로 과적합 곡선을 만든다. SFT 에서 본 질문과 못 본 질문의 정답률, 두 자리 덧셈, 학습 길이 밖의 손실, 사전학습 모델이 사실을 아는지를 차례로 재고, 이 모델이 못 하는 것을 보고서로 남긴다.