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

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

MiniMind のトークナイザーで韓国語を測り、小さな辞書を自分で学習する

LabHub 에서 이어서 보기

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

목표

MiniMind 가 배포하는 어휘 6,400 토크나이저로 한국어 말뭉치를 잘라 글자당 토큰을 재고, 같은 조립(바이트 수준 BPE)으로 어휘 1,024 짜리 사전을 학습해 비교한다. 어휘 크기가 압축률과 임베딩 몫을 어떻게 바꾸는지 숫자로 남긴다.

왜 중요한가

토큰 수는 계산량이고 문맥 창의 크기다. 같은 글이 두 배의 토큰이 되면 학습도 추론도 두 배로 비싸지고, 한 번에 볼 수 있는 글은 절반이 된다. 그런데 사전은 모델과 한 몸이라 학습을 시작한 뒤에는 바꿀 수 없다 — 그래서 처음부터 학습하는 사람만 이 결정을 한다. MiniMind 의 사전은 중국어·영어 자료로 학습됐다. 한국어는 그 사전 입장에서 거의 처음 보는 글자라 바이트 단위로 쪼개진다. 이 실습은 그 비용을 재고, 우리 말뭉치에 맞춘 사전이 얼마나 짧게 자르는지 확인한다. 작은 모델에서 어휘가 파라미터의 얼마를 차지하는지도 함께 본다 — MiniMind 가 6,400 이라는 작은 어휘를 고른 이유다.

단계

  1. MiniMind 토크나이저(/opt/minimind/model/tokenizer.json·tokenizer_config.json)의 어휘 크기와 bos·eos·pad 토큰, 그 번호를 /root/mm/tok/minimind_vocab.json 에 적으세요.
  2. 그 토크나이저로 검증 말뭉치(/opt/mm/data/pretrain_val.jsonl 의 text)를 잘라 글자·바이트당 토큰 수를 /root/mm/tok/borrowed.json 에 적으세요.
  3. /opt/mm/data/pretrain.jsonl 의 text 만으로 바이트 수준 BPE(어휘 1024, 특수 토큰 <|endoftext|>·<|im_start|>·<|im_end|> 를 이 순서로)를 학습해 /root/mm/tok/tokenizer.json 에 저장하세요.
  4. 새 토크나이저로 <|im_start|>user\n안녕<|im_end|>\n 을 잘라 /root/mm/tok/chat_ids.json 에 적으세요.
  5. 새 토크나이저로 2단계와 같은 측정을 해서 /root/mm/tok/own.json 에 적으세요.
  6. 어휘 384·512·1024 의 글자/토큰을 /root/mm/tok/sweep.json 에 적으세요.
  7. MiniMind-3 기본 설정·우리 작은 설정·우리 설정에 어휘 6400 을 넣은 것, 세 모델의 임베딩 몫을 /root/mm/tok/embed_share.json 에 적으세요.
  8. /root/mm/tok/report.md## 빌려 온 토크나이저 ## 우리 토크나이저 ## 어휘 크기와 임베딩 세 절을 쓰고, 2·5단계의 글자/토큰을 넣으세요.

참고

MiniMind 의 사전을 연다

/opt/minimind/model/tokenizer.jsontokenizer_config.json 을 읽어 어휘 크기, bos·eos·pad 토큰 문자열과 그 번호를 /root/mm/tok/minimind_vocab.jsonvocab_size·bos·eos·pad·bos_id·eos_id·pad_id 로 적으세요.

어휘 크기는 Tokenizer.get_vocab_size(), 번호는 token_to_id() 입니다. 어느 토큰이 bos·eos·pad 인지는 tokenizer.json 이 아니라 tokenizer_config.json 의 bos_token·eos_token·pad_token 에 있습니다.

빌려 온 사전으로 한국어를 잰다

MiniMind 토크나이저로 /opt/mm/data/pretrain_val.jsonl 의 모든 text 를 잘라, 전체 글자 수÷토큰 수와 전체 UTF-8 바이트 수÷토큰 수를 /root/mm/tok/borrowed.jsontokens·chars_per_token·bytes_per_token 으로 적으세요.

