라벨링, 아직도 다 하고 계세요?

이미지 분류 태스크에 50만 장의 이미지가 있다고 가정해봅시다. 한 장당 20초씩 잡아도 2,700시간이 넘게 걸려요. 사람이 하루 8시간씩 일한다고 쳐도 1년 넘게 라벨링만 해야 한다는 뜻이죠. 😱

그런데 여기서 진짜 문제는 시간이 아니에요. 대부분의 샘플이 모델 학습에 별 도움이 안 된다는 것입니다. 비슷한 고양이 사진 10만 장을 라벨링해봤자, 모델이 얻는 정보량은 고작 몇 장 수준이에요.

이때 등장하는 게 바로 **Active Learning(능동 학습)**입니다. 핵심 아이디어는 단순해요.

"모델아, 네가 진짜 헷갈리는 샘플만 사람한테 물어봐."

라벨링이 비싸고 느린 환경(의료, 금융, 자율주행 등)에서 특히 빛을 발하는 기법인데요, 이 글에서는 실무에서 바로 쓸 수 있는 세 가지 쿼리 전략을 파이썬 코드와 함께 다뤄볼게요.

  1. Uncertainty Sampling — 모델이 가장 헷갈려 하는 샘플 선택
  2. Diversity Sampling — 데이터 공간에서 희소한 영역의 샘플 선택
  3. Query by Committee — 여러 모델의 의견이 갈리는 샘플 선택

전체 워크플로우와 노트북은 근거자료에서 확인할 수 있어요.


왜 Active Learning이 실무에서 중요한가

결정 경계 근처의 샘플이 진짜 보물

모델이 가장 불확실한 지점은 보통 결정 경계(decision boundary) 근처예요. 이 영역의 샘플 하나는 명백한 positive 샘플 열 개보다 정보량이 많아요.

자율주행 모델을 예로 들어볼게요. 주차된 차 뒤에서 갑자기 튀어나오는 자전거 같은 long-tail 케이스는 원본 데이터 수집 단계에서는 거의 안 잡혀요. Active Learning을 쓰면 이런 희귀 케이스가 모델에 의해 먼저 surface되고, 사람이 그것만 검토하면 됩니다.

사기 탐지(fraud detection)도 마찬가지예요. 명백한 정상 거래와 명백한 사기 거래 사이의 애매한 케이스만 사람이 검토하도록 모델이 안내해줄 수 있어요.

💡 실무 팁: 국내 SI/금융권 프로젝트에서 라벨링 인력이 한정적일 때, Active Learning은 '라벨러가 하루에 검토할 수 있는 샘플 수'를 그대로 두고도 모델 성능을 끌어올리는 가장 현실적인 카드예요.

Data scientist reviewing unlabeled dataset distribution on dashboard for active learning pipeline Software Concept Art

전략 1: Uncertainty Sampling — 가장 먼저 시도할 기본기

가장 구현이 쉽고 초기 성능 향상이 커서, 실무에서 제일 먼저 시도하는 전략이에요.

워크플로우

  1. 소량의 초기 라벨 데이터로 모델 학습
  2. Unlabeled pool에 대해 확률 예측
  3. 결정 경계(0.5)에 가장 가까운 샘플 선택
  4. 사람이 라벨링 → 재학습 → 반복

초기 모델이 좋을 필요는 전혀 없어요. 그냥 대략적인 확률 추정만 해주면 됩니다.

코드: Cross-Validation으로 첫 모델 만들기

from sklearn.model_selection import StratifiedKFold, GridSearchCV
from sklearn.linear_model import LogisticRegression
import numpy as np

# 라벨 데이터를 학습/검증 폴드로 분할
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# 과적합 방지를 위해 가벼운 그리드 서치
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10]}
base_model = LogisticRegression(max_iter=1000)

grid = GridSearchCV(base_model, param_grid, cv=skf, scoring='f1')
grid.fit(X_labeled, y_labeled)

print(f"Best params: {grid.best_params_}")
print(f"Best F1: {grid.best_score_:.4f}")

코드: Unlabeled 데이터 스코어링 및 불확실 영역 샘플 선택

