Как вы генерируете 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.

Процесс

  1. Для запроса q получаем ранжированный список документов D_1...D_k от retriever.
  2. Удаляем из списка документы, размеченные как релевантные (ground truth).
  3. Из оставшихся выбираем 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) для создания документа, который семантически близок к запросу, но содержит неверный факт или противоречие.

Алгоритм

  1. Берём релевантный документ D_rel для запроса q.
  2. Подаём в LLM промпт: «Измени ключевой факт в следующем документе так, чтобы он больше не отвечал на вопрос, но оставался правдоподобным. Вопрос: {q}. Документ: {D_rel}. Сгенерируй изменённый документ.»
  3. LLM возвращает модифицированный документ D_hard.
  4. Используем 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.

Подход

  1. Берём нерелевантный документ D_neg (например, случайный).
  2. Вычисляем градиент similarity между эмбеддингом запроса q и D_neg по параметрам D_neg (если мы работаем в непрерывном пространстве эмбеддингов) или по токенам (если используем дифференцируемый токенизатор).
  3. Обновляем D_neg в направлении увеличения similarity (например, FGSM: D_neg' = D_neg + epsilon * sign(grad)).
  4. Полученный D_neg' — hard negative.

Плюсы

  • Максимально «жёсткие» негативы, настраиваемые под текущую модель.
  • Потенциально улучшает робастность.

Минусы

  • Сложность реализации (нужна дифференцируемая модель эмбеддингов).
  • Вычислительно затратно.
  • Может привести к нереалистичным текстам (если модифицировать в пространстве токенов).

Вариант Использовать PGD (Projected Gradient Descent) для многошаговой атаки.


5. Метод 4: BM25 hard negative (лексическое совпадение)

Используем BM25 (или другой лексический метод) для поиска документов, которые имеют высокое совпадение по ключевым словам с запросом, но семантически нерелевантны.

Процесс

  1. Для запроса q получаем top-k результатов BM25.
  2. Исключаем релевантные документы.
  3. Оставшиеся — 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
12Fine-tuning эмбеддингов для RAG
15Contrastive learning и loss функции
20Data augmentation для retrieval
25Negative sampling strategies
30Hard negative mining в NLP

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

Задача Реализовать пайплайн генерации hard negative для небольшого датасета (например, MS MARCO или собственного набора вопросов-документов) и обучить эмбеддинги с contrastive loss.

Инструменты Python, PyTorch, HuggingFace Transformers (Sentence-BERT), FAISS, OpenAI API (или локальная LLM).

Шаги:

  1. Загрузите датасет с парами (запрос, релевантный документ).
  2. Разбейте документы на чанки (если нужно).
  3. Реализуйте retrieval-based hard negative: используйте предобученный Sentence-BERT для получения эмбеддингов, выберите top-5 нерелевантных документов для каждого запроса.
  4. Реализуйте LLM-generated hard negative: для 10% запросов сгенерируйте модифицированные документы через GPT-3.5-turbo (промпт из раздела 3).
  5. Обучите модель (например, distilbert-base-uncased) с InfoNCE loss, используя positive + easy negative (случайные) + hard negative (из шагов 3-4).
  6. Оцените retrieval метрики (MRR@10) на тестовом наборе до и после обучения.

Ожидаемый результат Модель, обученная с hard negative, показывает улучшение MRR на 5–10% по сравнению с baseline (только easy negative). Вы также получите практическое понимание компромиссов между методами.


Навигация