sjkwon

한국어 110M 언어모델 사전학습 실험

무작위 기준선과 세 커리큘럼 조건을 두 학습률 설정에서 총 8회 비교했습니다.

기간
2026.08
분류
개인 연구
역할
1인 · 실험 설계·데이터·학습 파이프라인·평가
스택
Python · PyTorch · Hugging Face · kiwipiepy · RunPod

질문: LLM도 인간처럼 쉬운 것부터 어려운 것으로 배워 나간다면?

한국어 언어모델을 처음부터 학습할 때, 같은 데이터를 인간의 학습처럼 쉬운 것부터 어려운 순서로 보여주면 무작위로 섞을 때보다 더 빨리 배울까 하는 의문에서 개인 실험을 설계하고 진행했습니다. 데이터나 모델 크기를 바꾸지 않고도 조절할 수 있는 조건이라, 순서의 영향만 따로 확인해 볼 가치가 있었습니다. 110M 모델에 총 25억 토큰을 한 번씩 보여주며, 무작위 기준선과 세 커리큘럼 조건을 비교했습니다.

비교한 순서는 네 가지였습니다.

  • random: 전체 데이터를 무작위로 섞은 기준선
  • length: 문장 길이를 기준으로 10개 구간을 만들고 짧은 순서대로 학습
  • difficulty: 형태소 통계로 계산한 난이도 순서대로 학습
  • mixed: 현재 난이도 구간에 다음 구간 데이터 10–15%를 섞어 학습

random, length, difficulty는 같은 코퍼스를 순서만 바꿨습니다. mixed만 최고난도 10%의 토큰을 쉬운 데이터로 교체했으므로 순서뿐 아니라 데이터 선택 효과도 포함합니다. 이 차이를 순수한 순서 효과처럼 해석하지 않도록 처음부터 별도 조건으로 두었습니다. 총 학습 토큰은 네 조건 모두 25억 개로 맞췄습니다.

학습 순서 외 변수 차단

모델은 110M 파라미터 decoder-only Transformer입니다. Llama 계열의 RMSNorm, RoPE, SwiGLU를 사용했고, 모델과 학습 루프는 PyTorch로 직접 구현했습니다. 토크나이저는 Hugging Face Tokenizers로 학습한 byte-level BPE 32k이며 입력·출력 임베딩을 공유했습니다.

데이터 소스실측 비중라이선스
FineWeb2 kor_Hang (revision 고정)76.6%ODC-By 1.0
국립국어원 모두의 말뭉치15.0%연구 목적, 재배포 불가
한국어 위키백과 202311018.4%CC BY-SA 4.0

전체 455만 문서·68억 자를 정제해 자체 BPE 기준 29.4억 토큰의 학습 풀을 만들었습니다. NFC 정규화, 한글 비율·길이 필터, BLAKE2 해시 중복 제거를 거쳤고, 콘텐츠 해시로 train/validation을 나눠 다시 실행해도 같은 문서가 같은 split에 들어가도록 했습니다. 정렬 단위는 단락 경계를 보존한 512토큰 이하 청크 832만 개입니다.

random, length, difficulty가 공유한 코퍼스 C는 706만 청크였습니다. mixed는 최고난도 713,554개 청크(2.5억 토큰)를 제거한 뒤 난이도 하위 75% 구간의 710,017개 청크로 교체해 총 토큰을 정확히 맞췄습니다.

같은 시드의 런은 초기 가중치가 완전히 같은지 테스트했고, 데이터 순서는 학습 전에 파일로 만들어 고정했습니다. 문장 단위 셔플은 기준선 자체를 비표준 학습으로 만들 수 있어, 512토큰 이하 청크를 정렬 단위로 택했습니다.

RunPod Secure Cloud의 RTX 4090 24GB 한 장에서 bf16으로 학습했습니다. 처리량은 약 9만 tokens/s, 런당 약 7.8시간이었고 전체 학습과 평가 비용은 약 55–60달러였습니다. 처음에는 3개 시드 반복을 계획했지만 첫 시드 결과를 보고 학습률 스케줄이 순서 효과와 섞였을 가능성이 더 먼저 해결해야 할 문제라고 판단했습니다. 그래서 시드 반복보다 같은 시드·같은 순서의 고정 학습률 4개 런을 우선해, cosine 4개 런을 포함한 총 8개 런을 비교했습니다.