# Unlabeled pool에 대한 양성 클래스 확률 예측
probs = grid.best_estimator_.predict_proba(X_unlabeled)[:, 1]

# 결정 경계(0.5) 근처 밴드 설정 (예: 0.45 ~ 0.55)
uncertainty_window = (probs > 0.45) & (probs < 0.55)
uncertain_indices = np.where(uncertainty_window)[0]

print(f"불확실 샘플 수: {len(uncertain_indices)}")

# 다음 배치로 라벨링 요청할 샘플
next_batch_X = X_unlabeled[uncertain_indices]
next_batch_indices = uncertain_indices

⚠️ 주의사항

  • 너무 좁은 영역만 파다가 편향될 수 있어요. 몇 번 반복 후엔 반드시 Diversity Sampling과 섞어주세요.
  • 모델의 확률 추정 자체가 부정확하면(예: 캘리브레이션 안 된 딥러닝 모델) 효과가 반감돼요.
  • 반복할수록 불확실 영역이 좁아지는데, 이게 plateau에 도달하면 전략을 바꿔야 한다는 신호예요.

전략 2: Diversity Sampling — 데이터 공간의 빈 곳을 채워라

Uncertainty Sampling을 몇 라운드 돌리다 보면 비슷한 edge case만 계속 뽑히는 현상을 겪게 돼요. 이때 Diversity Sampling으로 전환할 타이밍이에요.

아이디어

  • 밀집 클러스터 안의 샘플 → 이미 학습한 것과 비슷할 확률 높음
  • 희소 영역의 샘플 → 아직 커버 못 한 feature space

KNN으로 각 샘플의 최근접 이웃까지의 평균 거리를 계산해서, 거리가 먼 샘플을 우선 라벨링합니다.

코드: KNN 기반 Diversity 샘플링

from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler

# 거리 계산 전 반드시 스케일링 (Euclidean 거리 기반이므로)
scaler = StandardScaler()
X_unlabeled_scaled = scaler.fit_transform(X_unlabeled)

# 각 샘플의 k개 최근접 이웃까지 평균 거리 계산
k = 10
nbrs = NearestNeighbors(n_neighbors=k + 1, metric='euclidean').fit(X_unlabeled_scaled)
distances, _ = nbrs.kneighbors(X_unlabeled_scaled)

# 자기 자신 제외하고 평균 거리
avg_distances = distances[:, 1:].mean(axis=1)

# 평균 거리가 큰(희소 영역) 샘플 top-N 선택
batch_size = 55
diverse_indices = np.argsort(avg_distances)[-batch_size:]

print(f"선택된 diverse 샘플 수: {len(diverse_indices)}")

배치 사이즈는 보통 50~60개 정도가 실무에서 다루기 좋아요. 라벨링 후 재학습하고, 확률 분포를 다시 그려보면서 다음 라운드 전략을 결정하면 됩니다.

💡 실무 팁: 국내 추천 시스템이나 이상 탐지 프로젝트에서 라벨 데이터가 특정 사용자군에 편중되어 있을 때, Diversity Sampling이 편향을 완화하는 데 특히 효과적이에요.

Python code editor showing uncertainty sampling and KNN diversity selection implementation Development Concept Image

전략 3: Query by Committee — 모델들의 의견 충돌을 활용하라

단일 모델 대신 **여러 모델의 위원회(committee)**를 구성하고, 의견이 갈리는 샘플을 라벨링 대상으로 삼는 전략이에요.

왜 효과적일까?

서로 다른 학습 알고리즘(선형, 트리, 커널)은 데이터를 다르게 봐요. 여러 모델이 동시에 같은 예측을 내면 그 샘플은 정보량이 적고, 의견이 갈리면 결정 경계 근처의 어려운 샘플이라는 뜻이에요.

코드: 3종 모델로 Committee 구성

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

def train_committee(X_labeled, y_labeled):
    """현재 라벨 데이터로 서로 다른 3종 모델 학습"""
    committee = {
        'lr': LogisticRegression(C=0.001, max_iter=1000),
        'rf': RandomForestClassifier(n_estimators=100, max_depth=7, min_samples_leaf=4, random_state=42),
        'svm': SVC(C=1, probability=True, random_state=42),
    }
    for name, model in committee.items():
        model.fit(X_labeled, y_labeled)
    return committee

