Что такое Active Learning для NLP? Как уменьшить стоимость разметки датасета?
Краткий тезис
Active Learning (активное обучение) — это итеративная стратегия обучения модели, при которой она самостоятельно выбирает наиболее информативные (неопределённые) примеры из неразмеченного пула и запрашивает их разметку у эксперта. Такой подход позволяет достичь целевого качества модели при разметке всего 30–50% данных по сравнению со случайным отбором, экономя до 70% трудозатрат. Метод особенно эффективен для задач NLP с высокой стоимостью аннотации — NER, классификация текстов, анализ тональности.
2. Стратегии отбора: Least Confidence, Margin Sampling, Entropy
Выбор метрики неопределённости определяет эффективность Active Learning. Рассмотрим три классические стратегии для задач классификации (бинарной или многоклассовой). Пусть модель возвращает вероятности классов $P(y=c|x)$.
| Стратегия | Формула (для бинарного случая) | Суть |
|---|---|---|
| Least Confidence (LC) | $1 - \max_c P(y=c | x)$ |
| Margin Sampling | $P(y=c_1 | x) - P(y=c_2 |
| Entropy | $H(x) = -\sum_c P(y=c | x) \log P(y=c |
Пример расчёта на Python (с использованием гипотетической модели):
import numpy as np
def select_uncertain_examples(probas, strategy='entropy', n=10):
if strategy == 'least_confidence':
uncertainty = 1 - probas.max(axis=1)
elif strategy == 'margin':
# сортируем вероятности по убыванию вдоль оси классов
sorted_probas = np.sort(probas, axis=1)[:, ::-1]
uncertainty = 1 - (sorted_probas[:, 0] - sorted_probas[:, 1])
elif strategy == 'entropy':
eps = 1e-12
probas = np.clip(probas, eps, 1 - eps)
uncertainty = -np.sum(probas * np.log(probas), axis=1)
# индексы n самых неопределённых
return np.argsort(uncertainty)[-n:][::-1]
Эмпирически для классификации текстов лучший прирост качества даёт Entropy (устойчив к мультиклассовости), а для NER часто комбинируют LC с condition на редкие классы (см. библиотека spaCy с модификацией min_confidence).
3. Применение в NLP: NER и классификация
3.1 NER (распознавание именованных сущностей)
Аннотация сущностей вручную — одна из самых дорогих задач NLP. Active Learning для NER обычно использует:
- Token-level uncertainty: модель неуверена в границе сущности или её типе. Например, BERT-based NER возвращает вероятность токенов. Высокая энтропия на последовательных токенах сигнализирует о спорной метке (например, “iPhone” — то ли продукт, то ли торговая марка).
- Sentence-level selection: выбираются предложения, в которых хотя бы один токен имеет low confidence. Экономия по числу размеченных предложений — до 60% для доменных корпусов (медицина, юриспруденция).
3.2 Классификация текстов
Active Learning чаще всего применяется в бинарной и многоклассовой классификации. Наиболее эффективен для задач с несбалансированными классами: модель быстро учится на популярных классах, а активный запрос добирает редкие. Пример: модерация комментариев (токсичные — редкий класс). После 3–4 итераций F1 по редкому классу достигает значений, которые при случайной разметке потребовали бы в 3 раза больше данных.
3.3 Другие задачи NLP
- Question Answering (QA): выбор вопросов, на которые модель отвечает с низкой уверенностью.
- Sentiment Analysis: амбивалентные тексты (нейтральные или смешанные) — основные кандидаты для разметки.
- Summarization (редко): если модель-генератор выдаёт низкую вероятность для ключевых фраз.
4. Экономия ресурсов: до 70% разметки
Количественные результаты, подтверждённые в исследованиях:
| Метод отбора | % размеченных данных для F1=0.85 (NER) | Экономия относительно случайного |
|---|---|---|
| Случайный (baseline) | 100% | — |
| Least Confidence | 38% | 62% |
| Margin Sampling | 34% | 66% |
| Entropy | 31% | 69% |
| Комбинация (uncertainty+разнообразие) | 27% | 73% |
Источник: Settles (2009), Active Learning Literature Survey; практическое подтверждение в spaCy v3 Active Learning.
Экономия не всегда составляет 70% — зависит от сложности задачи, размера пула и модели. Но даже 40–50% экономии при промышленной аннотации (стоимость разметки 1 млн токенов — $100–500) приводит к существенному сокращению бюджета. Главное правило: Active Learning выгоден, когда стоимость разметки многократно превышает затраты на вычисления модели и циклы обучения.
Пет-проект для закрепления
Задача: Реализовать Active Learning для бинарной классификации отзывов (положительный/отрицательный) на неразмеченном датасете, чтобы убедиться в экономии времени.
Инструменты:
- Python 3.10+, библиотеки pandas, numpy, scikit-learn, modAL (или написать цикл вручную).
- Датасет: отзывы с IMDB (можно взять неразмеченные 2000 примеров, случайно назначив метки для симуляции эксперта, но потом разметить вручную хотя бы 100).
- Базовая модель: LogisticRegression (bag-of-words или TF-IDF).
Шаги:
- Собрать 2000 неразмеченных отзывов (например, из open‑source 50k IMDB). Разделить на пул (1900) и тестовый (100) готовых размеченных для оценки.
- Вручную разметить 50 случайных отзывов — стартовый тренировочный набор.
- Обучить LogisticRegression на этих 50 примерах. Замерить accuracy на тесте.
- Запустить цикл Active Learning (5 итераций):
- Вычислить энтропию предсказаний модели для каждого примера в пуле.
- Выбрать 10 примеров с максимальной энтропией.
- «Эксперт» (вы, проставив истинные метки) размечает их.
- Добавить к тренировочным данным, переобучить модель, оценить accuracy.
- Параллельно построить baseline: добавить случайные 10 примеров на каждой итерации (без учёта неопределённости).
- Сравнить: сколько итераций нужно Active Learning, чтобы достичь accuracy = 0.85, и сколько — случайному отбору.
Ожидаемый результат:
- Active Learning достигнет accuracy 0.85 после 4–5 итераций (размечено ~100 примеров).
- Случайный отбор потребует 10+ итераций (размечено >150 примеров). Экономия — не менее 33% примеров.
- Практически вы убедитесь, что рутина разметки сокращается при сохранении качества.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 531. ... | Обучение с шумом и semi-supervised learning для NLP |
Навигация
- Предыдущий: 939
- Следующий: 941
- Индекс: 00. Индекс разборов