Реализация Active Learning для оптимизации разметки данных

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1564 услуг
Реализация Active Learning для оптимизации разметки данных
Средний
~1-2 недели
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1348
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    949
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1183
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    642
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    921

Разметка данных — самая дорогая часть ML-проекта. Для NLP с сотнями тысяч примеров бюджет на аннотацию часто превышает бюджет на обучение. Мы сталкивались с проектами, где заказчик потратил 80% времени на ручную разметку, а прирост метрик составил всего 2%. Причина: 90% примеров модель распознает уверенно — размечать их бессмысленно. Active Learning решает это: алгоритм сам отбирает 'трудные' объекты, где точность модели низкая. Размечать нужно только их. Результат: 5-10-кратная экономия бюджета разметки при сохранении качества на уровне 90% от полной разметки. Наши инженеры внедряют Active Learning под ключ: от выбора стратегии до интеграции с платформами. В этой статье — основные стратегии, код и опыт внедрения.

Active Learning — метод машинного обучения, где алгоритм выбирает наиболее информативные примеры для разметки.

Какие стратегии работают лучше?

На практике мы используем три основные стратегии отбора:

Стратегия Принцип Когда применять
Uncertainty Sampling Выбирает примеры с максимальной неопределённостью модели (энтропия, margin, least confidence) Классификация, регрессия — любые задачи с вероятностным выходом
Query by Committee Ансамбль моделей голосует; отбираются примеры с максимальным разбросом голосов Нет данных для калибровки вероятностей, нужна робастность
Core-Set Sampling Выбирает примеры, максимально удалённые от уже размеченных (геометрическое покрытие) Нужно разнообразие в датасете, избегание дублирования неопределённости

Uncertainty Sampling

Классический подход — модель предсказывает вероятности, и мы отбираем примеры с наименьшей уверенностью. Реализация обычно через энтропию:

import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.base import BaseEstimator

class UncertaintySampler:
    def __init__(self, model: BaseEstimator, strategy='entropy'):
        self.model = model
        self.strategy = strategy

    def query(self, X_unlabeled: np.ndarray, n_instances: int = 10) -> np.ndarray:
        proba = self.model.predict_proba(X_unlabeled)

        if self.strategy == 'entropy':
            scores = -np.sum(proba * np.log(proba + 1e-10), axis=1)
        elif self.strategy == 'margin':
            sorted_proba = np.sort(proba, axis=1)
            scores = 1 - (sorted_proba[:, -1] - sorted_proba[:, -2])
        elif self.strategy == 'least_confident':
            scores = 1 - proba.max(axis=1)

        return np.argsort(scores)[-n_instances:]

Плюс: простая реализация, работает для любых моделей с predict_proba. Минус: не учитывает разнообразие — может отбирать похожие неопределённые примеры.

Query by Committee

Здесь мы обучаем не одну модель, а ансамбль (например, на бутстрап-выборках). Несогласие участников комитета — индикатор информативности:

from sklearn.base import clone

class CommitteeSampler:
    def __init__(self, base_estimator, n_members=5):
        self.committee = [clone(base_estimator) for _ in range(n_members)]

    def fit_committee(self, X_labeled, y_labeled):
        n = len(X_labeled)
        for member in self.committee:
            bootstrap_idx = np.random.choice(n, n, replace=True)
            member.fit(X_labeled[bootstrap_idx], y_labeled[bootstrap_idx])

    def query(self, X_unlabeled, n_instances=10):
        predictions = np.array([
            member.predict(X_unlabeled) for member in self.committee
        ])
        vote_entropy = []
        for sample_idx in range(X_unlabeled.shape[0]):
            votes = predictions[:, sample_idx]
            unique, counts = np.unique(votes, return_counts=True)
            probs = counts / len(votes)
            entropy = -np.sum(probs * np.log(probs + 1e-10))
            vote_entropy.append(entropy)
        return np.argsort(vote_entropy)[-n_instances:]

Эта стратегия устойчивее к переобучению и часто даёт лучший прирост качества.

Core-Set Sampling

Если мы хотим покрыть всё признаковое пространство, а не только границы решений — используем Core-Set. Он выбирает точки, максимально далёкие от уже размеченных:

from sklearn.metrics import pairwise_distances

