Escolher entre funções de distância vetorial para medir a semelhança de embeddings vetoriais

Nesta página, descrevemos como escolher entre as funções de distância vetorial fornecidas no Spanner para medir a semelhança entre embeddings vetoriais.

Depois de gerar embeddings a partir dos 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 similaridade crescente
Produto escalar Calcula o cosseno do ângulo \(\theta\) multiplicado pelo produto das magnitudes vetoriais correspondentes. \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) Aumentos
Distância do cosseno A função de distância do cosseno subtrai a semelhança de cosseno de um (cosine_distance() = 1 - cosine similarity). A similaridade do 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 vetoriais estão ou não normalizados, é possível determinar qual medida de similaridade usar para encontrar a similaridade. Um embedding de vetor normalizado tem uma magnitude (comprimento) de exatamente 1,0.

Dados normalizados

Se você tiver um conjunto de dados em que todos os embeddings vetoriais são normalizados, as três funções fornecerão os mesmos resultados de pesquisa semântica. Em essência, embora cada função retorne um valor diferente, esses valores são classificados da mesma maneira. Quando os embeddings são normalizados, 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, o DOT_PRODUCT() poderá ajudar no ajuste.

Dados não normalizados

Se você tiver um conjunto de dados em que os embeddings de vetores não são normalizados, não é matematicamente correto usar DOT_PRODUCT() como uma função de distância, porque o produto escalar como uma função não mede a distância. Dependendo de como os embeddings foram gerados e do tipo de pesquisa preferido, a distância do cosseno ou a função de distância euclidiana podem produzir resultados de pesquisa subjetivamente melhores do que a outra função.

Não tenho certeza se os dados são normalizados ou não normalizados

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

A seguir