재현 가능한 실험 설계

데이터 수집부터 전처리, 토크나이저 학습, 토큰화, 난이도 계산, 순서 생성, 학습·평가까지 main.py prepare → tokenizer → score → orders → train → eval → plot의 단계별 CLI로 분리했습니다. 데이터 revision과 실제 사용 내역은 manifest.json, 미리 생성한 조건별 순서와 해시는 orders/meta.json에 기록했습니다. 비교 런은 같은 초기 가중치에서 시작하는지 테스트했고, 고정 LR 재실험은 같은 시드·순서에서 lr = min_lr = 3e-4만 바꿨습니다.

중단한 학습을 이어 갈 때도 데이터 위치뿐 아니라 CUDA RNG 상태까지 복원하도록 고쳐, 재개 전후의 loss가 달라지지 않게 했습니다. 이 과정에서 체크포인트의 map_location이 RNG 상태 텐서까지 GPU로 옮겨 복원을 막는 문제를 발견했습니다. CPU 테스트에서는 지나가지 않는 경로였기 때문에, 실제 학습 장치에서 짧은 중단·재개 검증을 먼저 실행하도록 운영 절차도 바꿨습니다.

Hugging Face Datasets와 Hub는 코퍼스·벤치마크를 가져오는 데, Tokenizers는 BPE 학습에 사용했습니다. Transformers는 외부 기준 모델을 불러오는 평가 코드에만 사용했고, 실험 대상 모델과 학습 루프 자체는 PyTorch 구현입니다. KoGPT2 평가에서는 Transformers의 GPT2 래퍼가 한국어 토크나이저 입력을 바이트 단위로 분해하는 문제도 발견해, 한글 토큰 포함 여부를 프로브한 뒤 raw tokenizers.Tokenizer로 로드했습니다. 숫자가 생성되는 것과 올바르게 측정되는 것은 별개였습니다.

결과

조건최종 val loss목표 loss(3.645) 도달최종 BPC
random3.5051.38B tokens2.304
mixed3.5821.66B2.369
difficulty3.6321.81B2.470
length3.6451.99B2.414

같은 loss에 도달하려면 커리큘럼 조건은 random보다 약 20–44% 더 많은 토큰이 필요했습니다. 네 조건의 순위는 모든 중간 체크포인트에서 유지됐고, length는 학습 막바지에 val loss가 3.643에서 3.645로 오히려 소폭 상승했습니다.

조건별 val loss 곡선

전체 loss만으로는 왜 이런 순서가 생겼는지 알 수 없어 validation을 난이도별로 다시 나눴습니다. difficultyrandom의 차이는 easy +0.262, mid +0.080, hard +0.017이었습니다. 커리큘럼 조건의 easy loss가 1.2B 토큰 이후 더 낮아지지 않은 점은, 학습 초반에 본 쉬운 데이터를 다시 만나지 못해 성능이 저하됐다는 설명과 일치했습니다.

난이도 구간별 val loss

학습률 고정 후 재실험

cosine 학습률에서는 어려운 데이터가 항상 낮은 학습률 구간에 배치됩니다. 처음 결과를 순서 효과라고 부르기 전에 이 교락부터 확인해야 했습니다. 같은 시드와 데이터 순서를 유지한 채 학습률만 3e-4로 고정해 네 조건을 다시 학습했습니다.

고정 학습률에서는 difficulty의 random 대비 val loss 차이가 +0.127에서 +0.176으로, easy 구간 차이는 +0.262에서 +0.369로 커졌습니다. 조건 순위도 그대로였습니다. cosine 감쇠가 만든 착시라면 차이가 줄어야 했지만 반대 결과가 나왔습니다. 적어도 cosine 학습률만으로는 차이를 설명하기 어려웠고, 쉬운 데이터를 다시 보지 않는 순서가 유력한 설명으로 남았습니다.

고정 학습률 재실험

벤치마크

고정 프롬프트 20개의 생성 결과를 조건명이 보이지 않도록 섞어 LLM 심사자 두 명에게 비교시켰습니다. 두 심사자가 같은 선택을 한 사례에서 randomdifficulty의 결과는 12대 2였고, 양측 이항검정 p값은 약 0.013이었습니다. length는 10대 5, mixed는 9대 6이었지만 두 비교는 통계적으로 유의하지 않았습니다.