def core_set_selection(X_labeled, X_unlabeled, n_instances):
    selected_indices = []
    labeled_pool = X_labeled.copy()
    for _ in range(n_instances):
        distances = pairwise_distances(X_unlabeled, labeled_pool)
        min_distances = distances.min(axis=1)
        best_idx = np.argmax(min_distances)
        selected_indices.append(best_idx)
        labeled_pool = np.vstack([labeled_pool, X_unlabeled[best_idx]])
    return np.array(selected_indices)

Почему Active Learning не всегда выгоден?

Если датасет уже сбалансирован и содержит мало 'лёгких' примеров — выигрыш может быть небольшим. Мы всегда проводим предварительный анализ: строим кривую обучения на выборке, чтобы понять потенциал экономии. Например, для одного из проектов предварительный тест показал, что AL даст лишь 20% экономии, и мы рекомендовали не внедрять.

Когда стоит использовать Committee вместо Uncertainty?

Committee лучше работает с зашумлёнными данными и когда калибровка вероятностей модели неточна. На практике мы часто комбинируем обе стратегии в рамках одного цикла: на первых итерациях используем Committee для разнообразия, затем переключаемся на Uncertainty для точности.

Active Learning для NER

Для Sequence Labeling мы используем неопределённость на уровне токенов. Агрегируем энтропию по всем токенам предложения — выбираем самые неуверенные предложения:

import torch
from transformers import AutoModelForTokenClassification, AutoTokenizer

def ner_uncertainty_sampling(texts, model, tokenizer, n_instances=20):
    sentence_uncertainties = []
    for i, text in enumerate(texts):
        inputs = tokenizer(text, return_tensors='pt', truncation=True, max_length=512)
        with torch.no_grad():
            outputs = model(**inputs)
        probs = torch.softmax(outputs.logits, dim=-1).squeeze()
        token_entropy = -(probs * torch.log(probs + 1e-10)).sum(dim=-1)
        sentence_uncertainty = token_entropy.max().item()
        sentence_uncertainties.append((i, sentence_uncertainty))
    sentence_uncertainties.sort(key=lambda x: x[1], reverse=True)
    return [idx for idx, _ in sentence_uncertainties[:n_instances]]

Этот подход даёт 3-5-кратную экономию для NER-датасетов.

Полный цикл Active Learning

class ActiveLearningPipeline:
    def __init__(self, model, sampler, labeling_budget):
        self.model = model
        self.sampler = sampler
        self.budget = labeling_budget
        self.labeled_count = 0
        self.performance_history = []

    def run(self, X_initial, y_initial, X_pool, batch_size=20):
        X_labeled, y_labeled = X_initial.copy(), y_initial.copy()
        X_unlabeled = X_pool.copy()
        while self.labeled_count < self.budget and len(X_unlabeled) > 0:
            self.model.fit(X_labeled, y_labeled)
            current_metric = self.evaluate(X_labeled, y_labeled)
            self.performance_history.append({
                'n_labeled': len(X_labeled),
                'metric': current_metric
            })
            query_idx = self.sampler.query(X_unlabeled, n_instances=batch_size)
            new_y = get_labels_from_annotator(X_unlabeled[query_idx])
            X_labeled = np.vstack([X_labeled, X_unlinked[query_idx]])
            y_labeled = np.concatenate([y_labeled, new_y])
            X_unlabeled = np.delete(X_unlabeled, query_idx, axis=0)
            self.labeled_count += batch_size
        return self.performance_history

Этот код иллюстрирует полный цикл — его мы адаптируем под вашу инфраструктуру.

Как мы внедряем Active Learning в ваш проект

Типовой процесс состоит из 5 этапов:

  1. Анализ данных и бизнес-задачи — определяем метрики, структуру датасета, доступные типы разметки.
  2. Выбор стратегии отбора — тестируем Uncertainty Sampling, Committee и Core-Set на вашей задаче; выбираем лучшую по кривой обучения.
  3. Разработка пайплайна — реализуем цикл: обучить → отобрать → разметить → дообучить. Интегрируем с платформами Label Studio или Scale AI.
  4. Пилотный запуск — на небольшом датасете (1000-5000 примеров) проверяем эффективность.
  5. Продакшн — автоматизируем процесс, настраиваем мониторинг метрик (latency p99, GPU utilization) и перезапуск циклов.