committee = train_committee(X_labeled, y_labeled)

코드: Committee 불일치 점수 계산

# 각 모델의 양성 클래스 확률 수집
committee_probs = np.column_stack([
    model.predict_proba(X_unlabeled)[:, 1]
    for model in committee.values()
])

# 모델 간 분산 = disagreement score
disagreement_scores = committee_probs.var(axis=1)

# 불일치가 큰 top 샘플 선택
batch_size = 55
disagree_indices = np.argsort(disagreement_scores)[-batch_size:]

print(f"선택된 disagreement 샘플 수: {len(disagree_indices)}")

Stacking으로 성능까지 챙기기

Committee의 각 모델 예측값을 feature로 쌓아 **메타 모델(stacking layer)**을 학습하면 성능이 크게 향상돼요.

ModelBest ParamsF1PrecisionRecall
LogisticRegressionC=0.0010.76880.69750.8564
RandomForestdepth=7, leaf=4, n=1000.87530.87180.8806
ExtraTreesdepth=7, leaf=6, n=1000.87720.86190.8977
SVMC=10.92580.96360.8936
Stacking (LR)C=0.10.93600.92230.9500

Stacking 후 Recall이 0.95까지 올라가는 게 핵심이에요. Precision은 소폭 희생되지만, 양성 샘플을 놓치면 치명적인 도메인(의료, 사기 탐지)에서는 이 트레이드오프가 충분히 가치 있어요.

세 전략, 언제 뭘 써야 할까?

상황추천 전략
라벨 데이터가 적고, 초기 성능 향상이 급함Uncertainty Sampling
Uncertainty가 plateau에 도달, 편향 우려Diversity Sampling
결정 경계가 noisy하거나 이미 여러 모델 보유Query by Committee

⚠️ Active Learning의 한계

  • 샘플링 전략이 전부예요. 나쁜 전략은 모델을 수렴 불가능하게 만들 수 있어요.
  • Sampling Bias 위험. Uncertainty만 돌리면 특정 영역에 과집중돼 일반화가 깨져요.
  • 사람은 여전히 필요해요. 샘플 선택은 자동화되지만, 라벨링 자체는 전문가가 해야 하는 도메인(의료, 법률, 보안)이 많아요.
  • 추가 컴퓨팅 비용. 매 사이클마다 재학습이 필요하므로, 라벨링 절감 vs 컴퓨팅 비용을 저울질해야 해요.

다음 단계 학습 방향

  • Deep Active Learning: Bayesian Neural Network나 MC Dropout으로 딥러닝 모델의 불확실성 추정
  • BALD (Bayesian Active Learning by Disagreement): 정보 이론 기반 샘플 선택
  • Core-Set Selection: 커버리지 최대화 관점의 배치 선택
  • Human-in-the-loop 파이프라인: Label Studio, Prodigy 같은 툴과 Active Learning 루프 연동

AI 에이전트 트렌드에도 관심 있다면, Holotron-12B와 NVIDIA Nemotron 기반 컴퓨터 사용 AI 모델 분석도 함께 보시면 좋아요.

Machine learning engineer training committee of models for query by committee active learning workflow

정리하면

Active Learning의 본질은 단순해요. "라벨링할 가치가 있는 샘플만 라벨링하자."

  • 라벨 비용이 비싼 조직일수록 효과가 커요
  • 세 전략을 섞어 쓰는 게 단일 전략보다 훨씬 강력해요
  • 초반엔 Uncertainty, 중반엔 Diversity, 경계가 noisy하면 Committee

국내 환경에서는 라벨링 인력이 한정된 스타트업이나, 사내 데이터 라벨링 프로세스를 처음 만드는 팀에게 특히 추천하고 싶어요. 50만 장을 다 라벨링할 필요는 없어요. 진짜 필요한 5천 장만 잘 고르면 됩니다. 🚀

함께 보면 좋은 글

원문 워크플로우와 노트북은 근거자료에서 확인할 수 있어요.

본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.