KoBEST, KoBALT-700, 자체 문법성 최소쌍도 평가했습니다. 문법성 최소쌍은 모든 조건이 0.5B 토큰 안에 96–99%에 도달했고, KoBALT는 모든 모델이 찬스 수준이어서 조건을 구분하지 못했습니다. 정확도형 벤치마크 숫자가 있다는 것과 이 체급의 모델 차이를 실제로 판별한다는 것은 다른 문제였습니다. 이 실험에서는 연속 지표인 val loss와 BPC가 데이터 순서 차이를 가장 안정적으로 보여줬습니다.

추가 벤치마크 결과

외부 오픈웨이트 모델과의 비교

최종 체크포인트 8개와 외부 모델 3종을 같은 평가 하네스로 측정했습니다. 토크나이저가 다른 모델끼리 비교하므로 모든 선택지는 문자 길이로 정규화한 로그확률로 채점했습니다.

모델MinPairCOPAHSwagBoolQSentiNegKoBALT
random (cosine)0.9890.5580.4280.4640.8480.077
mixed (cosine)0.9910.5700.4020.4710.7620.074
difficulty (cosine)0.9890.5500.4140.4690.8350.080
length (cosine)0.9910.5420.4040.4740.7550.084
random (고정 LR)0.9890.5460.4340.4630.8020.099
mixed (고정 LR)0.9840.5440.4040.4700.7920.091
difficulty (고정 LR)0.9840.5520.3800.4610.6200.086
length (고정 LR)0.9790.5320.3760.4640.7430.079
KoGPT2 125M0.9930.5580.4260.4730.6620.096
Gemma 3 270M PT0.9800.5680.4880.5310.5850.076
EXAONE 4.0 1.2B0.8640.5820.4260.4810.8150.099

외부 모델은 학습 데이터량과 토크나이저, 튜닝 방식이 달라 공정한 순위 경쟁 상대가 아니라 절대적인 위치를 가늠하기 위한 앵커입니다. 특히 EXAONE은 instruct 계열이어서 원시 문장 로그확률을 비교하는 MinPair에서 불리할 수 있습니다.

이 실험에서 얻은 인사이트

커리큘럼은 정렬 규칙이 아니라 재방문 스케줄이다

"쉬운 것부터 어려운 것까지" 한 번만 통과하는 커리큘럼에서는 난이도와 학습 시점이 붙어 버립니다. 초반의 쉬운 텍스트는 다시 보지 않는 반면, 후반의 어려운 텍스트가 마지막 업데이트를 차지합니다. 실제로 difficulty의 손해는 hard 구간(+0.017)이 아니라 easy 구간(+0.262)에 집중됐고, 고정 학습률에서도 같은 현상이 더 크게 나타났습니다. 따라서 이 실험에서 중요한 것은 무엇을 먼저 보여줬느냐보다 무엇을 다시 보여주지 않았느냐였습니다.

이 결과는 사전학습 커리큘럼을 설계할 때 난이도 정렬만 정해서는 부족하다는 뜻입니다. 쉬운 데이터를 주기적으로 다시 섞는 rehearsal이나, 난이도 밴드를 교차하는 interleaving까지 학습 순서의 일부로 설계해야 합니다. mixed의 성능 저하가 완전 정렬 조건보다 작았던 것도 다음 밴드를 미리 섞어 분포 변화가 조금 더 완만해지고 쉬운 데이터 비중이 늘어난 결과와 일치합니다. 다만 mixed는 두 변화가 함께 들어간 조건이라, 미리보기와 데이터 선택의 기여도는 이 실험만으로 분리할 수 없습니다.

데이터 적합성은 일부 과제에서 모델 크기를 상쇄했다

예상 밖의 결과는 외부 오픈웨이트 모델과의 비교에서 나왔습니다. 한국어로만 사전학습한 이 110M 모델은 문법성 최소쌍에서 KoGPT2 125M·Gemma 3 270M과 비슷했고, SentiNeg에서는 EXAONE 4.0 1.2B를 포함한 비교 모델 중 가장 높았습니다. 훨씬 큰 범용 모델이라도 여러 언어와 과제에 용량을 나눠 쓰는 반면, 작은 모델은 제한된 용량 전체를 한국어 분포에 맞춘 것이 한 가지 유력한 해석입니다.