Сроки и стоимость

Этап Длительность
Базовый пайплайн (Uncertainty Sampling + интеграция с Label Studio) 2-3 недели
Расширенный (Committee + Core-Set + NLP/NER) 6-8 недель
Кастомная холодная стратегия под специфику данных от 8 недель

Стоимость базового пилота — от 150 000 рублей, полного внедрения — от 500 000 рублей. Итоговая сумма зависит от сложности задачи, необходимого стека (PyTorch, HuggingFace, LLM), объёма данных и требований к инфраструктуре. Экономия в среднем 1-2 млн рублей на крупных проектах. Оценим ваш проект бесплатно.

Что входит в результат внедрения

  • Рабочий пайплайн Active Learning, интегрированный с вашей системой разметки
  • Дашборд метрик: динамика качества модели, экономия бюджета, распределение выбранных примеров
  • Документация и руководство по эксплуатации
  • Поддержка 3 месяца после запуска

Мы реализовали Active Learning для 15+ проектов в NLP и Computer Vision. Один из последних кейсов: задача классификации отзывов — сократили объём разметки с 50 000 до 8 000 примеров при сохранении F1 на уровне 0.94.

Active Learning — проверенная методология, которая уже сэкономила нашим клиентам миллионы рублей. Гарантируем качество внедрения и прозрачный результат.

Свяжитесь с нами: расскажите о своей задаче — мы предложим оптимальную стратегию Active Learning. Получите консультацию инженера по машинному обучению.

AutoML: AutoGluon, FLAML, Vertex AI AutoML и когда это работает

Когда бизнес хочет быстро получить модель, мы предлагаем внедрение AutoML платформ. Это не кнопка «сделай мне AI», а автоматизация перебора гиперпараметров и выбора алгоритма. Разница критическая: без качественных данных и правильной постановки задачи даже лучшая платформа выдаст мусор. Но для конкретных задач AutoML экономит недели ручных итераций.

AutoML автоматизирует выбор модели и настройку гиперпараметров. На структурированных табличных данных современные системы конкурируют с ручным ML-инжинирингом. Например, на kaggle-соревнованиях AutoGluon без какой-либо настройки попадает в топ-10% на многих датасетах. Причина: он строит ансамбль из LightGBM, XGBoost, CatBoost, нейросетей и RF со stacking — такой ансамбль часто превосходит одиночную лучшую модель на 5–10% по метрике.

Хорошие кандидаты для AutoML платформ:

  • Стандартная бинарная/мультиклассовая классификация или регрессия на табличных данных
  • Задачи без жёстких ограничений на latency (< 50 мс) или размер модели (< 10 MB)
  • MVP или baseline перед ручной оптимизацией
  • Команды без глубокой ML-экспертизы, которым нужен рабочий прототип за 1–2 недели

Плохие кандидаты: кастомный loss, специфические архитектуры, real-time inference с жёсткими ограничениями, domain-специфические задачи (медицинская визуализация, NLP на редком языке).

Почему AutoGluon — лучший выбор для табличных данных?

AutoGluon-Tabular — самый сильный AutoML для таблиц по большинству бенчмарков. Ключевая особенность — многоуровневый стекинг. Модели первого слоя (LightGBM, XGBoost, CatBoost, FastAI tabular, KNN) → их предсказания как фичи → модели второго слоя. Это настраивается через num_stack_levels=2.

from autogluon.tabular import TabularPredictor

predictor = TabularPredictor(
    label='target',
    eval_metric='roc_auc',
    path='./ag_models'
).fit(
    train_data,
    time_limit=3600,  # 1 час
    presets='best_quality',  # vs 'medium_quality', 'high_quality'
)

Preset best_quality включает стекинг и ансамбли, занимает максимум памяти и времени. medium_quality — баланс скорость/качество, подходит для >1M строк. optimize_for_deployment — убирает тяжёлые ансамбли, ускоряет inference.

Типичный подводный камень: AutoGluon обучает десятки моделей и сохраняет все на диск — от 2 до 10 GB на серьёзных задачах. При деплое выгружайте только финальную модель через predictor.clone_for_deployment(). С памятью тоже осторожно: при num_stack_levels=2 на 500k строк возможен OOM на машинах с <32 GB RAM. Решение: ag_args_fit={'num_cpus': 4, 'num_gpus': 0} и excluded_model_types=['NeuralNetFastAI'].

