Skip to content

Активное обучение

Используйте в Potato 5 стратегий активного обучения — отбор по неопределённости, BADGE, BALD, по разнообразию и гибридный ансамбль — и сократите затраты на разметку до 50%.

Активное обучение помогает размечать умнее, выводя вперёд самые информативные примеры. Вместо случайной разметки вы сосредотачиваетесь на объектах, в которых модель уверена меньше всего.

Как это работает

Активное обучение в Potato автоматически переупорядочивает объекты разметки по предсказаниям модели:

  1. Первичный сбор — накопить минимальное количество разметки
  2. Обучение — обучить классификатор на имеющейся разметке
  3. Предсказание — получить оценки неопределённости для неразмеченных объектов
  4. Переупорядочивание — вывести вперёд объекты с наибольшей неопределённостью
  5. Разметка — разметчики размечают приоритетные объекты
  6. Переобучение — периодически обновлять модель новой разметкой

The active learning loop: train on what is labeled, score the unlabeled pool by uncertainty, annotate the most uncertain items, and retrainSpend annotation effort where the model learns the most

Конфигурация

Базовая настройка

yaml
active_learning:
  enabled: true
  schema_names:
    - sentiment  # Which annotation schemes to use
 
  min_annotations_per_instance: 1
  min_instances_for_training: 20
  update_frequency: 50  # Retrain after every 50 annotations
  max_instances_to_reorder: 1000

Полная конфигурация

yaml
active_learning:
  enabled: true
 
  # Which schemas to use for training
  schema_names:
    - sentiment
 
  # Minimum requirements
  min_annotations_per_instance: 1
  min_instances_for_training: 20
 
  # Retraining frequency
  update_frequency: 50
 
  # How many instances to reorder
  max_instances_to_reorder: 1000
 
  # Classifier configuration
  classifier_name: sklearn.linear_model.LogisticRegression
  classifier_params:
    C: 1.0
    max_iter: 1000
 
  # Query strategy
  query_strategy: uncertainty  # uncertainty, diversity, badge, bald, hybrid
 
  # Feature extraction
  vectorizer:
    type: TfidfVectorizer
    params:
      max_features: 5000
      ngram_range: [1, 2]
 
  # Model persistence
  model_persistence:
    enabled: true
    save_dir: "models/"
    max_saved_models: 5

Стратегии отбора

Potato поддерживает пять стратегий отбора самых информативных объектов:

СтратегияОписание
uncertaintyБерёт объекты, в которых модель уверена меньше всего (по умолчанию)
diversityБерёт объекты, максимально непохожие на уже размеченные данные
badgeBatch Active learning by Diverse Gradient Embeddings
baldBayesian Active Learning by Disagreement
hybridАнсамбль, сочетающий несколько стратегий
yaml
active_learning:
  query_strategy: uncertainty  # or diversity, badge, bald, hybrid

Поддерживаемые классификаторы

Классификаторы задаются полным путём импорта из sklearn через classifier_name:

КлассификаторПуть в sklearnДля чего лучшеСкорость
Логистическая регрессияsklearn.linear_model.LogisticRegressionБинарная и многоклассовая классификацияБыстро
Случайный лесsklearn.ensemble.RandomForestClassifierСложные закономерностиСредне
SVCsklearn.svm.SVCНебольшие датасетыМедленно
Мультиномиальный NBsklearn.naive_bayes.MultinomialNBКлассификация текстаОчень быстро

Примеры классификаторов

yaml
# Logistic Regression (recommended starting point)
classifier_name: sklearn.linear_model.LogisticRegression
classifier_params:
  C: 1.0
  max_iter: 1000
 
# Random Forest
classifier_name: sklearn.ensemble.RandomForestClassifier
classifier_params:
  n_estimators: 100
  max_depth: 10
 
# Support Vector Classifier
classifier_name: sklearn.svm.SVC
classifier_params:
  kernel: rbf
  probability: true
 
# Naive Bayes
classifier_name: sklearn.naive_bayes.MultinomialNB
classifier_params:
  alpha: 1.0

Векторизаторы

ВекторизаторОписание
TfidfVectorizerПризнаки со взвешиванием TF-IDF (рекомендуется)
CountVectorizerПростой подсчёт слов
HashingVectorizerЭкономный по памяти для больших словарей
yaml
# TF-IDF (recommended)
vectorizer:
  type: TfidfVectorizer
  params:
    max_features: 5000
    ngram_range: [1, 2]
    stop_words: english
 
# Count Vectorizer
vectorizer:
  type: CountVectorizer
  params:
    max_features: 3000
    ngram_range: [1, 1]
 
