15장. 모델 경량화: 양자화, 프루닝, 지식증류
지식증류
경험 많은 선배가 신입에게 일을 가르칠 때, 정답만 알려 주지 않고 "이건 거의 확실하고, 저건 좀 헷갈리는데 이쪽일 것 같아"처럼 생각의 결까지 알려 줍니다. 지식증류는 큰 모델(선생님)의 답이나 확률로 작은 모델(학생)을 가르쳐, 학생이 작은 몸집으로 선생님에 가까운 실력을 내게 합니다.
1번에서 이미 학습한 큰 선생님 모델을 준비합니다. 2번에서 정답 표시가 없는 데이터에도 선생님이 답(또는 보기마다의 확률)을 붙입니다. 3번에서 작은 학생 모델이 그 답을 흉내 내도록 학습합니다. 4번에서 학생의 크기와 실력을 선생님과 견줍니다. 여기서 선배가 선생님 모델, 생각의 결이 소프트 레이블입니다.
무엇을 흉내 내나
| 방법 | 학생이 배우는 것 | 예 |
|---|---|---|
| 하드 레이블 | 선생님이 고른 답 하나 | 선생님이 "3"이라고 한 그림을 3 으로 |
| 소프트 레이블(KD) | 보기마다의 확률. 온도 T 로 부드럽게 | 3 일 확률 0.9, 8 일 확률 0.07 |
| 글 단위(LLM) | 선생님 LLM 이 쓴 답 글 | 큰 LLM 의 답으로 작은 LLM 을 SFT(12장와 같은 방법) |
온도로 확률을 부드럽게
import numpy as np
logits = np.array([8.0, 2.0, 5.0]) # 선생님의 점수(보기 셋)
for T in (1, 4):
p = np.exp(logits / T) / np.exp(logits / T).sum() # 온도로 나눠 소프트맥스
print(f"T={T}:", p.round(3)) # T 가 크면 2등, 3등의 확률도 드러난다코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
logits = np.array([8.0, 2.0, 5.0]) | logit(로짓)은 모델이 보기마다 매긴 점수로, 아직 확률로 바꾸기 전의 값이다 |
logits / T | 점수를 온도 T 로 나눈다. T 가 크면 점수 차이가 작아진다 |
np.exp(...) | exponential(지수 함수)이다. e 의 거듭제곱으로 바꿔 모든 값을 양수로 만든다 |
... / np.exp(...).sum() | 합으로 나눠 모두 더하면 1 이 되게 한다. 이 두 단계가 소프트맥스(softmax)다 |
p.round(3) | 소수점 아래 세 자리로 반올림해 찍는다 |
이 코드가 뜻하는 것
선배가 신입에게 답을 알려 줄 때, 단호하게 말할 수도 있고 "이게 제일 같지만 저것도 꽤 그럴듯해"처럼 부드럽게 말할 수도 있습니다. 여기서 말투의 단호함이 온도 T 이고, T 를 키우면 부드러운 말투가 됩니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
logits = ... | 보기 셋에 8, 2, 5 점을 매긴다 | 선배의 속마음 점수 |
for T in (1, 4): | 온도 1 과 4 로 바꿔 본다 | 단호하게, 부드럽게 |
p = np.exp(logits / T) / ... | 점수를 확률로 바꾼다 | 속마음을 말로 옮긴다 |
print(f"T={T}:", p.round(3)) | 보기마다의 확률을 찍는다 | 신입이 듣는 말 |
결과에서 T=1 은 [0.95, 0.002, 0.047] 로 첫째 보기에 거의 다 몰립니다. T=4 는 [0.59, 0.132, 0.279] 로 둘째, 셋째 보기의 확률이 눈에 띄게 커집니다. 셋째 보기(5점)가 둘째(2점)보다 그럴듯하다는 정보가 학생에게 또렷하게 전해집니다. 이 덜 확실한 순서가 소프트 레이블이 전하는 "생각의 결"입니다.
주의할 점
- 학생은 선생님을 넘기 어렵습니다. 선생님의 틀린 답도 함께 배웁니다.
- 다른 회사의 LLM 으로 만든 답을 학습에 쓰면 그 서비스의 약관(경쟁 모델 학습 금지 등)을 어길 수 있습니다. 라이선스가 허락하는 오픈 모델을 선생님으로 씁니다.