Как косинусное расстояние помогает измерять семантическую близость векторов
Что проверяют
Понимаете ли вы, почему для эмбеддингов сравнивают направление векторов, а не их длину, и различаете ли косинусное сходство и косинусное расстояние. Следом спрашивают, чем косинус отличается от скалярного произведения и евклидова расстояния на нормированных векторах.
Как отвечать
Косинусное сходство это скалярное произведение векторов, делённое на произведение их норм. Значения лежат от -1 до 1. Косинусное расстояние обычно определяют как единицу минус сходство, оно лежит от 0 до 2. scipy.spatial.distance.cosine и метрика cosine в sklearn возвращают именно расстояние, а sklearn.metrics.pairwise.cosine_similarity возвращает сходство.
Почему это работает для смысла: модели эмбеддингов (sentence-transformers, энкодеры на базе BERT) обучаются так, что близкие по смыслу тексты получают векторы, смотрящие в одну сторону. Длина же часто отражает частотность или длину текста, а для смысла это шум. Косинус её отбрасывает.
Практические детали:
- нормализация: у векторов единичной длины косинус равен скалярному произведению, а квадрат евклидова расстояния равен двум минус удвоенный косинус. Поэтому векторные базы часто хранят нормированные векторы и считают inner product;
- индексы: в pgvector есть оператор
<=>и классvector_cosine_opsдля HNSW и IVFFlat, в FAISS векторы нормируют и берутIndexFlatIP; - порог: абсолютное значение косинуса несравнимо между моделями. У одной 0.8 означает близкие тексты, у другой так выглядят почти любые пары. Порог подбирают на размеченных примерах.
Ограничение: косинус меряет близость в пространстве конкретной модели. Антонимы вроде «горячий» и «холодный» у word2vec часто очень близки, потому что встречаются в одинаковых контекстах.
Где спотыкаются
Называют косинусом расстояния сам косинус угла. Тогда сортировка «по расстоянию» выдаёт самые непохожие документы первыми.
Сравнивают эмбеддинги разных моделей или разных версий одной модели. Пространства разные, косинус между ними бессмыслен.
Считают TF-IDF и нейросетевые эмбеддинги одинаково смысловыми. TF-IDF ловит совпадение слов: «купить авто» и «приобрести машину» у него почти ортогональны.