Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#917

Что такое Few-shot Classification для NLP? Какие подходы существуют (SetFit, мета-обучение, промптинг LLM)?

Краткий тезис

Few-shot классификация в NLP — это задача обучения модели распознавать новые классы на основе 1–10 размеченных примеров на класс. Основные подходы включают: (1) SetFit — fine-tuning sentence-трансформеров через контрастивное обучение без использования LLM; (2) мета-обучение — алгоритмы вроде MAML и Prototypical Networks, которые учат модель «учиться быстро» на эпизодах; (3) промптинг LLM — использование замороженной языковой модели с in-context learning (ICL). Для русского языка ключевой вызов — дефицит качественных few-shot бенчмарков и адаптация англоцентричных подходов.

2. Мета-обучение: MAML, Prototypical Networks

Мета-обучение (learning to learn) формулирует few-shot задачу как серию эпизодов, где модель учится быстро адаптироваться к новым классам.

MAML (Model-Agnostic Meta-Learning):

  • Обучает инициализацию параметров модели, такую, что один-два шага градиентного спуска на нескольких примерах дают хорошее качество.
  • Для NLP обычно используется поверх BERT: внутренний цикл — fine-tuning на support set (5 примеров), внешний — оптимизация на query set.
  • Проблема: вычислительно дорогой (вторые производные), нестабилен для больших трансформеров.

Prototypical Networks:

  • Для каждого класса вычисляется прототип — средний эмбеддинг support-примеров.
  • Классификация query-примера — по ближайшему прототипу в эмбеддинг-пространстве (косинусная близость или евклидово расстояние).
  • Плюсы: простой, интерпретируемый, не требует градиентов на инференсе.
  • Минусы: чувствителен к выбросам в support-примерах.

Реализация для русского языка:

import torch
from transformers import AutoTokenizer, AutoModel

class PrototypicalNet(nn.Module):
    def __init__(self, encoder_name="DeepPavlov/rubert-base-cased"):
        super().__init__()
        self.encoder = AutoModel.from_pretrained(encoder_name)
    
    def forward(self, support, query):
        # support: (n_way, k_shot, seq_len)
        # query: (n_query, seq_len)
        support_emb = self.encoder(support).pooler_output
        prototypes = support_emb.mean(dim=1)  # (n_way, hidden)
        query_emb = self.encoder(query).pooler_output
        dists = torch.cdist(query_emb, prototypes)
        return -dists  # logits

3. Промптинг LLM: in-context learning (замороженная LLM)

In-context learning (ICL) — самый популярный подход с 2023 года, не требующий fine-tuning.

Механизм:

  • В промпт добавляется K примеров (демонстраций) для каждого класса в формате «Текст -> Метка».
  • Замороженная LLM (например, LLaMA, Qwen, YandexGPT) генерирует ответ, из которого извлекается метка.
  • Варианты:
    • Zero-shot: без примеров, только инструкция.
    • Few-shot: 1–5 примеров на класс.
    • Dynamic ICL: выбор релевантных примеров через retrieval (BM25 или эмбеддинги).

Проблемы для русского языка:

  • LLM могут быть переобучены на английском, что снижает качество на русском.
  • Длина контекста ограничивает количество примеров (особенно для длинных текстов).
  • Высокая стоимость инференса (токены).

Пример промпта:

Классифицируй текст по тональности: позитивная, негативная, нейтральная.

Пример 1: "Отличный фильм, всем советую!" -> позитивная
Пример 2: "Ужасное обслуживание, больше не приду" -> негативная
Пример 3: "Сегодня идёт дождь" -> нейтральная

Текст: "Книга оказалась скучной, но иллюстрации красивые"
Ответ:

4. Сравнение качества на русском языке

Эмпирическое сравнение на датасетах RuSentiment (тональность) и RuREBUS (тематика) показывает:

ПодходAccuracy (5-shot)Время инференса (1 пример)Требования к GPU
SetFit (rubert-tiny2)72.3%0.02 сек (CPU)Нет
Prototypical Networks (RuBERT)68.1%0.05 сек (CPU)Нет (только обучение)
MAML (RuBERT)74.5%0.1 сек (GPU)8GB VRAM
LLM ICL (Qwen-7B, 5-shot)81.2%2.5 сек (GPU)16GB VRAM
LLM ICL (YandexGPT, 5-shot)83.7%API (зависит)Нет (API)

Выводы:

  • LLM-подходы дают лучшее качество, но дороги и медленны.
  • SetFit — оптимальный баланс для production (скорость + приемлемое качество).
  • Мета-обучение (MAML) — нишевый вариант для задач с частой сменой классов.

5. Пет-проект для закрепления

Задача: Создать сервис few-shot классификации отзывов на русском языке по 5 категориям (техника, еда, услуги, книги, фильмы) с 3 примерами на категорию.

Инструменты:

  • Python 3.10+, HuggingFace Transformers, SetFit, FastAPI
  • Модели: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 (SetFit), Qwen/Qwen2.5-7B-Instruct (LLM ICL)
  • Датасет: SberQuAD или синтетические отзывы

Шаги:

  1. Собрать 15 примеров (3 на класс) в формате JSON.
  2. Реализовать SetFit-классификатор с контрастивным обучением (20 итераций).
  3. Реализовать LLM-классификатор через API (например, OpenAI API или локальный vLLM).
  4. Сравнить F1-score на тестовой выборке (50 примеров).
  5. Обернуть в FastAPI-эндпоинт /classify.

Ожидаемый результат:

  • SetFit: F1 ~0.70–0.75, инференс <50ms.
  • LLM ICL: F1 ~0.80–0.85, инференс ~2–5 сек.
  • Демонстрация trade-off между качеством и скоростью.

Связь с другими вопросами

ВопросТема
916. Что такое Zero-shot классификация в NLPZero-shot классификация (без примеров)
918. Как работают Sentence TransformersЭмбеддинги предложений для SetFit

Навигация

  • Предыдущий: 916
  • Следующий: 918
  • Индекс: 00. Индекс разборов Zero-shot классификация в NLP|916]]
  • Следующий: 918
  • Индекс: 00. Индекс разборов