아틀라스X⁽⁰⁾ = E + PE(pos)miniLLMq′ = R(pos)·q, k′ = R(pos)·k위치 벡터를 입력에 더하는 대신 Q와 K를 위치만큼 회전시킵니다. 두 벡터의 내적이 절대 위치가 아니라 상대 거리에만 의존하게 되어 학습 길이보다 긴 문맥에도 잘 일반화됩니다.


확률부터 LLM까지, 원리부터 제대로 배우는 자기주도 학습 플랫폼
원하는 개념·랩·가이드를 검색해보세요
Ctrl K정답을 몰라도 괜찮습니다 — 먼저 예측을 정해야 시뮬레이션 결과가 기억에 남습니다. 예측을 고른 뒤 아래 시뮬레이션으로 직접 확인하고, 그다음 결과를 열어 보세요.
디코더 아틀라스는 어휘집만 학습하고 가중치는 고정 수식이었습니다. 이 디코더 구조를 그대로 키워 한국어 코퍼스 사전학습부터 SFT·DPO 정렬까지 직접 만든 163.6M 파라미터 모델 miniLLM-160M이 아래에서 브라우저 안에서, GPU 없이 CPU만으로 돌아갑니다. 어휘는 편의상 Qwen3.8에서 빌렸지만 토크나이저를 진짜 밑바닥부터 훈련하는 법도 다룹니다 — 서재의 "BPE 직접 훈련" 문서.
GPT·클로드·제미나이 같은 LLM은 마법이 아니라, 몇 개의 공정을 순서대로 거쳐 만들어지는 소프트웨어입니다. 어느 회사든 큰 틀은 같습니다:
웹 문서·책·코드 수조 토큰을 모아 광고·중복·저품질을 걸러냅니다. 모델의 말투·지식·편향이 모두 여기서 결정되므로, 실무에서는 이 단계에 가장 많은 공이 들어갑니다.
신경망은 숫자만 다루므로, 텍스트를 숫자로 바꾸는 "어휘사전"을 만듭니다. 사람이 단어장을 짜는 게 아니라, 코퍼스에서 자주 붙어 나오는 글자 조각을 통계적으로 병합(BPE)해 사전이 저절로 자라나게 합니다.
"지금까지 글을 보고 다음 토큰을 맞혀라"라는 단 하나의 게임을 수개월간 GPU 수천 장으로 반복합니다. 이 게임을 잘하려면 문법·지식·추론이 모두 필요하기에, 모델은 언어 능력 전반을 흡수합니다. 전체 비용의 90% 이상이 여기에 들며, 결과물은 아직 질문에 답할 줄 모르는 "이어쓰기 기계"(base 모델)입니다.
사람이 만든 "질문 → 좋은 답변" 예시 수십만 개로 대화의 형식을 가르칩니다. 이어쓰기 기계가 비로소 AI 비서처럼 응답하기 시작합니다.
같은 질문에 대한 두 답변 중 사람이 더 좋아한 쪽을 고르도록 조정합니다. ChatGPT를 ChatGPT답게 만든 마지막 조각(RLHF)이며, 안전성·말투가 여기서 다듬어집니다.
벤치마크와 사람 평가로 검증하고, 양자화·서빙 최적화를 거쳐 제품이 됩니다.
이 프로젝트는 위 전 과정을 축소판으로 전부 직접 수행했습니다. 유일한 예외가 2번 어휘사전 — 편의상 Qwen3.8의 것을 빌렸습니다. 하지만 직접 만들어보고 싶다면 아래 파이프라인의 ⓪ 토크나이저 훈련 카드와 서재의 실4 "BPE 토크나이저 직접 훈련" 문서에 방법을 자세히 설명해 뒀습니다 — 실제로 훈련해 보면 한국어 전용 어휘가 Qwen보다 효율적이라는 반전도 확인할 수 있습니다.
위 ⓪~⑤ 공정을 이 프로젝트의 실제 진행 상태로 보여줍니다. 각 카드의 초록 점은 해당 단계의 산출물이 준비되었다는 뜻이며, 카드를 클릭하면 그 단계가 무엇인지·왜 필요한지·어떻게 동작하는지(만드는 방법 포함) 상세 설명을 볼 수 있습니다.
텍스트 코퍼스 → 어휘사전(BPE) → 토큰 id → 다음 토큰 예측 학습 → 기반 모델(base) → 대화 형식 미세조정 → 채팅 모델 → 선호 정렬 → 최종 모델
GPT·Llama·Qwen이 공유하는 구조입니다. 입력 토큰은 임베딩을 거쳐 같은 모양의 블록 18개를 통과하고, 마지막에 임베딩과 가중치를 공유하는 lm_head가 "다음 토큰"의 확률분포를 출력합니다.
| 구성 요소 | 파라미터 | 비고 |
|---|---|---|
| 임베딩 (= lm_head) | 50.3M | 65,536 어휘 × 768차원, 가중치 공유 |
| 트랜스포머 블록 18개 | 113.3M | 블록당 6.3M (어텐션 1.6M + FFN 4.7M) |
| 합계 | 163.6M | bf16 기준 약 327MB · Q8_0 GGUF 176MB |
흐름(토큰 → 임베딩 → 어텐션 → FFN → 로짓)은 같습니다. 각 부품이 2017년 원본 트랜스포머에서 Llama/Qwen 계열의 현대 표준으로 교체됐을 뿐입니다.
아틀라스X⁽⁰⁾ = E + PE(pos)miniLLMq′ = R(pos)·q, k′ = R(pos)·k위치 벡터를 입력에 더하는 대신 Q와 K를 위치만큼 회전시킵니다. 두 벡터의 내적이 절대 위치가 아니라 상대 거리에만 의존하게 되어 학습 길이보다 긴 문맥에도 잘 일반화됩니다.
아틀라스Y = LayerNorm(X + Attn(X))miniLLMY = X + Attn(RMSNorm(X))평균을 빼지 않고 제곱평균으로만 크기를 맞춰 계산이 가볍고, 정규화를 서브층 앞에 두면 깊은 모델의 초기 학습이 안정됩니다. 잔차 경로가 정규화 없이 곧장 흐릅니다.
아틀라스Q,K,V ∈ ℝᵀˣ⁴ (헤드당 2차원)miniLLMQ: 12×64, K,V: 4×64 (쿼리 3개가 KV 1개 공유)K와 V 헤드를 쿼리보다 적게 두어 파라미터와 생성 시 KV 캐시 메모리를 줄입니다. 품질 손실은 거의 없어 Llama-2 이후 표준이 되었습니다.
아틀라스GELU(YW₁ + b₁)W₂ + b₂miniLLMdown( SiLU(gate(x)) ⊙ up(x) )행렬 3개(gate·up·down)와 게이트 곱셈으로 표현력을 높입니다. 파라미터를 맞추기 위해 중간 차원을 4d 대신 약 2.7d로 잡습니다.
아틀라스logits = h·Eᵀ / √4 + bminiLLMlogits = RMSNorm(h)·Eᵀ'id → 벡터'와 '벡터 → id 점수'는 역방향 관계이므로 같은 행렬 E(65,536×768)를 공유합니다. 5033만 파라미터를 절약하고 소형 모델에서는 품질도 좋아집니다.
손실(loss)은 "다음 토큰을 얼마나 못 맞히는가"입니다. 무작위 초기화면 ln(65536)≈11.1에서 시작해, 학습이 진행되며 떨어집니다. perplexity = e^loss 는 "몇 개 중에 하나를 찍는 수준인가"로 읽으면 됩니다. 디코더 아틀라스 ⑧단계의 “로짓 4행” 카드에서 “행 하나 = 학습 예제 하나”를 봤습니다. 실제 학습은 그 표를 1,024칸으로 넓혀 수십억 번 반복하는 일입니다.
Qwen3.8의 BPE 어휘 248,077개 중 한국어 말뭉치에 실제 쓰인 65,536개(2¹⁶)만 남깁니다. 바이트 256개는 강제로 포함해 어떤 글자도 <unk>로 떨어지지 않게 하고, 토큰은 uint16 2바이트로 저장합니다.
scripts/01_pretokenize.py6.9GB → 19.9억 토큰'지금까지의 토큰을 보고 다음 토큰을 맞혀라'는 단 하나의 목표. 디코더 아틀라스 ④단계의 어텐션 표에서 봤듯 한 번의 순전파로 1,024개 위치를 동시에 학습합니다. 한국어 말뭉치 85% + 위키 15% 혼합, 유효 배치 65K 토큰, AdamW, 코사인 학습률.
scripts/02_pretrain.py29,980스텝 · 14.52시간질문–답변 예시를 <|im_start|>user … <|im_end|> 형식으로 보여 주며 '이 패턴 다음엔 답변이 온다'를 가르칩니다. 손실은 답변 토큰에만 계산합니다(loss masking). 새 지식이 아니라 대화 형식을 배우는 단계입니다.
scripts/04_sft.py4,580스텝 · 2.26시간같은 질문에 대한 채택/거절 답변 쌍 6,400개로 '더 좋은 답변'의 방향을 배웁니다. 동결한 SFT 모델을 기준 삼아 상대적 변화만 허용하므로 언어 능력은 보존되고, 장황하게 탈선하는 스타일에 페널티가 붙습니다.
scripts/11_dpo.py790스텝 · 선호정확도 97.5%구조가 Llama 계열이라 GGUF 'llama' 아키텍처로 그대로 매핑됩니다. RoPE 배선 순열과 축소 어휘 이식만 맞추면 llama.cpp — 그리고 그 WebAssembly 빌드 — 가 파이썬·GPU 없이 모델을 실행합니다. 지금 이 페이지가 그렇게 돌아갑니다.
scripts/18_export_gguf.pyfp16 327MB → Q8_0 176MB29,980스텝 · 14.52h · 1.96B tokens · loss 11.24 → 2.27 (val 2.70)4,580스텝 · 2.26h · loss 3.11 → 1.88 (val 1.95)790스텝 · 0.27h · 선호정확도 → 97.5%손실 11.09는 65,536개 어휘를 균등하게 찍는 상태(ppl 65,536)이고, 사전학습이 끝난 2.27는 ppl 약 10 — 매 위치에서 후보를 열 개 남짓으로 좁혔다는 뜻입니다. SFT 손실은 답변 토큰에만 계산되어 스케일이 다르고, DPO는 손실 대신 선호정확도로 읽습니다(아래 실행 선택에서 dpo160).
모델은 글자가 아니라 토큰 id의 나열을 봅니다. Qwen3.8의 BPE 어휘 248,077개 중 우리 코퍼스에서 실제로 쓰이는 상위 65,536개만 남겨 임베딩 크기를 1/4로 줄였습니다(어휘 축소). 어휘 파일은 첫 토큰화 때 한 번만 내려받고, 계산은 전부 브라우저에서 합니다.
이어쓰기는 사전학습 모델의 본능(다음 토큰 예측)을 그대로 보여주고, 질문하기는 SFT·DPO를 거친 모델이 <|im_start|> 대화 형식을 따르는 모습을 보여줍니다. 브라우저에 올리는 모델은 miniLLM 프로젝트가 마지막으로 만든 최종 모델 하나 — 저사양 CPU 배포판에 든 바로 그 GGUF 파일입니다.
버튼을 누르면 /models/minillm-160M.Q8_0.gguf (176MB, Q8_0 양자화 · pretrain160 → sft160 → dpo160 완주판)을 내려받아 브라우저 안의 llama.cpp(WebAssembly)에 올립니다. GPU도 서버도 쓰지 않으며, 한 번 받은 파일은 브라우저 캐시에 남아 다음에는 즉시 열립니다.
<|im_start|>user 대한민국의 수도는 어디인가요?<|im_end|> <|im_start|>assistant
SFT 때 본 것과 같은 ChatML 틀입니다. 모델은 <|im_start|>assistant\n 뒤를 이어 쓰다가 <|im_end|>를 내면 멈춥니다.
163.6M 파라미터가 브라우저 안에서 한 토큰씩 답을 만듭니다. 디코더 아틀라스의 9단계(다음 토큰 확률)가 반복되는 것입니다.
miniLLM-160M은 GPT-4 같은 대형 모델이 아닙니다 — 문법과 말투는 배우지만 지식과 추론은 얕습니다. "작은 모델이 무엇을 배우고 무엇을 못 배우는지"를 관찰하는 것이 이 실습의 핵심입니다.
같은 말이 끝없이 반복된다면("먹을까? 먹을까?…") 그것이 바로 퇴행적 반복(degenerate repetition)입니다 — 반복이 문맥에 쌓일수록 다음에도 같은 구절이 나올 확률이 커지는 자기 강화 루프로, 학습 초기·소형 모델의 대표 증상입니다. 반복 감점을 올리면 토큰 단위 반복이 억제되고, 1.0으로 끄면 현상을 그대로 관찰할 수 있습니다. (miniLLM 대시보드의 n-gram 차단은 파이썬 서버 쪽 구현이라, 브라우저 빌드에서는 llama.cpp의 반복 감점(repeat penalty)을 대신 씁니다.)
miniLLM 프로젝트의 마지막 작업물은 GPU·PyTorch 없이 CPU 만으로 도는 슬림 배포판(deploy/bundle-slim, 약 190MB)입니다. 그 안에 든 유일한 모델이 이 miniLLM-160M GGUF 파일이며, 필요 사양은 CPU 2코어·RAM 1GB(생성 시 약 300MB)·디스크 1GB — llama.cpp 네이티브에서 43~49 tok/s가 나옵니다. 이 페이지는 같은 파일을 llama.cpp의 WebAssembly 빌드로 열어, 서버 없이 브라우저 CPU 한 스레드에서 실행합니다.
읽은 문서는 초록색으로 표시됩니다. 딥러닝이 처음이라면 주황 배지가 붙은 문서부터 시작하세요. 문서 안에서 ←/→ 키로 이전·다음 문서로 이동할 수 있습니다.
수치 출처: miniLLM configs/miniLLM-160M.json · artifacts/logs/{pretrain160,sft160,dpo160}_metrics.jsonl · artifacts/data/pretrain/stats.json(1,990,719,088 토큰) · artifacts/data/sft2/stats.json(412,258 대화) · artifacts/vocab/vocab_meta.json(커버리지 99.997%).
디코더 아틀라스와 같은 디코더 구조를 실제로 학습한 160M 파라미터 한국어 모델(miniLLM)의 전 과정을 한 페이지에 담은 실행실입니다. ⓪ LLM이 만들어지는 여섯 공정 개요, ① 파이프라인 카드(클릭하면 원리·방법 상세), ② 아키텍처(RMSNorm·GQA+RoPE·SwiGLU·weight tying, 파라미터 표), ③ 학습 모니터(사전학습·SFT·DPO 실제 손실·학습률·처리량·선호정확도 곡선), ④ 토크나이저 체험(Qwen3.8 BPE 축소 어휘 65,536), ⑤ 생성 플레이그라운드(176MB Q8_0 GGUF를 llama.cpp WebAssembly로 브라우저에서 실행, 토큰별 top-5 확률), ⑥ 학습 문서 서재 16편. 정직성 규약 — 곡선은 metrics.jsonl 로그 원본, 생성·토큰화는 브라우저에서 지금 계산, 어휘는 Qwen에서 빌렸음을 명시(직접 훈련법도 문서로 제공).
바로잡는 오개념: "LLM은 회사가 만드는 블랙박스라 개인은 원리만 알 수 있다"는 생각 — 공정은 여섯 개뿐이고(데이터 → 토크나이저 → 사전학습 → SFT → 정렬 → 배포) 각 단계는 스크립트 한 편 규모다. GPU 한 장으로 학습한 모델이 브라우저 안에서 CPU만으로 대답한다는 사실 자체가, 규모가 다를 뿐 GPT·클로드와 같은 공정임을 보여준다. 반대로 "작아도 학습했으니 똑똑하다"도 오해다 — 160M은 자주 틀리고, 그 틀리는 방식(반복·환각)이 바로 관찰 대상이다.
— 정답 대신 힌트로 유도합니다. 지금 화면의 실험 상태를 알고 답해요.
예: “방금 결과가 이론과 다른데 왜죠?”, “이 값을 올렸는데 왜 반대로 변하죠?”