본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] Knowledge Distillation 온도(Temperature) 파라미터의 3가지 역할과 성능 차이 해결 방법

by Papa Martino V 2026. 4. 29.
728x90

Knowledge Distillation
Knowledge Distillation

 

딥러닝 모델의 경량화 기술 중 하나인 지식 증류(Knowledge Distillation)는 거대한 Teacher 모델의 지식을 효율적인 Student 모델로 이전하는 고도의 전략입니다. 이 과정에서 가장 핵심적인 변수는 바로 온도(Temperature, $T$) 파라미터입니다. 많은 개발자가 단순히 소프트맥스(Softmax) 함수의 분모에 들어가는 수치로만 이해하고 있지만, 이 파라미터는 모델이 학습하는 정보의 '농도'를 조절하는 결정적인 역할을 합니다. 본 가이드에서는 Python 환경에서 온도가 모델 성능에 미치는 통계적 근거와 실무적인 적용 기법을 심도 있게 분석합니다.


1. 지식 증류(Knowledge Distillation)와 온도의 정의

지식 증류의 핵심은 Teacher 모델이 내뱉는 'Soft Label'을 Student가 학습하게 하는 것입니다. 일반적인 분류 모델은 정답 클래스에만 1을 부여하는 Hard Label을 사용하지만, 이는 다른 클래스들 간의 상관관계 정보를 유실시킵니다. 온도는 소프트맥스 함수의 입력을 평탄하게 만들어(Smoothing), Student 모델이 정답 외의 클래스가 가진 잠재적 정보를 학습할 수 있도록 돕습니다.

수식적으로 소프트맥스 함수 $q_i$는 다음과 같이 정의됩니다:

$$q_i = \frac{\exp(v_i / T)}{\sum_j \exp(v_j / T)}$$

여기서 $T$가 커질수록 확률 분포는 더 부드러워지며, 이는 Student 모델이 Teacher의 복잡한 논리 구조를 모방할 수 있는 '부드러운 지식'을 생성하게 합니다.


2. 온도(Temperature) 변화에 따른 지식 전달 특성 비교

온도 설정값에 따라 모델이 학습하는 정보의 질과 양이 어떻게 달라지는지 비교 분석합니다.

설정값 (T) 확률 분포의 형태 주요 역할 및 특징 발생 가능한 문제
T = 1 (Normal) 날카로움 (Sharp) 가장 높은 확률값에 집중함 클래스 간 상관관계 학습 불가
T = 2 ~ 5 (Optimal) 중간 (Moderate) 클래스 간의 어두운 지식(Dark Knowledge) 추출 모델 복잡도에 따른 튜닝 필요
T > 10 (High) 매우 평탄함 (Flat) 모든 클래스의 확률이 유사해짐 유의미한 정보가 노이즈에 묻힘

3. 실무 적용을 위한 Python 개발자용 7가지 Example

PyTorch와 TensorFlow 라이브러리를 활용하여 실무에서 즉시 온도 파라미터를 제어하고 지식 증류를 구현할 수 있는 코드 예제입니다.

Example 1. PyTorch에서 온도가 적용된 Softmax 함수 구현

import torch
import torch.nn.functional as F

def temperature_softmax(logits, T):
    # Logits을 온도 T로 나누어 분포를 조절함
    return F.softmax(logits / T, dim=1)

# 사용 예시
logits = torch.tensor([[2.0, 1.0, 0.1]])
print("T=1:", temperature_softmax(logits, T=1.0))
print("T=5:", temperature_softmax(logits, T=5.0))

Example 2. KL Divergence를 활용한 Distillation Loss 계산

def distillation_loss(student_logits, teacher_logits, T):
    # 온도 T를 반영한 확률 분포 계산
    p_s = F.log_softmax(student_logits / T, dim=1)
    p_t = F.softmax(teacher_logits / T, dim=1)
    
    # KL Divergence 계산 및 T^2 곱하기 (그라디언트 스케일 보존)
    loss = F.kl_div(p_s, p_t, reduction='batchmean') * (T ** 2)
    return loss

Example 3. Student 모델 학습 루프 최적화 (PyTorch Style)

