Active Learning (AL)
1. Introduction
-
배경: 높은 Labeling 비용
-
아이디어: Unlabeled data 중, labeling을 할 데이터를 능동적으로 선택
-
주요 특징 및 개념
-
Label Efficiency: 모든 데이터를 라벨링하지 않고도 성능 향상 가능.
-
Query Strategy: 모델이 가장 정보가 될 만한 데이터를 “질문”해서 라벨을 요청.
-
Iteration: 모델 학습 → informative sample 선택 → 라벨 요청 → 학습 반복.
-
2. 주요 쿼리 전략 (Query Strategies)
- Uncertainty Sampling
- 모델이 가장 불확실해하는 샘플 선택 (e.g., 가장 낮은 softmax confidence)
- Query by Committee (QBC)
- 여러 모델로 구성된 committee 간 예측 불일치가 큰 샘플 선택
- Expected Model Change / Expected Error Reduction
- 어떤 샘플을 학습하면 성능이 얼마나 향상될지를 예측하여 선택
- Core-set Approaches
- 데이터 분포 전체를 대표할 수 있는 샘플 집합 선택
3. Uncertainty-based Methods
기본 아이디어
모델이 예측에 가장 확신이 없는 샘플을 선택
(1) Least Confidence (최소 신뢰도)
한 줄 요약: 가장 높은 softmax 확률값이 낮은 샘플 선택
- 수식: \(LC(x) = 1 - \max_{c} P(y=c \mid x)\)
- 예시:
- Sample A: [0.95, 0.03, 0.02] → LC = 0.05
- Sample B: [0.45, 0.35, 0.20] → LC = 0.55 → B 선택
- 장/단점
- 장점: 간단 + 직관적
- 단점: 2번째 확신 수준 고려 X
(2) Margin Sampling
한 줄 요약: 가장 확신 높은 두 클래스 간의 예측 차이로 불확실성 측정
- 수식: \(\text{Margin}(x) = P(y=c_1) - P(y=c_2) \quad (c_1, c_2: \text{top-2 classes})\)
- 예시:
- Sample A: [0.8, 0.15, 0.05] → margin = 0.65
- Sample B: [0.41, 0.39, 0.2] → margin = 0.02 → B 선택
- 장/단점
- 장점: 경쟁 클래스 (1등 vs. 2등) 반영
- 단점: 전체 분포 고려 X
(3) Entropy Sampling
한 줄 요약: 예측 분포 전체의 불확실성 측정
- 수식: \(H(x) = -\sum_{c} P(y=c \mid x) \cdot \log P(y=c \mid x)\)
- 예시:
- Sample A: [1.0, 0.0, 0.0] → H = 0 (확신)
- Sample B: [0.34, 0.33, 0.33] → H ≈ 1.58 (최대 불확실성)
- 장/단점
- 장점: 전체 분포 고려
- 단점: softmax 확률이 실제 확신을 반영하지 않을 수 있음
(4) Variation Ratios
한 줄 요약: 여러 번 예측 (e.g., dropout) 후 가장 자주 예측된 클래스의 비율로 불확실성 측정
- 수식: \(VR(x) = 1 - \frac{\text{mode count}}{T}\)
- \(T\) = sampling 횟수
- 예시:
- 모델이 샘플 x를 10번 예측 → 6번 클래스 A, 4번 클래스 B → VR = 0.4
3. 코드
위의 2-(3) Entropy Sampling 코드 예시
import torch
import torch.nn.functional as F
def compute_entropy(logits):
probs = F.softmax(logits, dim=1)
log_probs = F.log_softmax(logits, dim=1)
entropy = -torch.sum(probs * log_probs, dim=1)
return entropy
# logits: [batch_size, num_classes]
logits = model(unlabeled_batch)
entropy_scores = compute_entropy(logits)
# Top-K 불확실한 샘플 선택
topk_indices = torch.topk(entropy_scores, k=K).indices
selected_samples = unlabeled_batch[topk_indices]