[CS300 #274] 대규모 언어 모델의 학습 과정 — 사전학습, 지시 조정, 선호 정렬
컴퓨터공학 300 주제 시리즈의 274번째 글이다. 전체 지도는 여기.
한 줄 요약
대규모 언어 모델(LLM)은 방대한 텍스트로 다음 토큰 예측을 학습해 언어와 지식을 익히고(사전학습), 지시-응답 예시로 대화 형식을 배운 뒤(지도 미세조정), 사람의 선호를 반영하도록 다시 조정된다(RLHF 등 정렬).
왜 필요한가
LLM 을 쓰다 보면 이상한 행동을 만난다. 그럴듯하지만 틀린 사실을 지어내고, 같은 질문에 다른 답을 하고, 특정 날짜 이후의 일을 모른다. 이런 행동은 대부분 학습 과정에서 설명된다.
- 그럴듯한 오답은 “다음에 올 법한 토큰”을 배우는 목적 함수에서 나온다. 목적이 “참”이 아니라 “그럴듯함”이다.
- 지식이 멈춘 날짜는 사전학습 데이터를 모은 시점이다.
- 공손하고 지시를 따르는 태도는 사전학습이 아니라 이후 단계에서 붙은 것이다.
학습 과정을 알면 모델의 실패를 예측하고, 프롬프트·RAG·미세조정 중 무엇으로 문제를 풀지 판단할 수 있다.
핵심 개념
0단계 — 토큰화
텍스트를 정수 시퀀스로 바꾼다. 단어 단위는 어휘가 무한히 늘고, 글자 단위는 시퀀스가 너무 길다. 그래서 자주 나오는 글자 조각을 합쳐 가는 BPE(byte pair encoding) 계열의 하위 단어 토큰화를 쓴다. 긴 영어 단어가 접두사·어간·접미사 비슷한 조각 몇 개로 나뉘는 식이다. 실제로 어떻게 쪼개지는지는 토크나이저마다 다르다. 토큰화는 언어마다 효율이 다르다. 학습 데이터에 적게 나온 언어는 같은 내용이 더 많은 토큰으로 쪼개지는 경향이 있고, 그만큼 비용과 컨텍스트를 더 쓴다.
1단계 — 사전학습
목적 함수는 단 하나다.
L = − Σ_t log P(x_t | x_1, ..., x_{t−1})
앞 토큰들을 보고 다음 토큰의 확률을 높인다. 정답은 데이터 자체에 있으므로 사람의 라벨이 필요 없다(자기지도). 웹 문서, 책, 코드 등 대규모 텍스트로 트랜스포머 디코더를 학습한다.
이 단순한 과제를 아주 큰 규모로 하면 문법, 사실 지식, 추론 비슷한 능력이 생긴다. 문맥을 잘 예측하려면 그런 것을 알아야 하기 때문이다. GPT-3 논문(Brown 외, 2020)은 이렇게 학습한 모델이 프롬프트에 예시 몇 개만 주면 새 과제를 수행하는 문맥 내 학습(few-shot)을 보였다.
스케일링 법칙: Kaplan 외(2020)는 손실이 모델 크기, 데이터 양, 계산량에 대해 거듭제곱 법칙으로 줄어드는 경향을 보고했다. Hoffmann 외(2022, Chinchilla)는 주어진 계산 예산에서는 모델 크기와 학습 토큰 수를 비슷한 비율로 함께 늘려야 최적이며, 당시 큰 모델들이 데이터 대비 지나치게 컸다고 분석했다.
사전학습이 끝난 베이스 모델은 문서를 이어 쓰는 기계다. “프랑스의 수도는?” 이라고 물으면 답하는 대신 “독일의 수도는? 이탈리아의 수도는?” 처럼 퀴즈 목록을 이어 쓸 수 있다.
2단계 — 지도 미세조정(SFT)
사전학습에 비하면 아주 적은 양의, 사람이 작성한 (지시, 좋은 응답) 쌍으로 같은 다음 토큰 예측을 계속한다. 다만 손실은 응답 부분에만 건다. 모델은 “질문이 오면 답한다”는 대화 형식을 배운다.
3단계 — 선호 정렬
좋은 답을 직접 쓰기보다 두 답 중 어느 것이 나은지 고르기가 사람에게 훨씬 쉽다. 이것을 이용한다.
RLHF (Ouyang 외, 2022 InstructGPT)
① 같은 프롬프트에 대한 응답 여러 개를 사람이 순위 매김
② 그 순위를 맞히는 보상 모델(RM) 학습
③ 보상 모델 점수를 최대화하도록 LLM 을 강화학습(PPO)으로 조정
+ 원래 모델에서 너무 멀어지지 않도록 KL 벌점
KL 벌점이 없으면 모델이 보상 모델의 허점을 파고들어 점수만 높고 이상한 답을 낸다(보상 해킹). 이후 보상 모델 없이 선호 쌍에서 바로 학습하는 DPO 같은 방법, AI 의 피드백과 원칙 목록을 쓰는 Constitutional AI(Bai 외, 2022) 같은 방법이 나왔다.
한눈에 보기
| 단계 | 데이터 | 목적 | 결과 |
|---|---|---|---|
| 사전학습 | 대규모 원문 텍스트 | 다음 토큰 예측 | 지식·언어 능력을 가진 베이스 모델 |
| SFT | 지시-응답 예시 | 응답 토큰 예측 | 대화 형식을 따르는 모델 |
| 선호 정렬 | 응답 비교 데이터 | 선호 점수 최대화 | 유용하고 해롭지 않게 조정된 모델 |
생성 — 학습이 아니라 샘플링
학습이 끝난 모델은 다음 토큰의 확률 분포를 낸다. 거기서 하나를 고르는 방식이 디코딩이다. 가장 높은 것만 고르면(탐욕) 반복에 빠지기 쉽고, 온도(temperature)를 높여 분포를 평평하게 하거나 상위 p 누적 확률 안에서만 뽑으면(top-p) 다양해진다. 같은 질문에 다른 답이 나오는 이유다.
직접 해 보기
트랜스포머 대신 가장 단순한 언어 모델인 바이그램(앞 한 단어만 보고 다음 단어 확률)을 세어서 만든다. 목적 함수, 평가(퍼플렉서티), 생성의 구조는 LLM 과 같다.
import math
from collections import Counter, defaultdict
corpus = "the cat sat on the mat . the dog sat on the log . the cat saw the dog .".split()
test = "the dog sat on the mat .".split()
V = sorted(set(corpus))
big = defaultdict(Counter)
for a, b in zip(corpus, corpus[1:]): big[a][b] += 1
def p(b, a, k=1.0): # 라플라스 평활
return (big[a][b] + k) / (sum(big[a].values()) + k * len(V))
def nll(seq):
return -sum(math.log(p(b, a)) for a, b in zip(seq, seq[1:])) / (len(seq) - 1)
ce = nll(test)
print(f"어휘 {len(V)}개, 균등 분포 기준 퍼플렉서티 = {len(V)}")
print(f"테스트 교차 엔트로피 = {ce:.3f} nats, 퍼플렉서티 = {math.exp(ce):.2f}")
print("'the' 다음 확률 상위:", [(w, round(p(w, 'the'), 3)) for w, _ in big['the'].most_common(3)])
# 탐욕적 생성
w, out = "the", ["the"]
for _ in range(6):
w = max(V, key=lambda b: p(b, w)); out.append(w)
print("탐욕 생성:", " ".join(out))
실행 결과:
어휘 9개, 균등 분포 기준 퍼플렉서티 = 9
테스트 교차 엔트로피 = 1.590 nats, 퍼플렉서티 = 4.90
'the' 다음 확률 상위: [('cat', 0.2), ('dog', 0.2), ('mat', 0.133)]
탐욕 생성: the cat sat on the cat sat
- 퍼플렉서티 = exp(평균 교차 엔트로피). “평균적으로 몇 개 후보 중에서 고르는 것만큼 헷갈리는가”로 읽는다. 아무것도 모르면 어휘 크기인 9, 우리 모델은 4.9 다. 학습이 불확실성을 줄였다.
- 라플라스 평활(+1)은 학습에 한 번도 안 나온 조합의 확률이 0 이 되어 손실이 무한대가 되는 것을 막는다.
- 탐욕 생성은 “the cat sat on the cat sat” 처럼 반복에 빠졌다. 앞 한 단어만 보니 “the” 다음엔 늘 “cat” 이다. 더 긴 문맥을 보는 모델(트랜스포머)과 샘플링이 필요한 이유를 축소판으로 보여 준다.
현업에서는
- 문제를 어느 단계에서 풀지 고른다. 최신 사내 지식이 필요하면 학습이 아니라 검색(RAG)이 맞다. 출력 형식이나 말투를 고정하려면 프롬프트나 소규모 미세조정. 새로운 언어·도메인 능력 자체가 필요할 때만 추가 사전학습을 검토한다.
- 파라미터 효율 미세조정: 전체 가중치 대신 작은 저차원 행렬만 학습하는 LoRA(Hu 외, 2021) 같은 방법으로 단일 GPU 에서도 미세조정한다.
- 토큰이 곧 비용이다. API 요금, 지연, 컨텍스트 한도가 모두 토큰 수 기준이다. 같은 내용이라도 언어와 형식(JSON, 표)에 따라 토큰 수가 달라지므로 실제 토큰화로 재 보는 습관이 필요하다.
확인 문제
- 사전학습의 목적 함수를 한 문장으로 쓰라.
- 베이스 모델이 질문에 답하지 않고 질문 목록을 이어 쓸 수 있는 이유는?
- RLHF 에서 KL 벌점의 역할은?
- 퍼플렉서티가 어휘 크기와 같다는 것은 무엇을 뜻하는가?
- 회사의 지난주 장애 보고서 내용을 모델이 답하게 하려면 재학습과 RAG 중 무엇이 적합한가?
풀이
- 앞의 토큰들이 주어졌을 때 실제 다음 토큰의 로그 확률을 최대화(음의 로그 우도를 최소화)한다.
- 사전학습은 문서를 그럴듯하게 이어 쓰는 것만 배웠고, 질문 목록 형태의 문서도 학습 데이터에 흔하기 때문이다. 질문에 답하는 형식은 SFT 에서 배운다.
- 정렬 중인 모델이 원래 모델의 분포에서 너무 멀어지지 않게 해, 보상 모델의 허점을 파고드는 보상 해킹과 언어 능력 붕괴를 막는다.
- 모델이 모든 단어를 균등하게 찍는 것과 같은 수준, 즉 아무것도 배우지 못했다는 뜻이다.
- RAG. 자주 바뀌는 최신 정보는 검색해서 컨텍스트로 넣는 편이 빠르고 싸며 출처를 댈 수 있다.
더 읽을거리 (References)
- T. Brown 외, “Language Models are Few-Shot Learners”, 2020. arXiv:2005.14165
- L. Ouyang 외, “Training language models to follow instructions with human feedback”, 2022. arXiv:2203.02155
- J. Hoffmann 외, “Training Compute-Optimal Large Language Models”, 2022. arXiv:2203.15556 / J. Kaplan 외, “Scaling Laws for Neural Language Models”, 2020. arXiv:2001.08361
- R. Sennrich, B. Haddow, A. Birch, “Neural Machine Translation of Rare Words with Subword Units”, 2015. arXiv:1508.07909