•
Deep Learning Model을 사용하다 보면, Distillation을 활용해 Teacher Model의 Knowledge를 Student에 Distillation해야할 때가 잦아지는데요, 가끔 D(P||Q)의 순서와 역할에 대해서 헷갈릴 때가 있습니다.
•
저도 헷갈릴 때가 많기에, 아래처럼 보다 근본적으로 KLD의 작동원리를 풀어놓은 글을 간략히 작성해놓았으니 많은 참고 부탁드립니다!
KL-Divergence vs. Cross Entropy
H(P,Q) = -Σ P(x) * log(Q(x)) # 크로스 엔트로피
H(P) = -Σ P(x) * log(P(x)) # P의 엔트로피
D_KL(P||Q) = Σ P(x) * log(P(x)/Q(x)) # KL Divergence
# 관계 증명
H(P) + D_KL(P||Q) = -Σ P(x)log(P(x)) + Σ P(x)log(P(x)/Q(x))
= -Σ P(x)log(P(x)) + Σ P(x)log(P(x)) - Σ P(x)log(Q(x))
= -Σ P(x)log(Q(x))
= H(P,Q)
Python
복사
•
H(P,Q): 크로스 엔트로피
•
H(P): P의 엔트로피
•
D_KL(P||Q): P에서 Q까지의 KL Divergence
•
Classification Problem에서 실제 분포 P가 one-hot vector일 때:
◦
H(P) = 0 (Entropy가 없는 분포)
◦
따라서 H(P,Q) = D_KL(P||Q)
◦
이것이 Cross Entropy가 실제로는 KL Divergence를 최소화하는 것과 같은 이유
Forward KL vs. Reverse KL
(그림은 이해를 위해 참고만)
•
Forward KL: D_KL(P||Q)
◦
P의 모든 모드(mode)를 Q가 커버하도록 함
◦
Mean-seeking 특성
◦
Q가 P의 모든 중요한 영역을 포함하려 함
▪
example
# Teacher(P)가 두 개의 클래스에 대해 다음과 같은 확률을 출력:
P = [0.6, 0.4]
# Student(Q)가 한 클래스만 집중한다면:
Q = [0.9, 0.1]
# Forward KL에서는:
loss = 0.6 * log(0.6/0.9) + 0.4 * log(0.4/0.1)
# 0.4 * log(0.4/0.1) 항이 매우 큰 페널티 발생!
Python
복사
⇒ Distillation 관점에서 보면 P(Teacher)의 모든 Distribution(지식)을 Q(Student)가 학습해야 loss가 작아짐
•
Reverse KL: D_KL(Q||P)
◦
Q가 P의 한 모드(mode)에 집중하도록 함
◦
Mode-seeking 특성
◦
Q가 P의 한 부분에 집중하여 근사하려 함
▪
example
# Teacher(P)가 두 개의 클래스에 대해 다음과 같은 확률을 출력:
P = [0.6, 0.4]
# Student(Q)가 한 클래스만 집중한다면:
Q = [0.9, 0.1]
# 같은 상황에서 Reverse KL은:
loss = 0.9 * log(0.9/0.6) + 0.1 * log(0.1/0.4)
# 두 번째 모드를 무시해도 페널티가 작음!
Python
복사
⇒ Distillation 관점에서 보면 Q(Student)가 P(Teacher)의 일부 Distribution(지식)만 학습해도 loss가 작아질 수 있음