Post

[Transformer 원리] Day 4: 학습과 추론 - 사전학습, 파인튜닝, 디코딩 전략

[Transformer 원리] Day 4: 학습과 추론 - 사전학습, 파인튜닝, 디코딩 전략

이 글은 AI(Claude)의 도움을 받아 작성하고, 작성자가 검토·편집했습니다.

서론: 구조에 지능을 채워 넣기

Day 1~3에서 Transformer의 구조를 조립했다. 하지만 구조만으로는 빈 그릇이다. 수십억 개의 파라미터에 “지능”을 채우는 과정이 학습이고, 학습된 모델이 텍스트를 만드는 과정이 추론이다. 오늘은 사전학습부터 정렬(alignment), 그리고 디코딩 전략까지 — 모델이 어떻게 배우고 어떻게 말하는지를 본다.

1. 사전학습: 다음 토큰 맞히기

LLM의 기본 학습 과제는 놀랍도록 단순하다. “다음 토큰을 맞혀라.”

1
2
3
4
5
6
7
입력: "한국의 수도는"
모델 예측: 다음 토큰 확률 분포 → "서울"(0.8), "부산"(0.05), ...
정답: "서울"

손실(loss): 정답 토큰에 모델이 부여한 확률의 음의 로그
  Cross-Entropy Loss = -log(P(정답 토큰))
  → 정답에 높은 확률을 줄수록 손실이 작아짐
1
2
3
4
5
import torch.nn.functional as F
# logits: [시퀀스, 어휘크기], targets: 각 위치의 다음 토큰 ID
loss = F.cross_entropy(logits.view(-1, vocab_size), targets.view(-1))
loss.backward()    # 역전파로 모든 파라미터의 기울기 계산
optimizer.step()   # 기울기 방향으로 파라미터 갱신

인터넷 규모의 텍스트로 이 과제를 수조 토큰 반복하면, 모델은 문법·사실·추론 패턴을 통째로 흡수한다. 이것이 “사전학습된” 기반 모델(foundation model)이다.

2. 자기지도학습의 힘

1
2
3
4
5
6
7
8
9
왜 강력한가:
  - 레이블이 필요 없다 — 텍스트 자체가 정답 (다음 단어가 곧 레이블)
  - 따라서 인터넷의 거의 모든 텍스트를 학습 데이터로 사용 가능
  - "다음 단어 예측"을 잘하려면 문법·세계지식·논리가 다 필요
    → 단순한 과제가 폭넓은 능력을 강제로 학습시킴

규모의 법칙(Scaling Laws):
  모델 크기·데이터·연산을 키우면 성능이 예측 가능하게 향상
  → "더 크게"가 지난 수년 LLM 발전의 핵심 동력

3. 파인튜닝: 기반 모델을 다듬기

사전학습 모델은 “다음 단어”는 잘 맞히지만 지시를 따르거나 대화하진 못한다. 추가 학습으로 다듬는다.

1
2
3
4
5
6
7
8
1. 지도 파인튜닝 (SFT):
   "지시-응답" 쌍 데이터로 추가 학습
   → 질문에 답하고 지시를 따르는 형태를 학습

2. 인간 선호 정렬 (RLHF / DPO):
   사람이 응답 쌍 중 더 나은 것을 고른 데이터로 학습
   → 유용하고 안전하고 정직한(helpful/harmless/honest) 방향으로 정렬
   RLHF: 보상 모델 + 강화학습 / DPO: 더 단순한 직접 선호 최적화
1
2
3
GPT 계열의 전형적 파이프라인:
  사전학습(수조 토큰) → SFT(수만 예시) → RLHF/DPO(선호 데이터)
  ↑ 능력 획득          ↑ 지시 따르기      ↑ 정렬·안전

4. 효율적 파인튜닝: LoRA

전체 파라미터를 다시 학습하는 것은 비싸다. LoRA는 작은 행렬만 학습한다.

1
2
3
4
5
6
전체 파인튜닝: 수십억 파라미터 전부 갱신 → GPU 메모리·비용 막대

LoRA (Low-Rank Adaptation):
  원본 가중치는 고정(freeze), 작은 저랭크 행렬 A·B만 추가 학습
  W' = W + B·A   (A,B는 매우 작음, 원본의 0.1~1%)
  ✅ 메모리·비용 대폭 절감, 어댑터만 교체해 여러 태스크 전환

5. 추론: 다음 토큰을 어떻게 고를까

학습된 모델은 다음 토큰의 확률 분포(Day 3)를 준다. 거기서 실제 토큰을 고르는 것이 디코딩이다.

1
2
3
4
5
6
7
8
Greedy: 항상 최고 확률 토큰 선택
  ✅ 결정적, 빠름  ❌ 반복적·단조로운 텍스트

Beam Search: 여러 후보 시퀀스를 동시에 추적해 전체 확률 최대화
  ✅ 번역 등 정확성 중시  ❌ 다양성 부족, 느림

Sampling: 확률 분포에서 무작위 추출
  ✅ 다양하고 창의적  ❌ 가끔 엉뚱함 → 아래 파라미터로 조절

6. 샘플링 파라미터: Temperature, Top-k, Top-p

1
2
3
4
5
6
7
8
9
Temperature (T): 확률 분포의 "날카로움" 조절
  T < 1: 분포가 뾰족 → 보수적·일관적 (사실 답변)
  T > 1: 분포가 평평 → 다양·창의적 (브레인스토밍)
  T = 0: greedy와 동일

Top-k: 확률 상위 k개 토큰 중에서만 샘플링 (꼬리 잘라냄)

Top-p (nucleus): 누적 확률 p가 될 때까지의 토큰 중에서 샘플링
  → 상황에 따라 후보 수가 동적으로 변함 (가장 널리 쓰임)
1
2
3
4
5
6
7
8
9
def sample(logits, temperature=0.8, top_p=0.9):
    logits = logits / temperature              # 1. 온도 조절
    probs = softmax(logits)
    # 2. 누적 확률 top_p까지만 남기고 나머지 0
    sorted_probs, idx = probs.sort(descending=True)
    cumulative = sorted_probs.cumsum(dim=-1)
    sorted_probs[cumulative > top_p] = 0
    # 3. 남은 분포에서 샘플링
    return idx[torch.multinomial(sorted_probs, 1)]

실무 감각: 코드·사실 답변은 낮은 temperature(0~0.3), 창작은 높게(0.8~1.0). API의 temperature/top_p 파라미터가 바로 이것이다.

7. Day 4 체크리스트

  1. 사전학습이 “다음 토큰 예측”이라는 단순 과제임을 이해했다.
  2. 자기지도학습이 레이블 없이 인터넷 규모 학습을 가능케 함을 안다.
  3. SFT와 RLHF/DPO로 기반 모델을 지시 따르기·정렬로 다듬는 과정을 파악했다.
  4. LoRA로 효율적 파인튜닝하는 원리를 이해했다.
  5. Greedy/Beam/Sampling과 Temperature·Top-p의 효과를 구분했다.

다음 편 예고

원리는 완성됐다. 하지만 거대 모델을 실제로 서빙하려면 속도·메모리 벽에 부딪힌다. 마지막 Day 5(시리즈 마무리)에서는 추론 최적화 — KV 캐시, 양자화, FlashAttention, 그리고 효율적 서빙을 다룬다.

This post is licensed under CC BY 4.0 by the author.