소개: 측정 정보
La 정보 이론1948년 Claude Shannon이 설립한 는 우리에게 도구를 제공합니다. 불확실성을 정량화하기 위해 메시지에 포함된 정보의 양을 측정합니다. 모델이 현실에 얼마나 잘 근접하는지 평가합니다. 머신러닝에서는 이러한 개념이 나타납니다. 어디에나: 교차 엔트로피 분류를 위한 기본 손실 함수 는 KL 발산 VAE 및 지식 증류의 핵심입니다.
무엇을 배울 것인가
- 정보 내용: -log(p)의 놀라운 점
- 엔트로피: 분포의 불확실성을 측정한 것
- 교차 엔트로피: 분류에 가장 많이 사용되는 손실
- KL 발산: 분포 간 비대칭 거리
- 상호 정보: 변수 간의 종속성
- 당혹감과 언어 모델과의 연관성
정보내용 : 서프라이즈
L'정보 내용 확률이 있는 사건의 (또는 자기 정보) p 해당 사건이 얼마나 "놀랐는지"를 측정합니다.
직관: 매우 가능성이 높은 사건(P \\대략 1) 정보가 거의 전달되지 않습니다(놀라움이 적음). 희귀한 사건(P \\대략 0) 많은 정보를 제공합니다(놀라움). 기본 2의 단위는 조금: 1비트 그리고 공정한 동전 던지기의 정보량.
엔트로피: 평균 불확실성
L'엔트로피 그리고 정보 내용의 기대 가치, 즉 중간 정도의 놀라움 배포판:
지속적인 배포의 경우:
기본 속성:
- H(X) \\geq 0 항상 (불확실성은 결코 부정적이지 않습니다)
- H(X) = 0 경우에만 X 결정론적(단일 사건의 확률은 1임)
- 높이(X) 균일 분포의 최대값(최대 불확실성)
Esempio: 공정한 동전을 위해 (P(T) = P(C) = 0.5), 엔트로피 e H = -0.5\\log_2(0.5) - 0.5\\log_2(0.5) = 1 조금. 조작된 동전의 경우 P(T) = 0.99, 엔트로피는 약 0.08 비트입니다. 불확실성이 거의 없으며 우리는 거의 항상 결과를 알고 있습니다.
import numpy as np
def entropy(probs):
"""Calcola entropia in bit (log base 2)."""
probs = np.array(probs)
probs = probs[probs > 0] # Evita log(0)
return -np.sum(probs * np.log2(probs))
# Moneta equa
print(f"Moneta equa: H = {entropy([0.5, 0.5]):.4f} bit")
# Moneta truccata
print(f"Moneta truccata (0.99): H = {entropy([0.99, 0.01]):.4f} bit")
# Dado a 6 facce (uniforme)
print(f"Dado equo: H = {entropy([1/6]*6):.4f} bit")
# Dado truccato (3 esce il 50%)
probs_loaded = [0.1, 0.1, 0.5, 0.1, 0.1, 0.1]
print(f"Dado truccato: H = {entropy(probs_loaded):.4f} bit")
교차 엔트로피: 분류의 손실
La 교차 엔트로피 실제 분포 사이 p 그리고 모델에 의해 예측된 분포 q 얼마나 많은 비트가 필요한지 측정 평균적으로 데이터를 인코딩하려면 p 사용하여 최적의 코드 q:
분류에서는, p 목표 분포(원-핫) e q 그리고 소프트맥스의 출력. 라벨이 있는 단일 샘플의 경우 y (원-핫) 및 예측 \\모자{y}:
이진 분류의 경우 다음과 같이 단순화됩니다. 이진 교차 엔트로피:
기본 연결: 교차 엔트로피를 최소화하는 것은 다음과 같습니다. 로그 가능성을 최대화 모델의. 이는 교차 엔트로피가 발생하는 이유를 설명합니다. 그리고 분류를 위한 자연 손실: 우리는 최대값을 할당하는 모델을 찾고 있습니다. 관측된 데이터에 대한 확률입니다.
import numpy as np
def cross_entropy(p, q):
"""Cross-entropy H(p, q) usando logaritmo naturale."""
q = np.clip(q, 1e-15, 1 - 1e-15) # Evita log(0)
return -np.sum(p * np.log(q))
def binary_cross_entropy(y_true, y_pred):
"""Binary cross-entropy per un singolo campione."""
y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)
return -(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
# Classificazione a 3 classi
y_true = np.array([0, 0, 1]) # Classe 3
# Predizione buona
y_pred_good = np.array([0.05, 0.05, 0.90])
print(f"Buona predizione: CE = {cross_entropy(y_true, y_pred_good):.4f}")
# Predizione mediocre
y_pred_mid = np.array([0.2, 0.3, 0.5])
print(f"Predizione media: CE = {cross_entropy(y_true, y_pred_mid):.4f}")
# Predizione sbagliata
y_pred_bad = np.array([0.7, 0.2, 0.1])
print(f"Predizione errata: CE = {cross_entropy(y_true, y_pred_bad):.4f}")
# Binary cross-entropy
print(f"\nBCE(y=1, pred=0.9) = {binary_cross_entropy(1, 0.9):.4f}")
print(f"BCE(y=1, pred=0.5) = {binary_cross_entropy(1, 0.5):.4f}")
print(f"BCE(y=1, pred=0.1) = {binary_cross_entropy(1, 0.1):.4f}")
KL 발산: 분포 간 거리
La KL 발산 (Kullback-Leibler)는 분포가 얼마나 되는지 측정합니다. q 참조 분포와 다릅니다. p:
중요한 속성:
- D_{\\text{KL}}(p \\| q) \\geq 0 항상(깁스 부등식)
- D_{\\text{KL}}(p \\| q) = 0 만약에 그리고 만약에 p = q
- 대칭이 아니다: D_{\\text{KL}}(p \\| q) \\neq D_{\\text{KL}}(q \\| p)
관계 H(p, q) = H(p) + D_{\\text{KL}}(p \\| q) 우리에게 말한다 교차 엔트로피와 엔트로피 p KL 다이버전스를 더한 것입니다. 한 H(p) 상수(모델에 따라 다름), 최소화하다 교차 엔트로피는 KL 발산을 최소화하는 것과 같습니다..
VAE의 KL 발산
에서 변형 자동 인코더, 손실에는 KL 발산 항이 포함됩니다. 잠재 분포가 표준 가우스에 가까워지도록 강제합니다.
import numpy as np
def kl_divergence(p, q):
"""KL divergence D_KL(p || q)."""
p = np.array(p, dtype=float)
q = np.array(q, dtype=float)
mask = p > 0
return np.sum(p[mask] * np.log(p[mask] / q[mask]))
# Due distribuzioni su 4 classi
p = np.array([0.25, 0.25, 0.25, 0.25]) # Uniforme
q1 = np.array([0.3, 0.2, 0.3, 0.2]) # Leggermente diversa
q2 = np.array([0.9, 0.03, 0.04, 0.03]) # Molto diversa
print(f"KL(p || q1) = {kl_divergence(p, q1):.6f}")
print(f"KL(p || q2) = {kl_divergence(p, q2):.6f}")
# Asimmetria della KL
print(f"\nKL(p || q1) = {kl_divergence(p, q1):.6f}")
print(f"KL(q1 || p) = {kl_divergence(q1, p):.6f}")
# KL per VAE (Gaussiana vs standard normal)
def kl_gaussian(mu, log_var):
"""KL divergence tra N(mu, sigma^2) e N(0, 1)."""
return -0.5 * np.sum(1 + log_var - mu**2 - np.exp(log_var))
mu = np.array([0.5, -0.3, 0.1])
log_var = np.array([-0.5, 0.2, -0.1])
print(f"\nKL(N(mu,sigma^2) || N(0,1)) = {kl_gaussian(mu, log_var):.4f}")
상호 정보
La 상호 정보 무작위 변수가 얼마나 많은 정보를 가지고 있는지 측정합니다. 다른 제공:
Se 나는(X; Y) = 0, 변수는 독립적입니다. ML에서는 상호 정보를 제공하고 다음 용도로 사용됩니다. 기능 선택 (가장 유익한 기능을 선택하세요), 클러스터링 평가 및 목표로InfoNCE 손실 대조 학습.
당혹감: 언어 패턴 평가
La 당황 언어 모델을 평가하기 위한 표준 측정항목입니다. 그리고 다음과 같이 정의됩니다. 토큰당 평균 교차 엔트로피의 지수:
당혹감 k 이는 평균적으로 모델 e가 그는 둘 중 하나를 균일하게 선택해야 하는 것처럼 "혼란스럽다". k 옵션 모든 단계에서. Perplexity가 낮을수록 모델이 더 좋습니다.
ML과의 요약 및 연결
기억해야 할 핵심 사항
- 엔트로피 높이(X): 균일 분포에 대한 불확실성, 최대값을 측정합니다.
- 교차 엔트로피 H(p,q): 분류를 위한 표준 손실
- KL 발산: VAE에서 사용되는 분포 간의 거리(비대칭)
- 교차 엔트로피 최소화 = 로그 가능성 최대화 = KL 최소화
- 상호 정보: 특징 선택 및 대조 학습에 사용되는 의존성 측정
- 당황: 언어 모델의 표준 측정항목으로, 낮을수록 더 좋고
다음 기사에서: 우리는 탐구할 것이다 PCA 및 차원 축소. 공분산 행렬, 고유 벡터 및 SVD를 사용하여 데이터를 압축하는 방법을 살펴보겠습니다. 대부분의 정보를 유지합니다.







