Оффлайн способ поиска трудных негативных примеров ================================================= При обучение моделей использовался оффлайн способ поиска трудных негативных примеров. Сначала модель обучается с использованием случайных негативных примеров, которые оказываются в мини-батче. Первоначальное обучение происходит с максимально возможным размером мини-батча, чтобы увеличить количество случайных негативных примеров. Также параметр ``model.margin``, ``model.sent.margin`` устанавливается равным 0.2 и 0.3 соответственно. Поиск сложных негативных примеров может проходит на уровне предложений и на уровне документов. В обоих случаях процесс одинаковый, в качестве примера рассмотрим уровень предложений. Все предложения из обучающей выборке из файлов ``{train,dev}.tgt`` кодируются первой версией энкодера и индексируются с помощью библиотекой Faiss в индекс HNSWFlat. После этого для предложений из файлов ``{train,dev}.src`` проводится поиск k (использовалось значение k==30) наиболее близких предложений. При выборе трудных отрицательных примеров нужно отсечь положительные похожие предложения, которые могут оказаться нечеткими дубликатами. Поэтому для каждого предложения-запроса :math:`src_i` выбирались 4 предложения, удовлетворяющие условию, заданному формулой: .. math:: \{t \mid t \in top\_sim(src_i, 30) \land sim(t) < sim(tgt_i) - 0.035 \land hns[t] < 500 \} где :math:`hns` — глобальный счетчик всех трудных отрицательных примеров, введенный для ограничения количества раз, когда предложение может выступать в качестве трудного отрицательного примера. Чтобы наполнить мини-батчи сложными примерами для всех предложений-запросов, предложения-запросы предварительно кластеризуются. Для векторизации предложений используется первая версия энкодера. В качестве алгоритма кластеризации используется метод K-means, реализованный в библиотеки Faiss. Все предложения-запросы сортируются по номеру присвоенного кластера.