1 puntos por GN⁺ 2024-09-16 | 1 comentarios | Compartir por WhatsApp

WordLlama

WordLlama es una herramienta de NLP rápida y ligera que maneja tareas como deduplicación difusa, similitud y ranking con dependencias mínimas en tiempo de inferencia, y está optimizada para hardware CPU.

Índice

  • Inicio rápido
  • ¿Qué es?
  • Resultados MTEB
  • Embeddings de texto
  • Notas de entrenamiento
  • Hoja de ruta
  • Extracción de embeddings de tokens
  • Cita
  • Licencia

Inicio rápido

  • Instalación:

    pip install wordllama
    
  • Cargar el modelo de 256 dimensiones:

    from wordllama import WordLlama
    wl = WordLlama.load()
    
  • Calcular la similitud entre dos oraciones:

    similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
    print(similarity_score)  # salida: 0.06641249096796882
    
  • Clasificar documentos para una consulta:

    query = "i went to the car"
    candidates = ["i went to the park", "i went to the shop", "i went to the truck", "i went to the vehicle"]
    ranked_docs = wl.rank(query, candidates)
    print(ranked_docs)
    # salida:
    # [
    #  ('i went to the vehicle', 0.7441646856486314),
    #  ('i went to the truck', 0.2832691551894259),
    #  ('i went to the shop', 0.19732814982305436),
    #  ('i went to the park', 0.15101404519322253)
    # ]
    
  • Métodos de inferencia adicionales:

    wl.deduplicate(candidates, threshold=0.8)  # deduplicación difusa
    wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4)  # etiquetado usando inicialización kmeans/kmeans++
    wl.filter(query, candidates, threshold=0.3)  # filtrar candidatos según la consulta
    wl.topk(query, candidates, k=3)  # devuelve las k cadenas principales según la consulta
    

¿Qué es?

WordLlama es un modelo de NLP y de embeddings de palabras que reutiliza componentes de modelos grandes de lenguaje (LLM) para generar representaciones de palabras eficientes y compactas. Es similar a modelos como GloVe, Word2Vec y FastText.

  • Matryoshka Representations: permite reducir la dimensión de los embeddings según sea necesario
  • Bajos requisitos de recursos: puede ejecutarse rápido en CPU con una simple búsqueda de tokens usando average pooling
  • Binarización: los modelos entrenados con estimación directa pueden empaquetarse en arreglos de enteros pequeños (próximamente)
  • Inferencia solo con Numpy: ligera y simple

WordLlama es adecuado para diversas tareas de NLP y resulta útil para análisis exploratorio y aplicaciones utilitarias gracias a su velocidad y tamaño portable.

Resultados MTEB

Metric WL64 WL128 WL256 (X) WL512 WL1024 GloVe 300d Komninos all-MiniLM-L6-v2
Clustering 30.27 32.20 33.25 33.40 33.62 27.73 26.57 42.35
Reranking 50.38 51.52 52.03 52.32 52.39 43.29 44.75 58.04
Classification 53.14 56.25 58.21 59.13 59.50 57.29 57.65 63.05
Pair Classification 75.80 77.59 78.22 78.50 78.60 70.92 72.94 82.37
STS 66.24 67.53 67.91 68.22 68.27 61.85 62.46 78.90
CQA DupStack 18.76 22.54 24.12 24.59 24.83 15.47 16.79 41.32
SummEval 30.79 29.99 30.99 29.56 29.39 28.87 30.49 30.81

Embeddings de texto

Cómo cargar embeddings preentrenados y generar embeddings de texto:

from wordllama import WordLlama
wl = WordLlama.load(trunc_dim=64)
embeddings = wl.embed(["the quick brown fox jumps over the lazy dog", "and all that jazz"])
print(embeddings.shape)  # (2, 64)

Ejemplo de uso del modelo de embeddings binarios:

wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car")  # salida: array([[3029168427562626]], dtype=uint64)
wl = WordLlama.load(dim=1024, binary=True)
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
print(similarity_score)  # salida: 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False  # usar similitud coseno en lugar de similitud de Hamming
wl = WordLlama.load(config="l3_supercat", dim=1024)

Notas de entrenamiento

El modelo de embeddings binarios mostró mejoras más claras en dimensiones altas, y se recomiendan 512 o 1024 dimensiones. L2 Supercat fue entrenado durante 12 horas en una sola A100 con tamaño de lote 512.

Hoja de ruta

  • Se está trabajando en agregar funciones de inferencia:
    • segmentación semántica de texto
    • agregar notebooks de ejemplo
    • evaluador de DSPy
    • pipelines de RAG

Extracción de embeddings de tokens

Para extraer embeddings de tokens del modelo, debes aceptar el acuerdo de usuario e iniciar sesión usando Hugging Face CLI. Luego puedes usar el siguiente fragmento:

from wordllama.extract import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")

Cita

Si usas WordLlama en investigación o en un proyecto, por favor cítalo de la siguiente manera:

@software{miller2024wordllama,
  author = {Miller, D. Lee},
  title = {WordLlama: Recycled Token Embeddings from Large Language Models},
  year = {2024},
  url = {https://github.com/dleemiller/wordllama},
  version = {0.2.6}
}

Licencia

Este proyecto está bajo la licencia MIT.

Resumen de GN⁺

  • WordLlama es una herramienta de NLP que reutiliza componentes de modelos grandes de lenguaje para generar representaciones de palabras eficientes y compactas.
  • Funciona rápido en CPU y puede usarse como una utilidad tipo "navaja suiza" adecuada para diversas tareas de NLP.
  • El modelo de embeddings binarios muestra mejoras más claras en dimensiones altas, y se recomiendan 512 o 1024 dimensiones.
  • Es útil para análisis exploratorio y aplicaciones utilitarias gracias a su rapidez y tamaño portable.

1 comentarios

 
GN⁺ 2024-09-16
Opiniones de Hacker News
  • Me gusta el tamaño pequeño; tiene ventaja frente al modelo más pequeño de SBERT

    • Técnicamente está desactualizado, pero es una concesión en favor del rendimiento
    • Se pide una forma de cambiar entre distintos tipos de similitud, por ejemplo semántica, NLI o sustantivo-abstracto
    • Por ejemplo, quisiera que "Freezing" y "Burning" se consideren similares en la clasificación de artículos periodísticos, pero opuestos en artículos de química
    • Quisiera usar embeddings de NLI para identificar relaciones causales
    • SBERT es grande y consume muchos recursos porque hay que cargar varios modelos
  • Los embeddings capturan mucha información semántica y pueden usarse de forma independiente para tareas útiles

    • Se usan embeddings del codificador de texto de un modelo CLIP para reforzar prompts
    • Por ejemplo, si se da la palabra "building", se buscan cosas como "concrete" o "underground" en la matriz de embeddings para sustituirlas o agregarlas
    • En experimentos limitados, se obtuvo un recall alto para la mayoría de las consultas
  • Preguntan si hay planes para idiomas distintos del inglés

    • Sería una herramienta perfecta para francés
  • Muestra que los propios tokens contienen mucho contenido semántico

  • Comentario sobre usar embeddings para resolver Little Alchemy

  • Muy útil para hacer juegos; gracias

  • Se ve genial; preguntan por las ventajas del modelo mini-lm

    • Parece mejor en la mayoría de las tareas de MTEB, pero se preguntan si también es mejor en razonamiento y similares
  • Hace unos años alguien escribió un "juego de lenguaje" usando una función parecida