GPT — 인과적 언어모델링

BERT는 양쪽을 모두 봅니다. GPT는 오직 과거만 봅니다. 삼각형 마스크(triangle mask)는 현대 AI에서 가장 큰 영향을 남긴 단 한 줄의 코드입니다.

유형: Build 언어: Python 선수 지식: Phase 7 · 02 (Self-Attention), Phase 7 · 05 (Full Transformer), Phase 7 · 06 (BERT) 예상 시간: 약 75분

문제

언어 모델(language model)은 하나의 질문에 답합니다. 첫 t-1개 토큰(token)이 주어졌을 때 토큰 t의 확률 분포(probability distribution)는 무엇인가? 이 신호, 즉 다음 토큰 예측(next-token prediction)으로 학습하면 모델은 한 번에 한 토큰씩 임의의 텍스트를 생성할 수 있습니다.

전체 시퀀스(sequence)를 병렬로 종단 간(end-to-end) 학습하려면 각 위치(position)의 예측이 이전 위치에만 의존해야 합니다. 그렇지 않으면 모델은 정답을 들여다보면서 손쉽게 부정행위(cheat)를 하게 됩니다.

인과 마스크(causal mask)가 이 역할을 합니다. 어텐션 점수(attention score)에 소프트맥스(softmax) 전에 더해 주는, -inf 값으로 채워진 상삼각 행렬(upper-triangular matrix) 하나입니다. 소프트맥스 이후 마스크된 위치의 가중치는 0이 됩니다. 각 위치는 자기 자신과 그 이전 위치에만 참조(attend)할 수 있습니다. 그리고 이 마스크를 전체 시퀀스에 한 번만 적용하므로, 순전파(forward pass) 한 번으로 N개의 병렬 다음 토큰 예측을 얻을 수 있습니다.

GPT-1(2018), GPT-2(2019), GPT-3(2020), GPT-4(2023), GPT-5(2024), Claude, Llama, Qwen, Mistral, DeepSeek, Kimi는 모두 같은 핵심 루프(core loop)를 공유하는 디코더 전용 인과 트랜스포머(decoder-only causal transformer)입니다. 달라진 것은 규모(scale), 데이터, 그리고 더 잘 다듬어진 RLHF입니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.GPT 스타일 모델에서 인과 마스크(causal mask)는 무엇을 방지하며, 자기회귀 생성(autoregressive generation)에 왜 필요한가요?

2.GPT의 학습 손실에서 입력이 [t1, t2, t3]이고 타깃이 [t2, t3, t4]입니다. 이 한 칸 밀기(shift-by-one) 패턴은 무엇이며 어떤 손실 함수를 사용하나요?

0/2 답변 완료

개념

causal mask — one triangle, half a decade of progress unmasked (BERT-style) every position sees every position fits encoders (classification, embeddings) causal (GPT-style) position i attends to positions ≤ i only fits decoders (GPT, Llama, Claude) what the mask enables training full N-token forward pass, N parallel next-token losses in one batch inference autoregressive: feed tokens 1..t, generate t+1, repeat. KV cache (lesson 12) avoids re-computation loss cross-entropy shift-by-one: predict t_{i+1} from t_{0..i} the mask is added before softmax; exp(-inf) = 0; masked positions get zero weight.

마스크(Mask)

길이 N인 시퀀스에 대해 N × N 행렬(matrix)을 만듭니다.

M[i, j] = 0       if j <= i
M[i, j] = -inf    if j > i

M을 소프트맥스 전의 원시 어텐션 점수(raw attention score)에 더합니다. exp(-inf) = 0이므로 마스크된 위치는 가중치에 전혀 기여하지 않습니다. 어텐션 행렬의 각 행은 오직 이전 위치들에 대한 확률 분포가 됩니다.

구현 비용은 torch.tril() 호출 한 번이 전부입니다. 계산 시간은 나노초(nanosecond) 수준입니다. 분야(field)에 미친 영향은 사실상 모든 것에 해당합니다.

