中文翻译暂不可用,显示俄语原文。
Как вы генерируете hard negative примеры для retrieval обучения?
Краткий тезис
Hard negative — это документ, который похож на релевантный (высокая косинусная близость с запросом), но не является релевантным. Генерация hard negative необходима для обучения качественных эмбеддингов в contrastive learning, так как они заставляют модель различать тонкие границы между похожими, но разными по смыслу документами. Основные методы: retrieval-based (выбор из top-k нерелевантных), LLM-generated (модификация релевантного документа), adversarial (градиентная атака) и BM25 hard negative (лексическое совпадение). Каждый метод имеет свои компромиссы по стоимости, реалистичности и сложности.
1. Термин: Hard Negative (жёсткий негатив)
Hard negative — это пример, который модель ошибочно считает релевантным (или близким к релевантному) на текущем этапе обучения. В контексте retrieval это документ, имеющий высокую similarity (косинусную близость) с запросом, но не являющийся правильным ответом.
Отличие от easy negative (лёгкий негатив): easy negative — это документ, который явно не подходит (например, случайный текст на другую тему). Модель легко отличает его от релевантного. Hard negative же находится на границе: он может содержать те же ключевые слова, ту же тематику, но не отвечать на запрос.
Зачем нужны hard negative
В contrastive learning (например, loss InfoNCE) модель учится приближать эмбеддинги запроса и релевантного документа (positive) и отдалять от негативов. Если негативы слишком лёгкие, модель быстро перестаёт учиться — loss становится низким, а граница между классами остаётся размытой. Hard negative заставляют модель выявлять тонкие семантические различия.
2. Метод 1: Retrieval-based hard negatives (на основе поиска)
Самый распространённый подход. Для каждого запроса берём top-k результатов из текущего или предварительно обученного retriever (например, эмбеддинги + косинусная близость). Из этих результатов исключаем релевантные документы (positive). Оставшиеся документы с высокой similarity — кандидаты в hard negative.
Процесс
- Для запроса q получаем ранжированный список документов D_1...D_k от retriever.
- Удаляем из списка документы, размеченные как релевантные (ground truth).
- Из оставшихся выбираем top-m (обычно m=1..5) с наибольшей similarity — это hard negative.
Плюсы
- Простота реализации.
- Не требует дополнительных моделей.
- Негативы естественно возникают из распределения данных.
Минусы
- Если retriever слабый, hard negative могут быть слишком лёгкими (не похожи на запрос).
- Зависит от качества индекса и эмбеддингов.
Пример кода (PyTorch-like):
def get_retrieval_hard_negatives(query_emb, doc_embeddings, relevant_indices, k=10, m=3):
# query_emb: [1, D], doc_embeddings: [N, D]
scores = torch.mm(query_emb, doc_embeddings.T).squeeze(0) # косинусная близость
topk_scores, topk_indices = torch.topk(scores, k)
hard_neg_candidates = []
for idx in topk_indices:
if idx not in relevant_indices:
hard_neg_candidates.append(idx)
if len(hard_neg_candidates) == m:
break
return hard_neg_candidates
3. Метод 2: LLM-generated hard negatives (генерация через LLM)
Используем большую языковую модель (LLM) для создания документа, который семантически близок к запросу, но содержит неверный факт или противоречие.
Алгоритм
- Берём релевантный документ D_rel для запроса q.
- Подаём в LLM промпт: «Измени ключевой факт в следующем документе так, чтобы он больше не отвечал на вопрос, но оставался правдоподобным. Вопрос: {q}. Документ: {D_rel}. Сгенерируй изменённый документ.»
- LLM возвращает модифицированный документ D_hard.
- Используем D_hard как hard negative.
Плюсы
- Высокая семантическая близость (LLM понимает контекст).
- Можно контролировать степень «жёсткости» (например, менять только числовые значения или даты).
Минусы
- Дорого (вызов LLM для каждого запроса).
- Риск галлюцинаций — сгенерированный документ может случайно оказаться релевантным.
- Требует тщательного промпт-инжиниринга.
Пример промпта
You are an assistant that generates hard negative examples for retrieval training.
Given a question and a relevant document, modify the document so that it no longer answers the question, but remains plausible and topically similar.
Question: {question}
Relevant document: {document}
Modified document:
4. Метод 3: Adversarial hard negatives (состязательные)
Используем градиентный спуск для модификации эмбеддинга документа (или самого текста) так, чтобы увеличить similarity с запросом, при этом документ остаётся нерелевантным. Это похоже на adversarial attack в NLP.
Подход
- Берём нерелевантный документ D_neg (например, случайный).
- Вычисляем градиент similarity между эмбеддингом запроса q и D_neg по параметрам D_neg (если мы работаем в непрерывном пространстве эмбеддингов) или по токенам (если используем дифференцируемый токенизатор).
- Обновляем D_neg в направлении увеличения similarity (например, FGSM: D_neg' = D_neg + epsilon * sign(grad)).
- Полученный D_neg' — hard negative.
Плюсы
- Максимально «жёсткие» негативы, настраиваемые под текущую модель.
- Потенциально улучшает робастность.
Минусы
- Сложность реализации (нужна дифференцируемая модель эмбеддингов).
- Вычислительно затратно.
- Может привести к нереалистичным текстам (если модифицировать в пространстве токенов).
Вариант Использовать PGD (Projected Gradient Descent) для многошаговой атаки.
5. Метод 4: BM25 hard negative (лексическое совпадение)
Используем BM25 (или другой лексический метод) для поиска документов, которые имеют высокое совпадение по ключевым словам с запросом, но семантически нерелевантны.
Процесс
- Для запроса q получаем top-k результатов BM25.
- Исключаем релевантные документы.
- Оставшиеся — hard negative.
Плюсы
- Быстро, не требует нейросетей.
- Хорошо работает для доменов с точной терминологией (медицина, юриспруденция).
- Дополняет семантические методы (эмбеддинги могут не улавливать лексическое совпадение).
Минусы
- Не учитывает семантику (синонимы, перефразирование).
- Может давать слишком лёгкие негативы, если BM25 плохо ранжирует.
6. Сравнение методов
| Метод | Стоимость | Реалистичность | Сложность реализации | Контроль жёсткости |
|---|---|---|---|---|
| Retrieval-based | Низкая | Высокая (из данных) | Низкая | Средний (выбор top-k) |
| LLM-generated | Высокая | Очень высокая | Средняя | Высокий (промпт) |
| Adversarial | Высокая | Средняя (может быть неестественным) | Высокая | Очень высокий (epsilon) |
| BM25 | Низкая | Средняя (только лексика) | Низкая | Низкий |
На практике часто комбинируют: retrieval-based как базовый, LLM-generated для сложных доменов, adversarial для тонкой настройки.
7. Практические рекомендации
- Баланс easy/hard negative Не используйте только hard negative — модель может переобучиться на шум. Обычное соотношение: 1 positive : 1–3 easy negative : 1–2 hard negative.
- Batch hard negatives В triplet loss или InfoNCE можно использовать все документы в батче как негативы (in-batch negatives), но среди них могут быть ложные негативы (если в батче есть релевантные). Hard negative из других батчей или из отдельного пула эффективнее.
- Динамическое обновление По мере обучения модели hard negative из retrieval-based становятся менее «жёсткими» (модель уже научилась их различать). Нужно периодически пересчитывать hard negative с текущим retriever.
- Фильтрация После генерации hard negative проверяйте, что они действительно нерелевантны (например, через LLM-аннотатора или ручную валидацию на небольшой выборке).
8. Оценка качества hard negative
Как понять, что hard negative действительно «жёсткие»?
- Similarity distribution Постройте гистограмму косинусной близости между запросом и hard negative. Если средняя similarity близка к similarity с positive (но чуть ниже) — хорошие hard negative.
- Impact на loss После добавления hard negative loss должен вырасти (модель начинает ошибаться на сложных примерах), а затем снижаться в процессе обучения.
- Retrieval метрики Сравните MRR/Recall@k до и после обучения с hard negative. Улучшение на 5–15% — признак качественных hard negative.
9. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 5 | Оценка качества retrieval |
| 12 | Fine-tuning эмбеддингов для RAG |
| 15 | Contrastive learning и loss функции |
| 20 | Data augmentation для retrieval |
| 25 | Negative sampling strategies |
| 30 | Hard negative mining в NLP |
Пет-проект для закрепления
Задача Реализовать пайплайн генерации hard negative для небольшого датасета (например, MS MARCO или собственного набора вопросов-документов) и обучить эмбеддинги с contrastive loss.
Инструменты Python, PyTorch, HuggingFace Transformers (Sentence-BERT), FAISS, OpenAI API (или локальная LLM).
Шаги:
- Загрузите датасет с парами (запрос, релевантный документ).
- Разбейте документы на чанки (если нужно).
- Реализуйте retrieval-based hard negative: используйте предобученный Sentence-BERT для получения эмбеддингов, выберите top-5 нерелевантных документов для каждого запроса.
- Реализуйте LLM-generated hard negative: для 10% запросов сгенерируйте модифицированные документы через GPT-3.5-turbo (промпт из раздела 3).
- Обучите модель (например,
distilbert-base-uncased) с InfoNCE loss, используя positive + easy negative (случайные) + hard negative (из шагов 3-4). - Оцените retrieval метрики (MRR@10) на тестовом наборе до и после обучения.
Ожидаемый результат Модель, обученная с hard negative, показывает улучшение MRR на 5–10% по сравнению с baseline (только easy negative). Вы также получите практическое понимание компромиссов между методами.
Навигация
- Предыдущий: 683
- Следующий: 685
- Индекс: 00. Индекс разборов