[Daily morning study] GPT 모델 동작 방식과 토크나이저 이해
#daily morning study
GPT란
GPT(Generative Pre-trained Transformer)는 OpenAI가 개발한 Decoder-only Transformer 기반 언어 모델이다. Transformer의 인코더-디코더 구조 중 디코더 파트만 사용하고, 방대한 텍스트 데이터로 사전학습(pre-training)한 뒤 다양한 태스크에 활용할 수 있도록 설계됐다.
Decoder-only 구조
Transformer 원 논문에는 인코더(입력 이해)와 디코더(출력 생성) 두 파트가 있다.
| 구조 | 대표 모델 | 주된 용도 |
|---|---|---|
| Encoder-only | BERT | 분류, NER, 감성 분석 |
| Encoder-Decoder | T5, BART | 번역, 요약 |
| Decoder-only | GPT, LLaMA | 텍스트 생성, 대화 |
GPT는 Decoder-only를 선택했다. 디코더는 Masked Self-Attention을 사용해 각 토큰이 자신보다 앞에 있는 토큰들만 참조할 수 있다. 덕분에 “다음 토큰이 무엇인지”를 예측하는 자기회귀 생성에 자연스럽게 맞아떨어진다.
사전학습: 다음 토큰 예측
GPT의 사전학습 목표는 간단하다. 주어진 시퀀스에서 다음 토큰을 예측하는 것이다.
입력: "The cat sat on the"
목표: "mat"
이 과정을 수십억 개의 텍스트 문서에 대해 반복하면, 모델은 자연스럽게 문법, 사실 지식, 추론 능력을 압축해 파라미터에 저장한다.
수식으로 표현하면 다음 토큰의 조건부 확률을 최대화한다:
L = Σ log P(token_t | token_1, ..., token_{t-1})
텍스트 생성: 자기회귀(Autoregressive) 방식
학습 후 텍스트를 생성할 때는 다음과 같이 동작한다:
- 사용자 입력(프롬프트)을 토큰 시퀀스로 변환
- 모델이 다음 토큰의 확률 분포를 출력
- 샘플링 전략(greedy, top-k, nucleus 등)으로 토큰 하나를 선택
- 선택한 토큰을 시퀀스에 추가한 뒤 2번으로 돌아감
- EOS(End Of Sequence) 토큰이 나오거나 최대 길이에 도달하면 종료
"오늘 날씨가" → "좋" → "아" → "서" → "기분이" → "좋다" → [EOS]
토큰 하나씩 생성하기 때문에 생성 속도는 시퀀스 길이에 비례한다.
토크나이저(Tokenizer)
토크나이저는 텍스트를 모델이 처리할 수 있는 정수 ID 시퀀스로 바꿔주는 전처리 모듈이다. 단순히 공백으로 나누지 않고, 서브워드(subword) 단위로 쪼갠다.
왜 서브워드인가
- 단어 단위: 어휘 사전이 너무 커지고 미등록 어(OOV) 문제 발생
- 문자 단위: 시퀀스가 너무 길어지고 의미 단위가 깨짐
- 서브워드: 두 극단의 절충 — 자주 쓰이는 단어는 통째로, 희귀 단어는 조각으로
BPE (Byte Pair Encoding)
GPT 시리즈가 채택한 방식이다.
- 모든 텍스트를 문자 단위로 시작
- 가장 자주 함께 등장하는 인접 쌍을 하나의 심볼로 병합
- 원하는 어휘 사전 크기에 도달할 때까지 반복
# 초기 어휘
"l o w" "l o w e r" "n e w e s t" "w i d e s t"
# 'e'+'s' 쌍이 가장 빈번 → 'es'로 병합
# 's'+'t' 쌍이 다음 빈번 → 'st'로 병합
# ... 반복
# 최종적으로 "lowest", "newest"처럼 빈출 단어는 통째로 남음
GPT-4에서는 cl100k_base 인코딩을 사용하며 약 10만 개의 토큰을 보유한다.
토큰화 예시
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
text = "Hello, world! 안녕하세요."
tokens = enc.encode(text)
print(tokens)
# [9906, 11, 1917, 0, 220, 97, 102, 98, 104, 99, 107, 104, 49424, 13]
print([enc.decode([t]) for t in tokens])
# ['Hello', ',', ' world', '!', ' ', '안', '녕', '하', '세', '요', '.']
한국어는 영어보다 토큰 효율이 낮다. 영어 단어 하나가 1~2토큰인 반면 한국어 음절 하나가 1~3토큰을 쓰는 경우가 많다.
컨텍스트 윈도우
모델이 한 번에 처리할 수 있는 최대 토큰 수다.
| 모델 | 컨텍스트 윈도우 |
|---|---|
| GPT-2 | 1,024 tokens |
| GPT-3 | 4,096 tokens |
| GPT-4 | 8,192 / 32,768 tokens |
| GPT-4o | 128,000 tokens |
컨텍스트 윈도우를 초과한 내용은 모델이 참조하지 못한다. 대화 맥락이 길어지면 초반 내용이 잘려나가는 이유다.
Self-Attention의 계산 복잡도는 O(n²)이기 때문에 컨텍스트가 길어질수록 메모리와 연산량이 제곱으로 증가한다. 최근 모델들이 이를 해결하기 위해 Sliding Window Attention, Flash Attention, Ring Attention 등 다양한 최적화를 적용하고 있다.
정리
- GPT는 Decoder-only Transformer이며 자기회귀 방식으로 한 번에 토큰 하나씩 생성한다.
- 사전학습 목표는 “다음 토큰 예측”이며, 이 단순한 목표를 대규모로 반복해 언어 이해 능력을 획득한다.
- 토크나이저는 텍스트를 서브워드 단위의 정수 ID로 변환하며, BPE가 GPT 계열의 표준 방식이다.
- 컨텍스트 윈도우는 모델이 한 번에 볼 수 있는 토큰의 한계이며, 이 범위 밖의 내용은 모델에게 존재하지 않는 것과 같다.