Medidas de similitud vectorial y puntaje

Explora las medidas de similitud vectorial y el puntaje en Elasticsearch, incluyendo la distancia L1 y L2, la similitud coseno, la similitud por producto escalar y la similitud máxima en el producto interno.

Desde la búsqueda vectorial hasta las potentes API REST, Elasticsearch ofrece a los desarrolladores el conjunto de herramientas de búsqueda más completo. Explora nuestros cuadernos de muestra en el repositorio de Elasticsearch Labs para probar algo nuevo. También puedes iniciar tu prueba gratuita o ejecutar Elasticsearch localmente hoy mismo.

Cuando surge la necesidad de buscar texto libre y Ctrl+F / Cmd+F ya no es suficiente, el uso de un motor de búsqueda léxico suele ser la siguiente opción lógica que se le viene a la mente. Los motores de búsqueda léxicos se destacan en el análisis y la tokenización del texto que se buscará en términos que se pueden comparar en el momento de la búsqueda, pero generalmente se quedan cortos cuando se trata de comprender y dar sentido al verdadero significado del texto que se indexa y busca.

Ahí es exactamente donde brillan los motores de búsqueda vectorial. Pueden indexar el mismo texto de tal manera que se pueda buscar tanto en función del significado que representa como de sus relaciones con otros conceptos que tienen un significado similar o relacionado.

En este blog, abordaremos brevemente cómo los vectores son un gran concepto matemático para transmitir el significado del texto. Luego, profundizaremos en las diferentes técnicas de similitud compatibles con Elasticsearch cuando se trata de buscar vectores vecinos, es decir, buscar vectores que tengan un significado similar y cómo puntuarlos.

¿Qué son las incrustaciones de vectores?

Este artículo no profundiza en las complejidades de las incrustaciones de vectores. Si quieres explorar este tema más a fondo o necesitas una introducción antes de continuar, te recomendamos que consultes la siguiente guía.

En pocas palabras, las incrustaciones vectoriales se obtienen a través de un proceso de aprendizaje automático (p. ej. redes neuronales de aprendizaje profundo) que transforma cualquier tipo de datos de entrada no estructurados (por ejemplo, texto sin procesar, imagen, video, sonido, etc.) en datos numéricos que llevan su significado y relaciones. Los diferentes tipos de datos no estructurados requieren diferentes tipos de modelos de aprendizaje automático que fueron capacitados para "comprender" cada tipo de datos.

Cada vector localiza un dato específico como un punto en un espacio multidimensional y esa ubicación representa un conjunto de características que el modelo emplea para caracterizar los datos. El número de dimensiones depende del modelo de aprendizaje automático, pero generalmente oscilan entre un par de cientos y unos pocos miles. Por ejemplo, los modelos OpenAI Embeddings cuentan con 1536 dimensiones, mientras que los modelos Cohere Embeddings pueden variar de 382 a 4096 dimensiones. El tipo de campo Elasticsearch dense_vector admite hasta 4096 dimensiones a partir de la última versión.

La verdadera hazaña de las incrustaciones vectoriales es que los puntos de datos que comparten un significado similar están muy juntos en el espacio. Otro aspecto interesante es que las incrustaciones vectoriales también ayudan a capturar relaciones entre puntos de datos.

¿Cómo comparamos vectores?

Sabiendo que los datos no estructurados son divididos por modelos de aprendizaje automático en incrustaciones vectoriales que capturan la similitud de los datos a lo largo de una gran cantidad de dimensiones, ahora necesitamos comprender cómo funciona la coincidencia de esos vectores. Resulta que la respuesta es bastante simple.

Las incrustaciones vectoriales que están cerca unas de otras representan datos semánticamente similares . Entonces, cuando consultamos una base de datos vectorial, la entrada de búsqueda (imagen, texto, etc.) se convierte primero en incrustaciones vectoriales empleando el mismo modelo de aprendizaje automático que se empleó para indexar todos los datos no estructurados, y el objetivo final es encontrar los vectores vecinos más cercanos a ese vector de consulta. Por lo tanto, todo lo que tenemos que hacer es averiguar cómo medir la "distancia" o "similitud" entre el vector de consulta y todos los vectores existentes indexados en la base de datos, es así de simple.