Как FLAML экономит ресурсы и время?

FLAML (Fast and Lightweight AutoML) от Microsoft ориентирован на минимальный бюджет вычислений при хорошем качестве. Использует cost-frugal search: сначала пробует дешёвые конфигурации, постепенно переходя к дорогим. Это даёт выигрыш по времени до 2 раз по сравнению с AutoGluon на одинаковом бюджете, хотя итоговое качество может быть на 3–5% ниже.

from flaml import AutoML
automl = AutoML()
automl.fit(X_train, y_train, task="classification", time_budget=120, metric="roc_auc")

Хорошо подходит для ограниченного вычислительного бюджета, задач с требованием time_budget < 60 сек, интеграции в CI/CD пайплайн. FLAML также поддерживает fine-tuning LLM через flaml.autogen — автоматический подбор промптов для GPT/Claude.

Когда выбирать Vertex AI AutoML?

Google Vertex AI AutoML — правильный managed сервис, когда:

  • Нет своей ML-инфраструктуры
  • Нужна интеграция с BigQuery, Cloud Storage, Dataflow
  • Задача — Computer Vision или NLP (не только таблицы)
  • Требуется managed inference endpoint без DevOps

Стоимость обучения табличной модели — $1.375/час за node. Для 100k строк и 50 признаков обычно 2–4 часа обучения. Inference: $0.05–0.10 за 1k предсказаний. Для высоконагруженных задач self-hosted AutoGluon выгоднее. Ограничения: меньше контроля над архитектурой, экспорт модели только в TF SavedModel или TFLite, без ONNX. Зато managed feature store, автоматический мониторинг дрейфа и MLOps из коробки.

Сравнение основных AutoML платформ

Характеристика AutoGluon FLAML Vertex AI AutoML
Качество на таблицах ★★★★★ ★★★★ ★★★★
Скорость обучения ★★★ ★★★★★ ★★★
Требования к инфраструктуре Своя машина/GPU Любая среда Google Cloud
Гибкость (кастомные loss и пайплайны) Высокая Средняя Низкая
Подходит для Production, high-quality Быстрые эксперименты Managed сервис

Что входит в работу по внедрению AutoML?

Мы предоставляем полный цикл: от быстрого бенчмарка до production-системы с мониторингом. В deliverables входят:

  • EDA и подготовка данных (feature engineering, обработка пропусков, кодирование)
  • Обучение и сравнение 3+ AutoML конфигураций с фиксацией метрик
  • Выбор лучшей модели и её экспорт (ONNX, TF SavedModel, TorchScript)
  • Развёртывание inference endpoint (Docker, Kubernetes, serverless)
  • Документация model card и инструкция по переобучению
  • Обучение вашей команды работе с платформой (2 часа)

Гарантируем: baseline за 5 рабочих дней, production-решение за 2–4 недели в зависимости от сложности.

Процесс работы и сроки

  1. Аналитика (1–2 дня) — сбор требований, EDA, определение метрики качества.
  2. Бенчмарк (2–3 дня) — запуск AutoGluon medium_quality, FLAML, Vertex AI. Фиксация baseline.
  3. Оптимизация (3–5 дней) — feature engineering, ручная настройка гиперпараметров, стекинг.
  4. Тест и валидация (2–3 дня) — оценка на отложенной выборке, проверка дрейфа, A/B тест.
  5. Деплой (2–4 дня) — контейнеризация, CI/CD, метрики мониторинга.

Сроки: MVP — от 1 недели. Полноценная production-система с автопереобучением — от 3 недель.

Почему стоит доверить внедрение нам?

У нас за плечами 5 лет опыта и более 20 успешных проектов по внедрению AutoML платформ в ритейле, финтехе и логистике. Сертифицированные инженеры по AWS Machine Learning и Google Cloud Professional Data Engineer. Мы не просто запускаем код — мы обучаем вашу команду и гарантируем, что модель будет стабильно работать в production.

Получите консультацию по AutoML для вашей задачи — оставьте заявку. Или закажите бесплатный бенчмарк: мы проанализируем ваши данные и скажем, сколько времени и денег сэкономит AutoML.