병렬 훈련, 직렬 추론(Parallel Training, Serial Inference)

훈련(training) 단계에서는 (N, d_model) 시퀀스 전체를 한 번의 순전파(forward pass)로 통과시키고, 위치마다 하나씩 N개의 교차 엔트로피 손실(cross-entropy loss)을 계산한 뒤 모두 합쳐 역전파(backprop)합니다. 시퀀스 방향으로 완전히 병렬입니다. 그래서 GPT 훈련은 잘 확장됩니다. GPU의 한 번의 패스(pass)에서 배치당 100만 토큰을 처리할 수 있습니다.

추론(inference) 단계에서는 토큰을 하나씩(token by token) 생성합니다. [t1, t2, t3]을 넣어 t4를 얻고, [t1, t2, t3, t4]를 넣어 t5를 얻으며, [t1, t2, t3, t4, t5]를 넣어 t6을 얻는 식입니다. KV 캐시(KV cache, Lesson 12)는 t1...tn의 은닉 상태(hidden state)를 저장해 두어 매 단계(step)마다 다시 계산하지 않도록 해 줍니다. 그렇더라도 추론 시 직렬 깊이(serial depth)는 출력 길이와 같습니다. 이것이 바로 자기회귀(autoregressive)의 비용이며, 모든 LLM에서 디코딩이 지연 병목(latency bottleneck)이 되는 이유입니다.

손실 — 한 칸 밀기(shift-by-one)

토큰이 [t1, t2, t3, t4]로 주어졌다고 합시다.

  • 입력(Input): [t1, t2, t3]
  • 타깃(Targets): [t2, t3, t4]

각 위치 i에서 -log P(target_i | inputs[:i+1])을 계산해 모두 합칩니다. 이 값이 전체 시퀀스에 대한 교차 엔트로피입니다.

들어 본 모든 트랜스포머 언어 모델(LM)은 이 손실로 학습합니다. 사전학습(pre-training), 파인튜닝(fine-tuning), SFT 모두 손실 자체는 동일하고, 사용하는 데이터만 다를 뿐입니다.

디코딩 전략(Decoding Strategies)

학습이 끝난 뒤에는 샘플링 방식 선택이 사람들이 생각하는 것보다 훨씬 중요합니다.

방법(Method)하는 일사용할 때
탐욕적(Greedy)매 단계마다 argmax를 취함결정적 과제(deterministic task), 코드 자동 완성(code completion)
온도(Temperature)로짓(logit)을 T로 나눈 뒤 샘플링창의적 과제, T가 클수록 다양성이 커짐
Top-k상위 k개 토큰 안에서만 샘플링낮은 확률 꼬리(low-probability tail) 제거
Top-p (nucleus)누적 확률이 p 이상이 되는 가장 작은 집합에서 샘플링2020년 이후의 기본 선택지, 분포 모양에 맞춰 적응
Min-pp > min_p * max_p를 만족하는 토큰만 유지2024년 이후, top-p보다 긴 꼬리 거부(tail rejection)에 더 강함
추측 디코딩(Speculative decoding)초안 모델(draft model)이 N개의 토큰을 제안하고 큰 모델이 이를 검증같은 품질을 유지하면서 지연을 2~3배 감소

2026년 기준으로, 공개 가중치 모델(open-weights model)에서는 min-p + 온도 0.7이 합리적인 기본값입니다. 프로덕션 추론 스택(production inference stack)에서는 추측 디코딩이 사실상 기본으로 갖춰야 할 요소가 되었습니다.