Distancia, similitud y puntaje

Por suerte para nosotros, medir la distancia o similitud entre dos vectores es un problema fácil de resolver gracias a la aritmética vectorial. Entonces, veamos las funciones de distancia y similitud más populares que son compatibles con Elasticsearch. ¡Advertencia, matemáticas por delante!

Justo antes de sumergirnos, echemos un vistazo rápido al puntaje. De hecho, Lucene solo permite que los puntajes sean positivos. Todas las funciones de distancia y similitud que presentaremos en breve producen una medida de qué tan cerca o similares están dos vectores, pero esas cifras en bruto rara vez son aptas para usar como puntaje, ya que pueden ser negativas. Por esta razón, el puntaje final debe derivar del valor de distancia o similitud de una manera que garantice que el puntaje sea positivo y que un puntaje mayor corresponda a una clasificación más alta (es decir, a vectores más cercanos).

Distancia L1

La distancia L1, también llamada distancia de Manhattan, de dos vectores A\vec{A} y B\vec{B} se mide sumando la diferencia absoluta por pares de todos sus elementos. Obviamente, cuanto menor sea la distancia δL1\delta_{L1}, más cerca estarán los dos vectores. La fórmula de la distancia L1 (1) es bastante simple, como se puede ver a continuación:

δL1(A,B)=1inAiBi(1)\tag{1} \delta_{L1}(\vec{A}, \vec{B}) = \sum_{\mathclap{1\le i\le n}} \vert A_i-B_i \vert

Visualmente, la distancia L1 se puede ilustrar como se muestra en la imagen a continuación (en rojo):

Calculando la distancia L1 de los siguientes dos vectores A=(12)\vec{A} = \binom{1}{2} y B=(20.5)\vec{B} = \binom{2}{0.5} obtendría 12+20.5=2.5\vert 1–2 \vert + \vert 2–0.5 \vert = 2.5

Importante: Vale la pena señalar que la función de distancia L1 solo es compatible con la búsqueda vectorial exacta (también conocida como búsqueda de fuerza bruta) empleando la consulta DSL script_score, pero no para la búsqueda aproximada de kNN empleando la opción de búsqueda knno knn consulta DSL.

Distancia L2

La distancia L2, también llamada distancia euclidiana, de dos vectores A\vec{A} y B\vec{B} se mide sumando primero el cuadrado de la diferencia por pares de todos sus elementos y luego tomando la raíz cuadrada del resultado. Es básicamente el camino más corto entre dos puntos. De manera similar a L1, cuanto menor sea la distancia δL2\delta_{L2}, más cerca estarán los dos vectores:

δL2(A,B)=1in(AiBi)2(2)\tag{2} \delta_{L2}(\vec{A},\vec{B}) = \sqrt{\sum_{\mathclap{1\le i\le n}} ( A_i-B_i )^2 }

La distancia L2 se muestra en rojo en la siguiente imagen:

Reutilicemos los mismos dos vectores de muestra A\vec{A} y B\vec{B} que usamos para la distancia δL1\delta_{L1}, y ahora podemos calcular la distancia δL2\delta_{L2} como (12)2+(20.5)2=3.251.803\sqrt{(1-2)^2 + (2-0.5)^2} = \sqrt{3.25} \approxeq 1.803.

En cuanto al puntaje, cuanto menor es la distancia entre dos vectores, más cerca (es decir, más similares) están. Entonces, para derivar un puntaje, necesitamos invertir la medida de distancia, de modo que la distancia más pequeña produzca el puntaje más alta. La forma en que se calcula el puntaje cuando se usa la distancia L2 se ve como se muestra en la fórmula (3) a continuación:

_scoreL2(A,B)=11+δL2(A,B)2(3)\tag{3} \_score_{L2}(\vec{A},\vec{B}) = \frac{1}{1 + \delta_{L2}(\vec{A}, \vec{B})^2}

