Перейти к содержимому

Глава 165: Hard Negative Mining (Поиск сложных негативных примеров)

Обзор

В контрастивном обучении модель учится сближать похожие примеры (позитивные) и отталкивать непохожие (негативные). В стандартных реализациях, таких как в Главе 164, негативные примеры обычно выбираются случайным образом из текущего пакета (batch).

Однако не все негативные примеры одинаково полезны. «Легкие» негативы (примеры, которые совершенно не похожи на якорь) дают очень мало информации для обучения, так как модель различает их без усилий. Hard Negative Mining — это процесс идентификации примеров, которые очень похожи на якорь, но относятся к другому классу. Эти «сложные» примеры заставляют модель выстраивать более точные границы и извлекать более устойчивые признаки.

Почему это важно для трейдинга

Финансовые временные ряды часто демонстрируют схожие локальные паттерны (например, небольшая «просадка»), имея при этом совершенно разные долгосрочные тренды.

  • Случайные негативы: Могут сравнить график «синусоиды» с графиком «восходящего тренда». Это слишком просто.
  • Сложные негативы: Могут сравнить две разные «синусоиды», принадлежащие разным режимам рынка или активам. Это заставляет модель игнорировать поверхностное сходство и находить глубокие структурные признаки.

Архитектура

Мы реализуем две основные стратегии выбора негативов:

  1. Top-K Batch Mining: Внутри каждого пакета данных мы вычисляем полную матрицу сходства и выбираем $K$ наиболее похожих (но неверных) примеров в качестве негативов.
  2. Semi-Hard Mining: Выбор негативов, сходство которых высоко, но строго меньше сходства якоря с позитивным примером.

Структура проекта

165_hard_negative_mining/
├── README.md # Обзор на английском
├── README.ru.md # Обзор на русском
├── docs/ru/theory.md # Математические основы
├── python/
│ ├── model.py # Архитектура энкодеров
│ ├── miner.py # Логика майнинга (Top-K)
│ └── train.py # Цикл обучения
└── rust/src/
└── lib.rs # Оптимизированный майнер на Rust