"GPT 레시피(recipe)"가 통한 이유

  1. 디코더 전용(Decoder-only). 인코더(encoder) 오버헤드가 없습니다. 계층마다 어텐션과 FFN을 한 번씩 통과하는 것이 전부입니다.
  2. 규모 확장(Scaling). 124M에서 1.5B, 175B를 거쳐 조 단위(trillion) 파라미터까지 키워 왔습니다. 친칠라 스케일링 법칙(Chinchilla scaling law, Lesson 13)은 연산 자원(compute)을 어떻게 분배해야 하는지 알려 줍니다.
  3. 문맥 내 학습(In-context learning). 약 6B~13B 부근에서 창발적으로 등장했습니다. 파인튜닝 없이도 모델이 퓨샷 예시(few-shot example)를 따를 수 있게 됩니다.
  4. RLHF. 인간 선호(human preference)에 기반한 후처리 학습(post-training)을 통해, 원시 상태의 사전학습 텍스트 모델을 채팅 어시스턴트(chat assistant)로 탈바꿈시켰습니다.
  5. 사전 정규화(Pre-norm) + RoPE + SwiGLU. 대규모 환경에서도 안정적인 훈련을 가능하게 했습니다.

핵심 아키텍처는 GPT-2 이후로 크게 바뀌지 않았습니다. 흥미로운 진전은 모두 데이터, 규모, 후처리 학습 쪽에서 일어났습니다.

직접 만들기

Step 1: 인과 마스크(causal mask)

code/main.py를 참고합니다. 사실 핵심은 한 줄짜리 함수입니다.

def causal_mask(n):
    return [[0.0 if j <= i else float("-inf") for j in range(n)] for i in range(n)]

이 마스크를 소프트맥스 전에 어텐션 점수에 더해 줍니다. 메커니즘(mechanism)은 이것이 전부입니다.

Step 2: 2계층 GPT풍(GPT-ish) 모델

디코더 블록 두 개(마스킹된 셀프 어텐션과 FFN, 교차 어텐션은 없음)를 쌓습니다. 여기에 토큰 임베딩(token embedding), 위치 인코딩(positional encoding), 그리고 언임베딩(unembedding)을 더합니다. 언임베딩은 토큰 임베딩 행렬과 가중치를 묶어(tie) 사용하는데, 이는 GPT-2 이후로 자리 잡은 표준 기법입니다.

Step 3: 종단 간(end-to-end) 다음 토큰 예측

20개의 토큰으로 이루어진 작은 어휘(toy vocab)에서 모든 위치의 로짓(logit)을 만듭니다. 한 칸 밀린 타깃(shift-by-one target)에 대해 교차 엔트로피 손실을 계산합니다. 기울기(gradient)는 사용하지 않습니다. 순전파만으로 정상 동작을 확인하는 점검(sanity check)입니다.

Step 4: 샘플링(Sampling)

탐욕적(greedy), 온도(temperature), top-k, top-p, min-p를 차례로 구현합니다. 같은 프롬프트에서 각각 실행해 출력 결과를 비교해 봅니다. 샘플링 함수는 보통 10줄 정도면 충분합니다.

사용해보기

2026년 기준 PyTorch 관용 코드(idiom)는 다음과 같습니다.

from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B-Instruct")
tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-3B-Instruct")

prompt = "Attention is all you need because"
inputs = tok(prompt, return_tensors="pt")
out = model.generate(
    **inputs,
    max_new_tokens=64,
    temperature=0.7,
    top_p=0.9,
    do_sample=True,
)
print(tok.decode(out[0]))

내부적으로 generate()는 순전파를 수행하고, 마지막 위치의 로짓을 꺼내어 다음 토큰을 샘플링한 뒤 그 결과를 시퀀스 끝에 덧붙이는 과정을 반복합니다. vLLM, TensorRT-LLM, llama.cpp, Ollama, MLX 같은 프로덕션 추론 스택은 모두 동일한 루프를 강도 높은 최적화와 함께 구현하고 있습니다. 여기에는 배치 프리필(batched prefill), 연속 배칭(continuous batching), KV 캐시 페이징(KV cache paging), 추측 디코딩 등이 포함됩니다.

GPT와 BERT를 한 줄로 비교하면 다음과 같습니다. GPT는 P(x_t | x_{<t})를 예측하고, BERT는 P(x_masked | x_unmasked)를 예측합니다. 결국 어떤 손실로 학습했는지가 그 모델이 생성을 할 수 있는 모델인지 아닌지를 결정합니다.