Reutilizando los vectores de muestra del ejemplo anterior, su puntaje sería 14.250.2352\frac{1}{4.25} \approxeq 0.2352. Dos vectores que están muy cerca uno del otro se acercarán a un puntaje de 1, mientras que el puntaje de dos vectores que están muy lejos uno del otro tenderá hacia 0.

Terminando con las funciones de distancia L1 y L2, una buena analogía para compararlas es pensar en A y B como dos edificios en Manhattan, Nueva York. Un taxi que va de A a B tendría que manejar por el camino L1 (calles y avenidas), mientras que un pájaro probablemente usaría el camino L2 (línea recta).

Similitud de coseno

A diferencia de L1 y L2, la similitud del coseno no mide la distancia entre dos vectores A\vec{A} y B\vec{B}, sino su ángulo relativo, es decir, si ambos apuntan aproximadamente en la misma dirección. Cuanto mayor sea la similitud scoss_{cos}, menor será el ángulo \alfa\alfa entre los dos vectores y, por lo tanto, más "cercanos" están y "similar" es su significado transmitido.

Para ilustrar esto, pensemos en dos personas en la naturaleza que miran en diferentes direcciones. En la siguiente figura, la persona en azul mira en la dirección simbolizada por el vector A\vec{A} y la persona en rojo en la dirección del vector B\vec{B}. Cuanto más dirijan su vista hacia la misma dirección (es decir, cuanto más se acerquen sus vectores), más se superpondrá su campo de visión simbolizado por las áreas azul y roja. Cuánto se superpone su campo de visión es su similitud con el coseno. Sin embargo, tenga en cuenta que la persona B mira más lejos que la persona A (es decir, el vector B\vec{B} es más largo). La persona B podría estar mirando una montaña lejana en el horizonte, mientras que la persona A podría estar mirando un árbol cercano. Para la similitud del coseno, eso no juega ningún papel, ya que solo se trata del ángulo.

Ahora calculemos esa similitud de coseno. La fórmula (4) es bastante simple, donde el numerador consiste en el producto punto de ambos vectores y el denominador contiene el producto de su magnitud (es decir, su longitud):

scos(A,B)=ABA×B(4)\tag{4} s_{cos}(\vec{A}, \vec{B}) = \frac{\vec{A} \cdot \vec{B}}{\Vert \vec{A} \Vert \times \Vert \vec{B} \Vert}

La similitud del coseno entre A\vec{A} y B\vec{B} se muestra en la imagen de abajo como una medida del ángulo entre ellos (en rojo):

Tomemos un desvío rápido para explicar qué significan concretamente estos valores de similitud de coseno. Como se puede ver en la imagen a continuación que muestra la función de coseno, los valores siempre oscilan en el intervalo [1,1].[-1, 1].

Recuerde que para que dos vectores se consideren similares, su ángulo debe ser lo más agudo posible, idealmente cerca de un ángulo de 0°0 ° , lo que se reduciría a una similitud perfecta de 11. En otras palabras, cuando los vectores son...

  1. ...cerca uno del otro, el coseno de su ángulo se acerca a 11 (es decir, cerca de 0°)
  1. ...sin relación, el coseno de su ángulo se acerca a 00 (es decir, cerca de 90°90°)
  1. ...opuesto, el coseno de su ángulo se acerca a 1-1 (es decir, cerca de 180°180°)

Ahora que sabemos cómo calcular la similitud del coseno entre dos vectores y tenemos una buena idea de cómo interpretar el valor resultante, podemos reutilizar los mismos vectores demuestraAde muestra \vec{A} y B\vec{B} y calcular su similitud de coseno usando la fórmula (4) que vimos anteriormente.

scos(A,B)=(12)+(20.5)(12+22)×(22+0.52)34.6090.650791s_{cos}(\vec{A}, \vec{B}) = \frac{(1 \cdot 2) + (2 \cdot 0.5)}{\sqrt{(1^2 + 2^2)} \times \sqrt{(2^2 + 0.5^2)}} \approxeq \frac{3}{4.609} \approxeq 0.650791

