Escolher entre as funções de distância de vetor para medir a similaridade dos embeddings de vetor

Esta página descreve como escolher entre as funções de distância vetorial fornecidas no Spanner para medir a similaridade entre embeddings de vetores.

Depois de gerar embeddings com seus dados do Spanner, é possível realizar uma pesquisa por similaridade usando funções de distância vetorial. A tabela a seguir descreve as funções de distância vetorial no Spanner.

FunçãoDescriçãoFórmulaRelação com o aumento da similaridade
Produto escalar Calcula o cosseno do ângulo \(\theta\) multiplicado pelo produto das magnitudes dos vetores correspondentes. \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) Aumenta
Distância do cosseno A função de distância do cosseno subtrai a similaridade de cosseno de um (cosine_distance() = 1 - cosine similarity). A similaridade de cosseno mede o cosseno do ângulo \(\theta\) entre dois vetores. 1 - \(\frac{a^T b}{|a| \cdot |b|}\) Diminui
Distância euclidiana Mede a distância em linha reta entre dois vetores. \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) Diminui

Escolher uma medida de similaridade

Dependendo se todos os embeddings de vetor estiverem normalizadas ou não, você pode determinar qual medida de similaridade usar para encontrar a similaridade. Um embedding de vetor normalizado tem uma magnitude (comprimento) de exatamente 1,0.

Além disso, se você souber com qual função de distância o modelo foi treinado, use essa função para medir a similaridade entre os embeddings de vetor.

Dados normalizados

Se você tiver um conjunto de dados em que todos os embeddings de vetor estiverem normalizadas, as três funções vão fornecer os mesmos resultados de pesquisa semântica. Resumindo, embora cada função retorne um valor diferente, esses valores são classificados da mesma maneira. Quando os embeddings estão normalizados, o DOT_PRODUCT() geralmente é o mais eficiente em termos computacionais, mas a diferença é insignificante na maioria dos casos. No entanto, se o aplicativo for altamente sensível ao desempenho, DOT_PRODUCT() poderá ajudar no ajuste de desempenho.

Dados não normalizados

Se você tiver um conjunto de dados em que os embeddings de vetor não estiverem normalizados, não será matematicamente correto usar DOT_PRODUCT() como uma função de distância, porque o produto escalar como função não mede distância. Dependendo de como os embeddings foram gerados e de qual tipo de pesquisa é a preferida, a função COSINE_DISTANCE() ou EUCLIDEAN_DISTANCE() produzirá resultados de pesquisa subjetivamente melhores do que a outra função. A experimentação com COSINE_DISTANCE() ou EUCLIDEAN_DISTANCE() pode ser necessária para determinar qual é a melhor para seu caso de uso.

Não tem certeza se os dados estão normalizados ou não

Se você não tiver certeza se os dados estão normalizados e quiser usar DOT_PRODUCT(), recomendamos usar COSINE_DISTANCE(). COSINE_DISTANCE() é como DOT_PRODUCT() com a normalização integrada. A similaridade medida usando COSINE_DISTANCE() varia de 0 a 2. Um resultado próximo a 0 indica que os vetores são muito semelhantes.

A seguir