본문 바로가기
C.W.K.
Stream
Lesson 05 of 07 · published

지식 증류

~8 min · advanced

Level 0Keras 도제
0 XP0/97 lessons0/20 achievements
0/120 XP to next level120 XP to go0% complete

큰 모델의 지식을 작은 모델에 전달해

지식 증류는 작은 학생 모델이 큰 교사 모델의 최종 답뿐 아니라 전체 클래스 확률 분포까지 모방하게 해. 단단한 레이블은 '이건 7'이라고만 말하지만 교사의 softmax는 '7이 95%, 1이 4%, 나머지가 1%'라고 알려 줘. 1에 4%를 준 사실에는 클래스 사이의 닮음이 담겨 있어. Hinton이 어두운 지식이라 부른 이 신호 덕분에 증류된 학생은 같은 크기를 단단한 레이블만으로 처음부터 학습한 모델보다 자주 더 좋아.

두 손실을 합쳐 학습해

keras.Model을 상속하고 train_step()을 재정의해. 각 단계에서 같은 입력을 고정된 교사와 학생에 넣고, 실제 레이블에 대한 단단한 손실과 두 확률 분포 사이의 KL 발산인 부드러운 손실을 합쳐. alpha 가중치가 둘의 균형을 정해.

temperature로 분포의 부드러움을 조절해

temperature는 확률 분포를 얼마나 평평하게 할지 정해. softmax 전에 로짓을 1보다 큰 temperature로 나누면 가장 높은 값이 낮아지고 학생이 배울 작은 클래스 간 확률이 드러나. temperature=1이면 교사의 출력이 거의 원-핫이라 추가 정보가 적어. 조정할 하이퍼파라미터이며 보통 3~5에서 시작해.

Code

사용자 train_step()을 가진 Distiller 모델·python
class Distiller(keras.Model):
    def __init__(self, student, teacher, temperature=3.0, alpha=0.1):
        super().__init__()
        self.student = student
        self.teacher = teacher
        self.temperature = temperature
        self.alpha = alpha

    def train_step(self, data):
        x, y = data
        # Teacher predictions (soft labels)
        teacher_pred = self.teacher(x, training=False)

        # Student predictions
        student_pred = self.student(x, training=True)

        # Distillation loss (soft) + student loss (hard)
        loss = (
            self.alpha * hard_loss(y, student_pred) +
            (1 - self.alpha) * soft_loss(teacher_pred, student_pred)
        )
        ...

External links

Exercise

CIFAR-10에서 교사 ResNet50을 학습해. 학생 MobileNet은 두 방식으로 학습해: 단단한 레이블만 사용, 단단한 레이블과 교사의 부드러운 레이블을 KL 발산으로 함께 사용. 두 학생의 정확도를 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.