Obtenemos una similitud de coseno de 0.6507910.650791, que está más cerca de 11 que de 00, lo que significa que los dos vectores son algo similares, es decir, no perfectamente similares, pero tampoco completamente desrelacionados, y ciertamente no tienen un significado opuesto.

Para obtener un puntaje positivo de cualquier valor de similitud de coseno, necesitamos usar la siguiente fórmula (5), que transforma los valores de similitud de coseno que oscilan dentro del intervalo [1,1][-1, 1] en puntajes en el intervalo [0,1]:[0, 1]:

_scorecos(A,B)=1+scos(A,B)2(5)\tag{5} \_score_{cos}(\vec{A},\vec{B}) = \frac{1 + s_{cos}(\vec{A}, \vec{B})}{2}

El puntaje para los vectores demuestraAde muestra \vec{A} y B\vec{B} sería: 1+0.65079120.8253\frac{1 + 0.650791}{2} \approxeq 0.8253.

Similitud de productos Dot

Un inconveniente de la similitud del coseno es que solo tiene en cuenta el ángulo entre dos vectores pero no su magnitud, lo que significa que si dos vectores apuntan aproximadamente en la misma dirección pero uno es mucho más largo que el otro, ambos se considerarán similares. La similitud de producto punto, también llamada similitud de producto escalar o interno, mejora eso al tener en cuenta tanto el ángulo como la magnitud de los vectores, lo que proporciona una métrica de similitud más precisa. Para hacer que la magnitud de los vectores sea irrelevante, la similitud del producto punto requiere que los vectores se normalicen primero, por lo que, en última instancia, solo estamos comparando vectores de longitud unitaria 1.

Intentemos ilustrar esto nuevamente con las mismas dos personas que antes, pero esta vez, las colocamos en el medio de una habitación circular, de modo que su alcance visual sea exactamente el mismo (es decir, el radio de la habitación). De manera similar a la similitud del coseno, cuanto más volteen hacia la misma dirección (es decir, cuanto más se acerquen sus vectores), más se superpondrá su campo de visión. Sin embargo, al contrario de la similitud del coseno, ambos vectores tienen la misma longitud y ambas áreas tienen la misma superficie, lo que significa que las dos personas miran exactamente la misma imagen ubicada a la misma distancia. La superposición de esas dos áreas denota su similitud de producto punto.

Antes de introducir la fórmula de similitud de producto punto, veamos rápidamente cómo se puede normalizar un vector. Es bastante simple y se puede hacer en dos pasos triviales:

  1. calcular la magnitud del vector
  2. Divida cada componente por la magnitud obtenida en 1.

Como ejemplo, tomemos el vector A=(12)\vec{A} = \binom{1}{2}. Podemos calcular su magnitud A\Vert \vec{A} \Vert como vimos anteriormente al revisar la similitud del coseno, es decir, 12+22=5\sqrt{1^2 + 2^2} = \sqrt{5}. Luego, dividiendo cada componente del vector por su magnitud, obtenemos el siguiente vector estandarizado C\vec{C}:

Anorm=C=(1525)(0.440.89)\vec{A_{norm}} = \vec{C} = \dbinom{\frac{1}{\sqrt{5}}}{\frac{2}{\sqrt{5}}} \approxeq \dbinom{0.44}{0.89}

Pasar por el mismo proceso para el segundo vector B=(20.5)\vec{B} = \binom{2}{0.5} obtendría el siguiente vector estandarizado D\vec{D}:

Bnorm=D=(24.250.54.25)(0.970.24)\vec{B_{norm}} = \vec{D} = \dbinom{\frac{2}{\sqrt{4.25}}}{\frac{0.5}{\sqrt{4.25}}} \approxeq \dbinom{0.97}{0.24}

