es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Realización rápida de similitud coseno con lista de embeddings.

Tengo una lista frases para cada una de las cuales deseo obtener la coincidencia más cercana de un conjunto de 25k vectores de incrustación (emb2_list). Estoy usando similitud de coseno para este propósito. El siguiente es el código:

from sentence_transformers import SentenceTransformer, util
import numpy as np
import torch

model = SentenceTransformer('bert-base-nli-stsb-mean-tokens')

emb2_list = np.load("emb2_list.npy") #ya codificado, len = 25K

phrases = ['frase1','frase2','frase3','frase4',]

for frase in frases:

    emb1 = model.encode(frase)

    sim_cos = []

    for emb2 in emb2_list:
        sim_cos.append(util.pytorch_cos_sim(emb1, emb2)[0][0].item())


    v, i = torch.Tensor(sim_cos).topk(1)

    print(f'frase:{frase} índice de coincidencia:{i}')

El problema es que cada iteración tarda ~1 segundo (total de ~4 segundos en este ejemplo). Realmente se convierte en un problema una vez que el tamaño de phrases aumenta (ya que esto es parte de una API en línea).

¿Hay una mejor manera de encontrar la similitud de coseno en términos de estructura de datos, técnica de batch o algún tipo de algoritmo de aproximación/Vecino más cercano que pueda acelerar este proceso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Es posible acelerar el proceso de encontrar la coincidencia más alta de un conjunto de 25k vectores de inclusión utilizando una técnica de agrupación o un algoritmo de aproximación/vecino más cercano. Por ejemplo, se podría utilizar un algoritmo de Hashing especialmente sensible a la localidad (LSH) para aproximar la similitud del coseno, lo que reduciría la complejidad temporal de O(n) a O(log n). Además, se podría utilizar un algoritmo de Vecinos más Cercanos K (KNN) para encontrar la coincidencia más alta, lo que también reduciría la complejidad temporal.

Comments are closed.