def train_step(student, teacher, data, target, optimizer, T, alpha):
    optimizer.zero_grad()
    
    s_logits = student(data)
    with torch.no_grad():
        t_logits = teacher(data)
        
    # Hard Loss (정답지)와 Soft Loss (지식 증류) 결합
    hard_loss = F.cross_entropy(s_logits, target)
    soft_loss = distillation_loss(s_logits, t_logits, T)
    
    total_loss = alpha * soft_loss + (1 - alpha) * hard_loss
    total_loss.backward()
    optimizer.step()
    return total_loss

Example 4. TensorFlow/Keras 기반 커스텀 Distiller 클래스

import tensorflow as tf

class Distiller(tf.keras.Model):
    def __init__(self, student, teacher):
        super(Distiller, self).__init__()
        self.teacher = teacher
        self.student = student

    def compile(self, optimizer, metrics, student_loss_fn, distillation_loss_fn, alpha=0.1, temperature=3):
        super(Distiller, self).compile(optimizer=optimizer, metrics=metrics)
        self.student_loss_fn = student_loss_fn
        self.distillation_loss_fn = distillation_loss_fn
        self.alpha = alpha
        self.temperature = temperature

    def train_step(self, data):
        x, y = data
        teacher_predictions = self.teacher(x, training=False)
        with tf.GradientTape() as tape:
            student_predictions = self.student(x, training=True)
            loss = self.student_loss_fn(y, student_predictions)
            distillation_loss = self.distillation_loss_fn(
                tf.nn.softmax(teacher_predictions / self.temperature, axis=1),
                tf.nn.softmax(student_predictions / self.temperature, axis=1)
            )
            total_loss = self.alpha * loss + (1 - self.alpha) * distillation_loss
        return {m.name: m.result() for m in self.metrics}

Example 5. 온도 스케줄링(Temperature Scheduling) 기법

학습 초기에 높은 온도로 시작해 점차 온도를 낮추는 기법입니다.

def get_scheduled_temperature(epoch, total_epochs, start_t=5.0, end_t=1.0):
    # 선형적으로 온도를 감소시키는 스케줄러
    t = start_t - (start_t - end_t) * (epoch / total_epochs)
    return max(t, end_t)

Example 6. Logits 분포 시각화를 통한 온도 검증

import matplotlib.pyplot as plt

def plot_temperature_effect(logits, temperatures):
    plt.figure(figsize=(12, 4))
    for i, T in enumerate(temperatures):
        probs = F.softmax(torch.tensor(logits) / T, dim=0).numpy()
        plt.subplot(1, len(temperatures), i+1)
        plt.bar(range(len(probs)), probs)
        plt.title(f"Temperature = {T}")
    plt.show()

Example 7. 성능 차이 해결을 위한 최적의 Alpha와 T 조합 탐색

def grid_search_kd_params():
    temperatures = [2, 4, 8]
    alphas = [0.3, 0.5, 0.7]
    # 실무에서는 각 조합에 대해 Validation Accuracy를 측정하여 최적의 파라미터를 선정함
    results = [(T, a) for T in temperatures for a in alphas]
    return results

4. 결론: 왜 온도가 모델의 성능 차이를 결정짓는가?

지식 증류에서 온도는 정보의 엔트로피를 제어하는 레버입니다. $T$가 낮으면 Student 모델은 Teacher가 가진 가장 강한 확신(Top-1 클래스)만을 배우게 되지만, $T$가 적절히 높으면 "고양이 모델이 강아지 클래스에 대해서도 일정 확률을 부여한 이유"와 같은 미세한 특징(Dark Knowledge)을 학습할 수 있게 됩니다. 이는 Student 모델의 일반화 성능을 비약적으로 상승시키는 해결책이 됩니다.


5. 내용 출처 및 참고 자료

  • Hinton, G., Vinyals, O., & Dean, J. (2015). Distilling the Knowledge in a Neural Network. arXiv preprint arXiv:1503.02531.
  • PyTorch Tutorials: Knowledge Distillation on CIFAR-10.
  • Keras Official Documentation: Knowledge Distillation Example.
  • Deep Learning Specialization by Andrew Ng (Coursera).
728x90