Java로 직접 구현해보는 미니 LLM 학습 프로젝트. 외부 ML 라이브러리 없이 Transformer 의 5단계 흐름(토크나이저 → 임베딩 → 어텐션/FFN → LM Head → 샘플링)을 한 단계씩 짜보며 GPT 계열이 내부에서 무엇을 하는지 직접 눈으로 확인하는 것이 목적이다.
학습 자체보다 "각 단계에서 텐서가 어떤 모양으로 흘러가는가" 를 이해하는 데 초점이 맞춰져 있다.
IntelliJ 에서 Main.java 를 실행하거나, CLI 에서:
javac -d out/llm src/main/java/llm/*.java
java -cp out/llm llm.Main작은 코퍼스로 토크나이저를 만들고, 모델을 한 번 forward 시켜 각 단계의 텐서 모양을 출력한다. 마지막에는 한 문장 overfit 학습 데모(numerical gradient SGD)까지 돌린다.
| 파일 | 역할 | 5단계 매핑 |
|---|---|---|
Tokenizer.java |
단어 단위 토크나이저 (encode / decode) | Phase 1 |
Embedding.java |
토큰 ID → 벡터 lookup | Phase 2 |
PositionalEncoding.java |
sin/cos 위치 신호 주입 | Phase 2 |
MultiHeadAttention.java |
Q·K·V → softmax → 가중합 | Phase 3 |
FeedForward.java |
토큰별 비선형 변환 (2-layer MLP) | Phase 3 |
OutputHead.java |
hidden vector → vocab logits → softmax | Phase 4 |
Sampler.java |
확률 분포에서 토큰 1개 선택 (argmax) | Phase 5 |
MiniLLM.java |
위 컴포넌트들을 연결한 모델 본체 | 전체 |
Trainer.java |
numerical gradient 기반 SGD 학습 루프 | (training) |
Matrix.java |
행렬 연산 유틸 | — |
Main.java |
실행 진입점 + 단계별 콘솔 출력 | — |
하이퍼파라미터는 장난감 크기 (dModel=8, nHeads=2, blocks=1). 흐름은 GPT-3 와 동일하지만 가중치는 학습되지 않은 랜덤이므로 생성 결과 자체는 의미 없는 단어 나열이 된다.
- LLM_5단계_정리.md — 이 코드를 Transformer 표준 5단계 관점으로 다시 묶고, 각 단계에서 무슨 일이 일어나는지 정리한 학습 노트.