1 points par GN⁺ 2024-09-16 | 1 commentaires | Partager sur WhatsApp

WordLlama

WordLlama est un outil de NLP rapide et léger, capable de gérer des tâches comme la déduplication floue, la similarité et le classement avec un minimum de dépendances à l’inférence, et optimisé pour le matériel CPU.

Table des matières

  • Démarrage rapide
  • Qu’est-ce que c’est ?
  • Résultats MTEB
  • Embeddings de texte
  • Notes d’entraînement
  • Feuille de route
  • Extraction des embeddings de tokens
  • Citation
  • Licence

Démarrage rapide

  • Installation :

    pip install wordllama
    
  • Charger le modèle 256 dimensions :

    from wordllama import WordLlama
    wl = WordLlama.load()
    
  • Calculer la similarité entre deux phrases :

    similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
    print(similarity_score)  # sortie : 0.06641249096796882
    
  • Classer des documents pour une requête :

    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)
    # sortie :
    # [
    #  ('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éthodes d’inférence supplémentaires :

    wl.deduplicate(candidates, threshold=0.8)  # déduplication floue
    wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4)  # labellisation avec initialisation kmeans/kmeans++
    wl.filter(query, candidates, threshold=0.3)  # filtrer les candidats selon la requête
    wl.topk(query, candidates, k=3)  # renvoyer les k meilleures chaînes selon la requête
    

Qu’est-ce que c’est ?

WordLlama est un modèle de NLP et d’embeddings de mots qui réutilise des composants de grands modèles de langage (LLM) pour produire des représentations de mots efficaces et compactes. Il est similaire à des modèles comme GloVe, Word2Vec et FastText.

  • Matryoshka Representations : réduction possible de la dimension des embeddings selon les besoins
  • Faibles besoins en ressources : fonctionnement rapide sur CPU via une simple recherche de tokens avec average pooling
  • Binarisation : les modèles entraînés avec un straight-through estimator peuvent être empaquetés en petits tableaux d’entiers (bientôt disponible)
  • Inférence uniquement en Numpy : léger et simple

WordLlama convient à diverses tâches de NLP et s’avère utile pour l’analyse exploratoire et les applications utilitaires grâce à sa rapidité et à sa taille portable.

Résultats 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 texte

Comment charger des embeddings préentraînés et encoder du texte :

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)

Exemple d’utilisation d’un modèle d’embeddings binaires :

wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car")  # sortie : 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)  # sortie : 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False  # utiliser la similarité cosinus au lieu de la similarité de Hamming
wl = WordLlama.load(config="l3_supercat", dim=1024)

Notes d’entraînement

Les modèles d’embeddings binaires ont montré des améliorations plus nettes en haute dimension, et 512 ou 1024 dimensions sont recommandées. L2 Supercat a été entraîné pendant 12 heures sur un seul A100 avec une taille de batch de 512.

Feuille de route

  • Ajouts de fonctionnalités d’inférence en cours :
    • segmentation sémantique de texte
    • ajout de notebooks d’exemple
    • évaluateur DSPy
    • pipelines RAG

Extraction des embeddings de tokens

Pour extraire les embeddings de tokens depuis le modèle, il faut accepter l’accord utilisateur et se connecter avec la CLI Hugging Face. Ensuite, on peut utiliser l’extrait suivant :

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

Citation

Si vous utilisez WordLlama dans une recherche ou un projet, merci de le citer comme suit :

@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}
}

Licence

Ce projet est sous licence MIT.

Résumé de GN⁺

  • WordLlama est un outil de NLP qui réutilise des composants de grands modèles de langage pour produire des représentations de mots efficaces et compactes.
  • Il fonctionne rapidement sur CPU et peut servir d’utilitaire « couteau suisse » adapté à diverses tâches de NLP.
  • Les modèles d’embeddings binaires montrent des améliorations plus nettes en haute dimension, et 512 ou 1024 dimensions sont recommandées.
  • Sa rapidité et sa taille portable le rendent utile pour l’analyse exploratoire et les applications utilitaires.

1 commentaires

 
GN⁺ 2024-09-16
Commentaires Hacker News
  • J’aime bien la petite taille, c’est un avantage par rapport au plus petit modèle de SBERT

    • Techniquement, c’est dépassé, mais c’est un compromis en faveur des performances
    • Demande d’un moyen de basculer entre différents types de similarité (par ex. sémantique, NLI, nom-abstrait)
    • Par exemple, vouloir que « Freezing » et « Burning » soient considérés comme similaires pour la classification d’articles de presse, mais comme opposés pour des articles de chimie
    • Souhait d’utiliser des embeddings NLI pour identifier des relations causales
    • SBERT est volumineux et doit charger plusieurs modèles, donc il consomme beaucoup de ressources
  • Les embeddings capturent beaucoup d’informations sémantiques et peuvent être utilisés indépendamment pour des tâches utiles

    • Utilisation des embeddings du text encoder de CLIP pour enrichir les prompts
    • Par exemple, si on donne le mot « building », on peut trouver dans la matrice d’embeddings « concrete », « underground », etc., pour les remplacer ou les ajouter
    • Dans des expériences limitées, cela donne un rappel élevé pour la plupart des requêtes
  • Question sur l’existence de plans pour d’autres langues que l’anglais

    • Ce serait un outil parfait pour le français
  • Cela montre que les tokens eux-mêmes contiennent déjà beaucoup de contenu sémantique

  • Réflexion sur l’utilisation des embeddings pour résoudre Little Alchemy

  • Très utile pour le développement de jeux, merci

  • Ça a l’air sympa, question sur les avantages du modèle mini-lm

    • Il semble meilleur sur la plupart des tâches MTEB, mais je me demande s’il est aussi meilleur pour le raisonnement, etc.
  • A écrit il y a quelques années un « jeu de langage » utilisant une fonctionnalité similaire