Active learning и semi-supervised для Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем эти подходы

Разметка дорого. 10k размеченных примеров через краудсорсинг = 200-500k рублей. 100k — миллионы. При этом размеченных мало, неразмеченных много (лежат в БД).

Active learning: модель сама выбирает, какие примеры разметить — фокусируется на «трудных».

Semi-supervised: использует неразмеченные данные напрямую (без human labeling) для тренировки.

На собесе DS вопрос: «есть 1k размеченных и 100k неразмеченных, что делаешь?» — ожидается понимание этих подходов.

Active learning

Цикл:

  1. Тренируем baseline на маленькой размеченной выборке
  2. Применяем к unlabeled pool
  3. Выбираем top-K «непонятных» примеров (uncertainty)
  4. Отдаём людям на разметку
  5. Добавляем в train, повторяем

Эффект: обучение требует в 2-10× меньше labeled data, чем random sampling.

Когда работает: дорогая разметка, доступен expert/labeler, есть большой unlabeled pool.

Когда не работает:

  • Дешёвая массовая разметка (просто разметить всё)
  • Cold start (нет baseline-модели)
  • Cold start (есть baseline, но он плохой → плохой uncertainty estimate)

Стратегии query

Uncertainty sampling:

  • Least confidence — выбираем примеры, где max(p) минимально
  • Margin sampling — где p_top1 - p_top2 минимально (близко к границе)
  • Entropy — где entropy distribution максимальна
proba = model.predict_proba(X_pool)
margin = np.sort(proba, axis=1)[:, -1] - np.sort(proba, axis=1)[:, -2]
uncertain_idx = np.argsort(margin)[:K]  # K самых неуверенных

Query by committee (QBC): ensemble моделей. Выбираем примеры с максимальным разногласием между моделями.

Diversity-based: избегаем «батча» из одного кластера. Сначала uncertainty, потом diversity (k-means на uncertain pool, по одному из кластера).

Expected model change — ожидаемое изменение модели после добавления примера. Дорого, но точно.

В индустрии чаще всего uncertainty + diversity combo.

Semi-supervised: pseudo-labeling

Идея: тренируем модель на labeled data, predictим unlabeled, наиболее уверенные predictions используем как «псевдо-метки».

model.fit(X_labeled, y_labeled)
proba = model.predict_proba(X_unlabeled)
confident_idx = proba.max(axis=1) > 0.95   # threshold confidence
y_pseudo = proba.argmax(axis=1)[confident_idx]
X_combined = np.vstack([X_labeled, X_unlabeled[confident_idx]])
y_combined = np.concatenate([y_labeled, y_pseudo[confident_idx]])
model.fit(X_combined, y_combined)

Плюсы: просто, бесплатно (нет human labeling).

Минусы:

  • Усиливает bias модели — confident wrong становится «правильным»
  • Не работает на сильно несбалансированных классах
  • Чувствителен к threshold
Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Self-training и co-training

Self-training: итеративный pseudo-labeling. Несколько раундов: тренируем → pseudo-label → retrain.

Co-training (Blum, Mitchell 1998):

  • Делим признаки на два независимых view (например, текст и метаданные)
  • Тренируем две модели на разных view
  • Каждая labeled свои confident predictions для другой
  • Итерируем

Работает, когда два view independent и каждый sufficient для классификации. Идеально — текст + изображение.

Modern semi-supervised для нейросетей:

  • Consistency regularization (FixMatch, MixMatch) — предсказания на augmented version того же примера должны совпадать
  • Self-supervised pretraining (SimCLR, SwAV) — pretrain на unlabeled, затем supervised fine-tune

В современном DL self-supervised pretraining (BERT, CLIP, DINO) — самый эффективный «semi-supervised».

Когда что выбирать

Кейс Подход
Дорогая разметка, есть expert Active learning
Большой unlabeled pool, простая задача Pseudo-labeling
Два независимых view данных Co-training
Image / text / audio + большой unlabeled Self-supervised pretraining
Маленький labeled, нет unlabeled Data augmentation, transfer learning

Эвристика: active learning для production-pipeline с continual learning. Pseudo-labeling — quick boost когда нужно. Self-supervised pretraining — золотой стандарт для DL.

Частые ошибки

Active learning без baseline. Модель не различает sure от unsure → uncertainty sampling = random. Сначала достаточный baseline (хотя бы 100-500 размеченных).

Pseudo-labeling без threshold. Все predictions добавляем — добавляем шум. Confidence > 0.9 минимум.

Не учитывать class balance в pseudo-labeling. Модель уверена в majority классе → pseudo-labels усиливают imbalance.

Active learning только uncertainty без diversity. Получаем 100 похожих примеров.

Считать semi-supervised «как supervised, только с unlabeled». Бесплатные данные ≠ бесплатное качество. Если labeled выборка биазена — semi-supervised усугубит.

Self-training без stop criterion. Бесконечный цикл, переобучение на собственных ошибках.

Игнорировать labeling errors. Human labels тоже шумные. На active learning важно — те же люди должны размечать consistently.

Связанные темы

FAQ

Active learning требует human in the loop?

Да. Это основная идея — экономия human time через умный выбор. Без human labeler — обычный supervised.

Что лучше — active learning или больше random labeled?

Зависит от задачи. На простых datasets random может догнать AL. На сложных или imbalanced AL даёт x2-x10 эффективности по labels.

Self-supervised vs semi-supervised — разница?

Self-supervised — pretraining без labels через proxy task (predict masked tokens, contrastive). Semi-supervised — учится на mix labeled + unlabeled. Self-supervised — частный случай и доминирующая парадигма в DL.

Pseudo-labeling работает в production?

Зависит. На стабильных distributions может дать +1-3%. На changing distributions усугубляет drift. Лучше использовать с care и monitoring.

Что такое weak supervision?

Использование «слабых» источников меток (rules, distant supervision, crowd, noisy labels) для тренировки. Snorkel — известный фреймворк.

Это официальная информация?

Нет. Статья основана на работах Settles (Active Learning Survey, 2010), Blum-Mitchell (1998), современных semi-supervised papers.


Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.