산출물 만들기

outputs/skill-sampling-tuner.md를 참고합니다. 이 스킬(skill)은 새로운 생성 과제에 어울리는 샘플링 파라미터(sampling parameter)를 골라 주고, 결정적 디코딩(deterministic decoding)이 필요한 경우를 함께 표시해 줍니다.

연습문제

  1. 쉬움. code/main.py를 실행하고, 소프트맥스 이후의 인과 어텐션 행렬이 하삼각(lower-triangular) 형태인지 확인합니다. 표본 점검으로, 행 3은 열 0~3에만 가중치가 있어야 합니다.
  2. 중간. 폭(width) 4인 빔 서치(beam search)를 구현합니다. 짧은 프롬프트 10개에 대해 beam-4와 그리디(greedy)의 퍼플렉서티(perplexity)를 비교합니다. 빔 서치가 항상 이기는지 살펴봅니다. (힌트: 번역(translation)에서는 보통 이기지만, 자유 형식의 대화(open-ended chat)에서는 그렇지 않은 경우가 많습니다.)
  3. 어려움. 추측 디코딩을 구현합니다. 작은 2계층 모델을 초안(draft)으로, 6계층 모델을 검증기(verifier)로 사용합니다. 길이 64인 완성(completion) 100개에 대해 실제 벽시계 기준(wall-clock) 속도 향상을 측정하고, 출력이 검증기의 그리디 출력과 일치하는지 확인합니다.

핵심 용어

용어흔한 설명실제 의미
인과 마스크(Causal mask)"삼각형"위치 i≤ i인 위치만 참조하도록, 어텐션 점수에 더하는 상삼각 -inf 행렬이다.
다음 토큰 예측(Next-token prediction)"그 손실"매 위치에서 실제 다음 토큰에 대한 모델 분포의 교차 엔트로피이다.
자기회귀(Autoregressive)"하나씩 생성"출력을 다시 입력으로 넣는 방식. 병렬성은 훈련에서만 존재하고, 생성 시에는 존재하지 않는다.
로짓(Logits)"소프트맥스 직전의 점수"LM 헤드(head)의 원시 출력이며, 샘플링은 이 값을 기준으로 이루어진다.
온도(Temperature)"창의성 다이얼"로짓을 T로 나눈다. T→0이면 그리디에 가까워지고, T→∞이면 균등 분포에 가까워진다.
Top-p"뉴클리어스 샘플링(Nucleus sampling)"확률 합이 p 이상이 되는 가장 작은 집합으로 분포를 자른 뒤, 남은 토큰들에서 샘플링한다.
Min-p"Top-p보다 더 나은 방식"p ≥ min_p × max_p를 만족하는 토큰만 유지한다. 분포가 얼마나 뾰족한지에 따라 컷오프가 함께 조정된다.
추측 디코딩(Speculative decoding)"초안 후 검증"가벼운 모델이 N개의 토큰을 제안하고, 큰 모델이 이를 병렬로 검증한다.
교사 강요(Teacher forcing)"훈련용 기법"훈련 중에는 모델의 예측 대신 실제 이전 토큰을 디코더 입력으로 사용한다. 모든 seq2seq 언어 모델 학습에서 표준으로 쓰인다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

sampling-tuner

Pick decoding strategy (greedy / temperature / top-k / top-p / min-p / speculative) for a given generation task.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.GPT 학습은 시퀀스 차원에서 완전히 병렬인데, 생성은 순차적(토큰 하나씩)입니다. 이 비대칭의 원인은 무엇인가요?

2.정확성이 다양성보다 중요한 코드 자동완성을 생성하고 있습니다. 어떤 샘플링 전략이 가장 적절한가요?

3.Min-p 샘플링은 p >= min_p * max_p인 토큰만 유지합니다. 실제로 top-p와 어떻게 다르며, 언제 더 나은가요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다