밑바닥부터 만드는 mini GPT 공부 시리즈 0편
LLM을 처음 공부할 때 가장 위험한 착각은 ChatGPT 같은 결과물을 바로 떠올리는 것이다. 과제에서 만드는 모델은 거대한 챗봇이 아니라, GPT 계열 모델의 핵심 부품을 손으로 조립해보는 교육용 mini GPT다.
그래서 이 시리즈의 출발점은 거창한 생성 결과가 아니다. 텍스트가 숫자가 되고, 숫자가 벡터가 되고, 벡터가 서로를 참고하고, 마지막에 다음 토큰 점수로 바뀌는 흐름을 잡는 것이다.
이번 글에서 잡을 관점
- LLM은 문장을 한 번에 이해하는 블랙박스가 아니라, 다음 토큰을 예측하도록 훈련되는 모델이다.
- mini GPT 구현은 토크나이저, 데이터셋, 임베딩, 어텐션, 트랜스포머 블록, 학습 루프를 순서대로 쌓는 일이다.
- 책 공부 시리즈는 코드 전체를 따라 치기보다, 각 부품이 왜 필요한지 이해하는 데 집중한다.
1. LLM의 기본 질문은 단순하다
GPT 계열 모델의 기본 학습 문제는 다음 토큰 예측이다. 이미 주어진 토큰들을 보고, 그다음에 올 토큰이 무엇일지 맞히도록 훈련한다.
이 예시는 단어처럼 보이지만 실제 모델 입장에서는 더 작은 토큰 ID들의 나열이다. 모델은 문자열을 직접 읽지 않는다. 숫자 ID를 읽고, 그 ID를 벡터로 바꾼 뒤, 다음 ID의 확률 분포를 만든다.
2. 전체 흐름은 한 줄로 이어진다
처음에는 파일이 많아 보여도, 흐름은 하나다. 텍스트를 숫자로 바꾼 뒤, 그 숫자를 신경망이 처리할 수 있는 벡터로 만들고, 여러 층을 통과시켜 다음 토큰 점수를 낸다.
사람이 읽는 문장
BPE 토크나이저가 만든 숫자 목록
토큰 의미와 위치 정보를 더한 입력
어텐션, 정규화, 피드포워드, 잔차 연결
다음 토큰 후보마다 매긴 점수
3. 왜 부품을 나눠서 배워야 하나
mini GPT는 하나의 큰 함수로 이해하면 금방 흐려진다. 각 부품이 해결하는 문제가 다르기 때문이다.
| 부품 | 해결하는 문제 | 헷갈리기 쉬운 지점 |
|---|---|---|
| BPE | 문자열을 토큰 ID로 바꾼다. | 한글은 글자 하나가 UTF-8 byte 여러 개로 저장된다. |
| Dataset | 입력과 정답을 한 칸 차이로 만든다. | target은 input과 같은 길이지만 한 칸 뒤를 가리킨다. |
| Attention | 현재 토큰이 앞 문맥 중 어디를 볼지 정한다. | causal mask가 없으면 미래 정답을 훔쳐보게 된다. |
| GPT Block | 어텐션과 MLP를 반복 가능한 층으로 묶는다. | LayerNorm과 residual connection은 장식이 아니라 학습 안정화 장치다. |
| Fine-tuning | 다음 토큰 예측 모델을 특정 작업에 맞게 바꾼다. | 분류에서는 LM head가 아니라 classification head가 필요하다. |
4. 이 공부 시리즈의 기준
이 시리즈는 책의 목차를 그대로 요약하지 않는다. 과제를 구현하며 실제로 부딪히는 질문을 기준으로 다시 정리한다.
부품이 등장한 이유를 먼저 본다.
shape, mask, loss처럼 자주 틀리는 지점을 따로 표시한다.
처음 공부에서 외울 것과 감만 잡을 것을 구분한다.
이번 글에서 기억할 것
- mini GPT 구현은 텍스트 생성 결과보다 데이터 흐름을 이해하는 과제다.
- GPT는 현재 문맥을 보고 다음 토큰 점수를 만드는 구조로 훈련된다.
- 토크나이저, 데이터셋, 어텐션, 블록, 학습 루프는 각각 다른 문제를 해결한다.
스스로 점검
- GPT가 직접 읽는 것은 문자열인가, 토큰 ID인가?
- 다음 토큰 예측에서 input과 target은 왜 한 칸 차이가 나는가?
- causal mask가 없다면 모델이 어떤 부정행위를 하게 되는가?
다음 글 예고
다음 글에서는 토크나이저를 다룬다. 특히 한글을 공백이나 글자 단위로만 보면 왜 부족한지, 그리고 byte-level BPE가 어떤 방식으로 처음 보는 표현까지 처리할 수 있는지 정리한다.
한 줄 정리: LLM을 직접 만든다는 것은 거대한 챗봇을 흉내 내는 일이 아니라, 텍스트가 다음 토큰 점수로 바뀌는 경로를 한 부품씩 확인하는 일이다.