# Hashing Vectorizer (for large datasets)
vectorizer:
  type: HashingVectorizer
  params:
    n_features: 10000

Интеграция с LLM

Активное обучение может при желании использовать LLM для более точного отбора объектов:

yaml
active_learning:
  enabled: true
  schema_names:
    - sentiment
 
  # LLM-based selection
  llm_integration:
    enabled: true
    endpoint_type: vllm
    base_url: http://localhost:8000/v1
    model: meta-llama/Llama-2-7b-chat-hf
 
    # Mock mode for testing
    mock_mode: false

Поддержка нескольких схем

Активное обучение может циклически проходить по нескольким схемам разметки:

yaml
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    labels: [Positive, Negative, Neutral]
 
  - annotation_type: radio
    name: topic
    labels: [Politics, Sports, Tech, Entertainment]
 
active_learning:
  enabled: true
  schema_names:
    - sentiment
    - topic
 
  # Schema-specific settings
  schema_config:

Сохранение модели

Сохраняйте и заново загружайте обученные модели между перезапусками сервера:

yaml
active_learning:
  enabled: true
  schema_names:
    - sentiment
 
  model_persistence:
    enabled: true
    save_dir: "models/"
    max_saved_models: 5  # Keep last 5 models
 
    # Save to database instead of files
    use_database: false

Наблюдение за прогрессом

Админ-панель отслеживает метрики активного обучения:

  • Текущая точность модели
  • Число циклов обучения
  • Распределение неопределённости
  • Сколько объектов осталось
  • История переобучений

Доступ — через /admin с вашим админским ключом API.

Рекомендации

1. Начните со случайной выборки

Соберите первичную разметку до включения активного обучения:

yaml
active_learning:
  enabled: true
  min_instances_for_training: 50  # Wait for 50 annotations

2. Подбирайте подходящий классификатор

  • LogisticRegression: быстрый, хороший вариант по умолчанию для большинства задач
  • RandomForest: лучше на сложных закономерностях, медленнее
  • MultinomialNB: очень быстрый, хорош для простой классификации текста

3. Следите за распределением классов

Активное обучение может создать перекос классов. Смотрите на это в админ-панели и подумайте о стратифицированной выборке.

4. Задайте разумную частоту переобучения

Слишком частое переобучение впустую тратит ресурсы:

yaml
update_frequency: 100  # Retrain every 100 annotations

5. Включите сохранение модели

Сохраняйте модели, чтобы не переобучать всё заново после перезапуска:

yaml
model_persistence:
  enabled: true
  save_dir: "models/"

Пример: полная конфигурация

yaml
annotation_task_name: "Sentiment Analysis with Active Learning"
task_dir: "."
port: 8000
 
data_files:
  - "data/reviews.json"
 
item_properties:
  id_key: id
  text_key: text
 
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment?"
    labels:
      - Positive
      - Negative
      - Neutral
 
active_learning:
  enabled: true
  schema_names:
    - sentiment
 
  min_annotations_per_instance: 1
  min_instances_for_training: 30
  update_frequency: 50
  max_instances_to_reorder: 500
 
  classifier_name: sklearn.linear_model.LogisticRegression
  classifier_params:
 
  query_strategy: uncertainty
 
  vectorizer:
 
  model_persistence:
 
output_annotation_dir: "output/"
export_annotation_format: "json"
user_config:
  allow_all_users: true

В сочетании с поддержкой ИИ

Используйте активное обучение вместе с помощью LLM:

yaml
active_learning:
  enabled: true
  schema_names:
    - sentiment
  min_instances_for_training: 30
 
ai_support:
  enabled: true
  endpoint_type: openai
 
  ai_config:
    model: gpt-4
    api_key: ${OPENAI_API_KEY}
 
  features:
    label_suggestions:
      enabled: true

Такое сочетание выводит вперёд неопределённые объекты и одновременно даёт разметчику подсказки ИИ.

Решение проблем

Обучение падает

  • Убедитесь, что разметки достаточно (min_instances_for_training)
  • Проверьте распределение классов — нужны примеры всех классов
  • Убедитесь, что формат данных соответствует схеме

Медленно работает

  • Уменьшите max_instances_to_reorder
  • Увеличьте update_frequency
  • Возьмите HashingVectorizer для больших словарей

Модель не обновляется

  • Проверьте настройку update_frequency
  • Убедитесь, что разметка сохраняется
  • Посмотрите админ-панель на предмет ошибок

Что почитать дальше

Детали реализации — в исходной документации.