Расстояния и сходство

Евклидово расстояние, dot product, cosine similarity. Кейс: сравнение текстов и объектов.

Как только мы представили данные в виде чисел и векторов, возникает естественный вопрос: как понять, что два объекта похожи или, наоборот, сильно отличаются? Машинное обучение почти всегда сводится к сравнению. Этот текст ближе к тому или к этому, этот пользователь похож на другого или нет, это изображение относится к классу A или B и т.д.

Чтобы формализовать такие рассуждения, нам нужны меры расстояния и меры сходства. В математике и ML это не абстрактные термины, а конкретные функции, которые принимают два вектора и возвращают число. По этому числу алгоритм и принимает решения.

В этой главе мы разберем три ключевых инструмента: евклидово расстояние, скалярное произведение (dot product) и косинусное сходство (cosine similarity). Они лежат в основе kNN, линейных моделей, рекомендательных систем, поиска по текстам и эмбеддингов.

Евклидово расстояние – "обычная" геометрия

Евклидово расстояние – это расстояние "по линейке" между двумя точками в пространстве.

Если у нас есть два вектора

x=(x1,x2,,xn)y=(y1,y2,,yn)x = (x_1, x_2, \dots, x_n) \\ y = (y_1, y_2, \dots, y_n)

то евклидово расстояние между ними определяется формулой:

d(x,y)=i=1n(xiyi)2d(x, y) = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2}

Если n=2n = 2, это расстояние между точками на плоскости. Если n=100n = 100 или, например, 768768, то по сути геометрия остается той же самой, просто ее уже нельзя нарисовать напрямую, так как человек не может воспринять изображения в пространстве, имеющем больше, чем 3 измерения.

9.1 Евклидово расстояние в 2D

Но, при этом, на плоскости это выглядит очень наглядно: две точки и отрезок между ними. В машинном обучении мы делаем ровно то же самое, только в пространстве большей размерности.

Как вы наверняка запомнили из предыдущей главы – евклидово расстояние чувствительно к масштабу и поэтому перед использованием такого расстояния данные часто нормализуют или стандартизируют, если признаки имеют разные масштабы.

Интуитивно: два объекта похожи, если расстояние между их векторами маленькое.

PHP-пример

Пример:

Этот код уже можно использовать в простейшем kNN-классификаторе: мы просто ищем объекты с минимальным расстоянием среди имеющейся выборки.

Скалярное произведение (dot product) – мера согласованности

Скалярное произведение двух векторов определяется как:

xy=i=1nxiyix \cdot y = \sum_{i=1}^{n} x_i y_i

На первый взгляд это просто сумма произведений соответствующих координат и выглядит всего лишь как удобный способ перемножить два набора чисел. Однако у скалярного произведения есть и геометрический смысл:

xy=xycos(θ)x \cdot y = |x| |y| \cos(\theta)

где θ\theta – угол между векторами, а длина (модуль) вектора, определяется как:

x=xx|x| = \sqrt{x \cdot x}
9.2 Два вектора и угол между ними

Скалярное произведение становится большим, когда одновременно выполняются два условия:

  1. Векторы смотрят почти в одну сторону Если угол θθ между ними маленький, их направления совпадают – вклад направления максимален (cosθ1cosθ≈1).

  2. Векторы длинные Чем больше длины векторов, тем больше итоговое значение (произведение модулей xy|x| |y| велико), даже при фиксированном направлении.

Проще говоря:

скалярное произведение = насколько направления совпадают × насколько векторы "крупные"

Это ключевой момент: скалярное произведение учитывает и направление, и масштаб. Из-за этого скалярное произведение смешивает два разных эффекта:

  • направление (похожи ли векторы),

  • масштаб (насколько они большие).

Поэтому его нельзя считать "чистой" мерой сходства. Два вектора могут быть идеально сонаправлены, но если один из них в 10 раз длиннее, скалярное произведение вырастет в 10 раз – хотя направление осталось тем же.

В машинном обучении это используется осознанно. В линейных моделях большое скалярное произведение означает сильную активацию. В нейросетях и attention-механизмах он интерпретируется как мера важности или связи.

9.3 Скалярное произведение как проекция одного вектора на другой

Если представить xyx \cdot y геометрически, то это можно интерпретировать как длину проекции одного вектора на направление другого, умноженную на длину второго вектора.

PHP-пример

Пример:

Косинусное сходство – сравнение направлений

Как мы уже упоминали в прошлой главе - косинусное сходство отвечает на вопрос: насколько векторы направлены в одну сторону, независимо от их длины.

Оно определяется следующей формулой (нетрудно заметить, что она выводится из формулы скалярного произведения векторов):

Результат лежит в диапазоне от -1 до 1, и хотя в практических задачах NLP и эмбеддингов отрицательные значения встречаются редко, но математически они возможны:

9.4 Один и тот же угол, разные длины векторов

На этой картинке важно увидеть: длины разные, но угол одинаковый – значит, косинусное сходство одинаковое.

Это делает косинусное сходство идеальной мерой для текстов и эмбеддингов, где длина вектора часто отражает не смысл, а масштаб (длина текста, частота слов).

PHP-пример

Пример:

В данном случае результат 0.8 означает, что векторы довольно похожи по направлению, но не совпадают полностью.

Last updated