Что такое Zero-shot Classification на базе NLI (Natural Language Inference) или с использованием XLM-RoBERTa?
Краткий тезис
Zero-shot классификация — это задача отнесения текста к заранее не заданным (не встречавшимся в обучении) классам без дополнительного fine-tuning’a. Наиболее распространённый современный подход использует Natural Language Inference (NLI): модель оценивает, следует ли из текста (посылки) гипотеза «этот текст относится к классу X». Мультиязычные NLI-модели, такие как XLM-RoBERTa, fine-tuned на MNLI, позволяют применять zero-shot классификацию для русского и других языков, обходясь одной предобученной моделью.
2. XLM-RoBERTa: мультиязычный, fine-tuned на MNLI
2.1. Архитектура и обучение
XLM-RoBERTa — это масштабированная многоязычная версия RoBERTa, обученная на 100 языках (включая русский) с использованием Masked Language Modeling. Модель достигает высоких результатов на кросс-языковых задачах за счёт общих эмбеддингов для разных языков.
2.2. Fine-tuning на MNLI
MNLI (Multi-Genre Natural Language Inference) — датасет из 433k пар премиса–гипотеза с тремя метками. XLM-RoBERTa fine-tuned на MNLI (чаще всего версии XLM-R<sub>large</sub>) становится NLI-моделью, способной различать entailment, contradiction и neutral на многих языках. Именно эта модель (или её дистиллированные версии) используется в HuggingFace pipeline для zero-shot классификации.
2.3. Почему XLM-RoBERTa, а не BERT или multilingual BERT?
- XLM-RoBERTa превосходит mBERT на задачах NER, QA, NLI для неродственных языков (русского, китайского, арабского).
- Больший размер словаря (250k токенов) и сбалансированная выборка по языкам даёт лучшее качество на русском.
- На HuggingFace доступны готовые веса joeddav/xlm-roberta-large-xnli и MoritzLaurer/multilingual-minilmv2-L6-mnli-xnli, fine-tuned на XNLI (кросс-языковой NLI).
3. Пример кода с HuggingFace pipeline
from transformers import pipeline
# Загружаем пайплайн zero-shot классификации с мультиязычной NLI-моделью
classifier = pipeline("zero-shot-classification",
model="MoritzLaurer/multilingual-minilmv2-L6-mnli-xnli")
# Текст на русском языке
text = "Увеличение государственного долга США вызывает обеспокоенность инвесторов."
# Кандидатные классы на том же языке
candidate_labels = ["экономика", "политика", "спорт", "технологии"]
# Zero-shot предсказание
result = classifier(text, candidate_labels)
print(result)
# {'sequence': '...', 'labels': ['экономика', 'политика', 'технологии', 'спорт'],
# 'scores': [0.87, 0.08, 0.03, 0.02]}
3.1. Настройка параметров
hypothesis_template— шаблон, по умолчанию «This text is about {}». Для русского языка лучше переопределить:classifier(text, candidate_labels, hypothesis_template="Этот текст относится к {}").multi_label— если текст может относиться к нескольким классам одновременно (сумма вероятностей может быть > 1). Пайплайн использует sigmoid вместо softmax.- Модель можно заменить на локальную:
model="XLM-RoBERTa-large-mnli"(но она может быть тяжеловесна).
3.2. Использование без пайплайна (низкоуровневый API)
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_name = "joeddav/xlm-roberta-large-xnli"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
premise = "Сборная Бразилии выиграла чемпионат мира."
hypothesis = "Этот текст о футболе."
inputs = tokenizer(premise, hypothesis, return_tensors="pt", truncation=True)
with torch.no_grad():
logits = model(**inputs).logits
probs = torch.softmax(logits, dim=-1)
entailment_prob = probs[0, 2].item() # entailment — третий класс
4. Ограничения: чувствительность к формулировке гипотез
4.1. Влияние шаблона и синонимов
- Гипотеза «Этот текст про машины» может дать другой результат, чем «Текст описывает автомобили», из-за несовпадения лексики модели.
- Если кандидатный класс слишком общий (например, «наука»), вероятность entailment может быть высокой для многих текстов. Уточнение через «Эта статья по физике» меняет результат.
4.2. Язык гипотезы
При использовании мультиязычной модели гипотезы должны быть на том же языке, что и текст. Смешение языков (английская гипотеза для русского текста) часто снижает качество.
4.3. Количество классов и пороговые значения
При 10+ классах модель может давать равномерно низкие вероятности entailment. Рекомендуется не более 10–15 классов за один вызов. Также модель плохо работает с близкими по смыслу классами (например, «психология» vs «психотерапия»).
4.4. Вычислительные затраты
- Каждая пара премиса–гипотеза требует отдельного прогона через модель. Для K классов и N текстов необходимо K×N forward-pass’ов (без бэтчинга). Кэширование премисы невозможно, так как гипотеза меняется.
- Дистиллированные версии (MiniLM, TinyBERT) жертвуют точностью ради скорости.
4.5. Отсутствие контроля над распределением
В отличие от fine-tuned классификатора, zero-shot модель не обучается на распределении целевых классов. При дизбалансе или высокой специфичности домена (медицина, право) ошибки возрастают.
Пет-проект для закрепления
Задача: Разработать сервис для автоматической рубрикации новостей на русском языке без предварительной разметки, используя zero-shot классификацию на базе NLI.
Инструменты:
- Python 3.10+
transformers,torch,pandas- Streamlit или FastAPI для веб-интерфейса
- HuggingFace модель
MoritzLaurer/multilingual-minilmv2-L6-mnli-xnli
Шаги:
- Собрать 100–200 новостных заголовков (например, из RSS-ленты Lenta.ru).
- Создать словарь рубрик: «экономика», «политика», «спорт», «культура», «наука», «технологии».
- Реализовать функцию
classify_news(text, labels), которая:- формирует гипотезы на русском («Эта новость относится к {}»);
- вычисляет вероятности entailment;
- возвращает топ-3 рубрики.
- Написать Streamlit-приложение с полем ввода текста и кнопкой «Классифицировать».
- Проверить чувствительность: заменить «экономика» на «финансы» — сравнить результаты.
Ожидаемый результат:
- Работающий демо-сервис, который для любого новостного текста выводит три наиболее вероятные рубрики.
- Вывод о том, как формулировка гипотез влияет на точность (например, «спорт» vs «спортивные события»).
- Краткий отчёт (в формате Jupyter notebook) с анализом ошибок на 50 текстах.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 917 | Противопоставление: zero-shot классификация vs few-shot и fine-tuning |
Навигация
- Предыдущий: 915
- Следующий: 917
- Индекс: 00. Индекс разборов