다만 이것을 "작은 모델이 큰 모델보다 한국어를 더 잘한다"로 일반화할 수는 없습니다. COPA, HellaSwag, BoolQ에서는 일관된 우위가 없었고 KoBALT는 모든 모델이 찬스 수준이었습니다. 이 비교가 보여주는 범위는 문법성·감정처럼 학습 분포와 가까운 과제에서는 데이터 전문화가 파라미터 수의 일부를 보상할 수 있지만, 추론 능력까지 대신하지는 못한다는 것입니다. 모델마다 학습 데이터량과 튜닝 방식도 달라, 한국어 전용 학습의 효과를 인과적으로 분리한 비교가 아니라는 한계도 있습니다.

인간이 설계한 난이도 기준은 LLM에게 통하지 않을 수 있다

Beyond Random Sampling: Efficient Language Model Pretraining via Curriculum Learning (Zhang et al., 2025)은 더 큰 영어 모델과 여러 커리큘럼 설정에서 초기 학습 속도 향상을 보고했습니다. 모델 규모, 언어, 데이터, 난이도 지표와 학습 방식이 달라 직접 비교할 수 있는 실험은 아니지만, 이 실험에서도 쉬운 데이터부터 보여주는 순서가 무작위 학습보다 유리하거나 적어도 비슷할 것이라고 예상했습니다. 실제로는 random이 모든 커리큘럼 조건보다 앞서, 기대와 반대되는 결과가 나왔습니다.

이 실험의 밴드별 loss를 보면 random 모델조차 hard < mid 순으로 나왔습니다. 지표가 의도한 난이도 순서는 easy < mid < hard지만, 인간이 설계한 언어학적 난이도 지표가 LLM에도 같은 난이도를 뜻한다고 단정할 수는 없습니다. 커리큘럼 학습의 근본 가정인 "인간처럼 쉬운 것부터 배운다"에서 쉽고 어려움의 기준 자체가 인간과 LLM 사이에서 어긋나 있다면, 인간이 설계한 커리큘럼은 오히려 비효율적인 순서를 강제하는 셈입니다.

다음에 검증할 질문

반복하면 망각이 사라지는가

망각이 원인이라면 다음 실험의 예측은 분명합니다. 총 토큰을 그대로 둔 채 코퍼스를 1/4로 줄여 4에포크 학습하고, 에포크별 재셔플·커리큘럼 전체 사이클 반복(spaced)·난이도 밴드 블록 반복 (blocked)을 비교해보면 좋겠습니다. 쉬운 밴드를 주기적으로 다시 만나는 사이클 반복에서는 이번 실험의 easy loss 상승이 사라질 것으로 예상합니다. 인지과학의 blocked practice와 interleaved practice를 언어모델 사전학습에서 비교하는 실험으로도 의미가 있을 것입니다.

전문화의 이점은 다른 도메인에서도 재현되는가

한국어만 학습시킨 110M 모델이 훨씬 큰 오픈웨이트 모델과 비슷한 성능을 낸 것은, 데이터 전문화가 파라미터 수의 차이를 일부 상쇄할 수 있다는 가능성을 보여줍니다. 이 결과가 다른 도메인에서도 재현되는지 확인해보면 좋겠습니다.

예를 들어 코딩 데이터만으로 학습시킨 소형 모델은 코드 문법·자동완성에서 범용 대형 모델과 어느 정도까지 경쟁할 수 있을까요? 이미지 캡션 생성만을 전문으로 학습시킨 소형 모델을 비전 인코더가 없는 DeepSeek V4 같은 텍스트 LLM과 결합하면, 그 조합의 이미지 이해 성능이 전용 VLM과 비교해 어느 수준까지 도달할 수 있을지도 흥미로운 질문입니다.

LLM이 생각하는 난이도

인간이 설계한 언어학적 난이도 지표가 LLM에게 맞지 않는다면, LLM이 생각하는 난이도를 직접 측정해보면 좋겠습니다. 같은 코퍼스에서 per-sample loss나 forgetting score를 계산해 인간이 설계한 지표와 비교하면, "LLM에게 쉬운 데이터"를 정의하는 출발점이 될 것입니다. 이 기준으로 커리큘럼을 다시 설계했을 때 비로소 "LLM도 인간처럼 쉬운 것부터 배우면 더 빠른가"라는 질문에 답할 수 있을 것입니다.