Para derivar la fórmula de similitud de producto punto, podemos calcular la similitud de coseno entre nuestros vectores estandarizados C\vec{C} y D\vec{D} usando la fórmula (4), como se muestra a continuación:

scos(C,D)=CD1×1s_{cos}(\vec{C}, \vec{D}) = \frac{\vec{C} \cdot \vec{D}}{1 \times 1}

Y dado que la magnitud de ambos vectores estandarizados es ahora 11, la fórmula de similitud del producto punto (6) simplemente se convierte en... Lo adivinaste, un producto punto de ambos vectores estandarizados:

sdot(C,D)=CD(6)\tag{6} s_{dot}(\vec{C}, \vec{D}) = \vec{C} \cdot \vec{D}

En la imagen a continuación, mostramos los vectores estandarizados C\vec{C} y D\vec{D} y podemos ilustrar su similitud de producto punto como la proyección de un vector sobre el otro (en rojo).

Usando nuestra nueva fórmula (6), podemos calcular la similitud del producto punto de nuestros dos vectores estandarizados, lo que como era de esperar produce exactamente el mismo valor de similitud que el del coseno:

sdot(C,D)=(1524.25)+(250.54.25)0.650791s_{dot}(\vec{C}, \vec{D}) = \Big(\frac{1}{\sqrt{5}} \cdot \frac{2}{\sqrt{4.25}}\Big) + \Big(\frac{2}{\sqrt{5}} \cdot \frac{0.5}{\sqrt{4.25}}\Big) \approxeq 0.650791

Al aprovechar la similitud de productos puntos, el puntaje se calcula de forma diferente en función de si los vectores contienen valores flotantes o de bytes. En el primer caso, el puntaje se calcula de la misma manera que para la similitud del coseno empleando la fórmula (7) a continuación:

_scoredotfloat(C,D)=1+sdot(C,D)2(7)\tag{7} \_score_{dot-float}(\vec{C},\vec{D}) = \frac{1 + s_{dot}(\vec{C}, \vec{D})}{2}

Sin embargo, cuando el vector se compone de valores de bytes, el puntaje se calcula de manera un poco diferente, como se muestra en la fórmula (8) a continuación, donde dimsdims es el número de dimensiones del vector:

_scoredotbyte(C,D)=0.5+sdot(C,D)32768×dims(8)\tag{8} \_score_{dot-byte}(\vec{C},\vec{D}) = \frac{0.5 + s_{dot}(\vec{C}, \vec{D})}{32768 \times dims}

Además, una restricción para obtener puntajes precisos es que todos los vectores, incluido el vector de consulta, deben tener la misma longitud, pero no necesariamente 1.

Máxima similitud interna del producto

Desde la versión 8.11, hay una nueva función de similitud que está menos restringida que la similitud del producto punto, ya que no es necesario normalizar los vectores. La razón principal de esto se explica en detalle en el siguiente artículo, pero para resumirlo muy brevemente, ciertos conjuntos de datos no están muy bien adaptados a tener sus vectores estandarizados (por ejemplo, incrustaciones coherentes) y hacerlo puede causar problemas de relevancia.

La fórmula para calcular la similitud máxima del producto interno es exactamente la misma que la del producto punto (6). Lo que cambia es la forma en que se calcula el puntaje escalando la similitud máxima del producto interno empleando una función por partes cuya fórmula depende de si la similitud es positiva o negativa, como se muestra en la fórmula (9) a continuación:

_scoremip(A,B)={11sdot(A,B)if sdot<01+sdot(A,B)if sdot0(9)\tag{9} \_score_{mip}(\vec{A},\vec{B}) = \begin{cases} \Large \frac{1}{1 - s_{dot}(\vec{A}, \vec{B})} &\text{if } s_{dot} < 0 1 + s_{dot}(\vec{A}, \vec{B}) &\text{if } s_{dot} \geqslant 0 \end{cases}

Lo que hace esta función por partes es que escala todos los valores negativos de similitud del producto interno máximo en el intervalo [0,1[[0, 1[ y todos los valores positivos en el intervalo [1,[[1, \infty[ .

En resumen

Fue un gran viaje, matemáticamente hablando, pero aquí hay algunas conclusiones que pueden resultarle útiles.

La función de similitud que puede usar, en última instancia, depende de si sus incrustaciones vectoriales están normalizadas o no. Si sus vectores ya están estandarizados o si su conjunto de datos es independiente de la normalización de vectores (es decir, la relevancia no se verá afectada), puede continuar y normalizar sus vectores y usar la similitud de producto punto, ya que es mucho más rápido de calcular que el de coseno ya que no es necesario calcular la longitud de cada vector. Al comparar millones de vectores, esos cálculos pueden sumar bastante.

Si los vectores no están estandarizados, tiene dos opciones:

  1. Use la similitud de coseno si normalizar sus vectores no es una opción
  2. use la nueva similitud de producto interno máximo si desea que la magnitud de sus vectores contribuya al puntaje porque tienen significado (por ejemplo, incrustaciones coherentes)

En este punto, calcular la distancia o similitud entre las incrustaciones vectoriales y cómo derivar sus puntajes debería tener sentido para usted. Esperamos que este artículo le resultó útil.

Preguntas frecuentes

¿Qué mide la similitud del coseno?

La similitud del coseno mide el ángulo relativo entre dos vectores, es decir, si ambos apuntan aproximadamente en la misma dirección.

¿Cómo se mide la distancia L1?

La distancia L1 se mide sumando la diferencia absoluta por pares de todos sus elementos.

¿Cómo se mide la distancia L2?

La distancia L2, también llamada distancia euclidiana, de dos vectores se mide sumando primero el cuadrado de la diferencia por pares de todos sus elementos y luego tomando la raíz cuadrada del resultado.

¿Cuál es la diferencia entre la distancia L1 y L2?

La diferencia entre la distancia L1 y L2 se reduce a cómo mides dos vectores. La distancia L1 se mide sumando la diferencia absoluta por pares de todos sus elementos. Por otro lado, la distancia L2 se mide primero sumando el cuadrado de la diferencia por pares de todos sus elementos y luego tomando la raíz cuadrada del resultado.

¿Cuál es la diferencia entre la similitud del coseno y la distancia del coseno?

La similitud coseno mide el ángulo relativo de dos vectores, es decir, si ambos apuntan aproximadamente en la misma dirección. Por otro lado, la distancia coseno mide cuán diferentes son sus direcciones.

¿Cuál es la diferencia entre la similitud entre producto escalar y coseno?

El producto escalar mide tanto la longitud como la alineación de los vectores, mientras que la similitud coseno mide solo cuán alineadas están sus direcciones, ignorando la longitud.

¿Cuándo deberías usar la similitud entre producto escalar y coseno?

Si f tus vectores están estandarizados (o pueden normalizar sin afectar la relevancia), usa la similitud del producto escalar — es más rápido porque no necesitas calcular longitudes de vectores. Si tus vectores no están estandarizados, usa similitud coseno cuando solo te importa la dirección, o producto escalar si la magnitud vectorial tiene significado y debería influir en el puntaje.

¿Cómo eliges la métrica de distancia adecuada para la búsqueda vectorial?

Elige una métrica de distancia basada en tus vectores y en lo que importa para tu búsqueda: usa L1 o L2 para medir diferencias absolutas, similitud coseno si solo importa la dirección, producto escalar si tanto dirección como magnitud importan (y los vectores están estandarizados), o producto interno máximo si los vectores no están estandarizados pero la magnitud debería influir en la relevancia.

Contenido relacionado

¿Estás listo para crear experiencias de búsqueda de última generación?

No se logra una búsqueda suficientemente avanzada con los esfuerzos de uno. Elasticsearch está impulsado por científicos de datos, operaciones de ML, ingenieros y muchos más que son tan apasionados por la búsqueda como tú. Conectemos y trabajemos juntos para crear la experiencia mágica de búsqueda que te dará los resultados que deseas.

Pruébalo tú mismo