한글 한 글자는 UTF-8 로 3바이트입니다. 글자/토큰이 1 보다 작으면 한 글자를 여러 조각으로 쪼갰다는 뜻입니다. 측정 스크립트를 토크나이저 경로와 결과 경로를 인자로 받게 만들어 두면 5단계에서 그대로 다시 씁니다.

어휘 1024 짜리 사전을 학습한다

스크립트 /root/mm/tok/train_tok.py(인자: 어휘 크기, 저장 경로)를 써서 /opt/mm/data/pretrain.jsonl 의 text 만으로 MiniMind 와 같은 조립(models.BPE + pre_tokenizers.ByteLevel(add_prefix_space=False) + decoders.ByteLevel)을 vocab_size=1024, 특수 토큰 <|endoftext|>·<|im_start|>·<|im_end|> 순서로 학습해 /root/mm/tok/tokenizer.json 에 저장하세요.

BpeTrainer(vocab_size=…, initial_alphabet=pre_tokenizers.ByteLevel.alphabet(), special_tokens=[…]) 입니다. 특수 토큰은 적은 순서대로 0·1·2 번이 됩니다. 저장한 뒤 get_vocab_size() 가 1024 보다 작게 나오는 것이 정상입니다 — 합칠 쌍이 먼저 떨어졌습니다.

특수 토큰은 한 조각이어야 한다

새 토크나이저로 문자열 <|im_start|>user\n안녕<|im_end|>\n 을 잘라 /root/mm/tok/chat_ids.jsontext(그 문자열)와 ids(토큰 번호 목록)로 적으세요.

특수 토큰으로 등록된 문자열은 바이트로 쪼개지지 않고 번호 하나가 됩니다. 첫 번호가 1(<|im_start|>)이고 2(<|im_end|>)가 한 번 나와야 합니다. SFT 의 손실 마스킹은 이 번호들을 표지로 삼습니다.

우리 사전으로 다시 잰다

2단계와 같은 측정을 새 토크나이저(/root/mm/tok/tokenizer.json)로 해서 /root/mm/tok/own.jsontokens·chars_per_token·bytes_per_token 으로 적으세요.

같은 검증 말뭉치, 같은 계산이어야 두 숫자를 견줄 수 있습니다. 우리 말뭉치는 낱말 종류가 적어 어휘 700여 개로도 낱말 하나가 한 토큰이 됩니다 — 실제 한국어 말뭉치라면 이보다 훨씬 긴 꼬리가 남습니다.

어휘를 늘리면 얼마나 짧아지나

같은 조건으로 어휘 384·512 사전을 더 학습해, 세 사전(384·512·1024)의 검증 글자/토큰을 /root/mm/tok/sweep.json{"384": 값, "512": 값, "1024": 값} 으로 적으세요.

어휘가 늘수록 글자/토큰은 늘지만 어느 순간 멈춥니다. 1024 를 주었는데 실제 어휘가 몇 개였는지(3단계) 떠올리면 왜 멈추는지 보입니다. 1024 값은 5단계의 값과 같아야 합니다.

어휘가 파라미터를 얼마나 먹나

mmkit.new_model(설정) 으로 세 모델 — MiniMind-3 기본(MiniMindConfig() 의 hidden_size·num_hidden_layers·vocab_size), 우리 작은 설정(mmkit.SMALL), 우리 설정에 vocab_size 6400 — 을 만들어 임베딩 파라미터 수·전체 파라미터 수·몫을 /root/mm/tok/embed_share.jsonminimind3·ours·ours_vocab6400 로 적으세요.

MiniMind 는 임베딩과 출력층(lm_head)을 공유합니다(tie_word_embeddings). model.parameters() 는 공유된 텐서를 한 번만 돌려주므로 그 합이 전체입니다. 임베딩은 model.model.embed_tokens.weight 입니다.

사전을 고른 근거 남기기

/root/mm/tok/report.md## 빌려 온 토크나이저 ## 우리 토크나이저 ## 어휘 크기와 임베딩 세 절을 쓰고, 2단계와 5단계의 글자/토큰(chars_per_token)을 숫자로 넣으세요.

빌려 온 사전이 한국어를 몇 배 길게 자르는지, 그 대가가 학습·추론에서 무엇인지 한 줄씩 적으세요. 마지막 절에는 우리 몸집에 어휘 6400 을 쓰면 임베딩이 전체의 몇 %가 되는지를 넣으면 좋습니다.