Оффлайн способ поиска трудных негативных примеров

При обучение моделей использовался оффлайн способ поиска трудных негативных примеров. Сначала модель обучается с использованием случайных негативных примеров, которые оказываются в мини-батче. Первоначальное обучение происходит с максимально возможным размером мини-батча, чтобы увеличить количество случайных негативных примеров. Также параметр model.margin, model.sent.margin устанавливается равным 0.2 и 0.3 соответственно.

Поиск сложных негативных примеров может проходит на уровне предложений и на уровне документов. В обоих случаях процесс одинаковый, в качестве примера рассмотрим уровень предложений. Все предложения из обучающей выборке из файлов {train,dev}.tgt кодируются первой версией энкодера и индексируются с помощью библиотекой Faiss в индекс HNSWFlat. После этого для предложений из файлов {train,dev}.src проводится поиск k (использовалось значение k==30) наиболее близких предложений. При выборе трудных отрицательных примеров нужно отсечь положительные похожие предложения, которые могут оказаться нечеткими дубликатами. Поэтому для каждого предложения-запроса \(src_i\) выбирались 4 предложения, удовлетворяющие условию, заданному формулой:

\[\{t \mid t \in top\_sim(src_i, 30) \land sim(t) < sim(tgt_i) - 0.035 \land hns[t] < 500 \}\]

где \(hns\) — глобальный счетчик всех трудных отрицательных примеров, введенный для ограничения количества раз, когда предложение может выступать в качестве трудного отрицательного примера.

Чтобы наполнить мини-батчи сложными примерами для всех предложений-запросов, предложения-запросы предварительно кластеризуются. Для векторизации предложений используется первая версия энкодера. В качестве алгоритма кластеризации используется метод K-means, реализованный в библиотеки Faiss. Все предложения-запросы сортируются по номеру присвоенного кластера.