1 pontos por GN⁺ 2024-09-16 | 1 comentários | Compartilhar no WhatsApp

WordLlama

WordLlama é uma ferramenta de NLP rápida e leve, que lida com tarefas como deduplicação difusa, similaridade e ranqueamento com dependências mínimas de tempo de inferência, otimizada para hardware CPU.

Índice

  • Início rápido
  • O que é?
  • Resultados no MTEB
  • Embeddings de texto
  • Notas de treinamento
  • Roadmap
  • Extração de embeddings de tokens
  • Citação
  • Licença

Início rápido

  • Instalação:

    pip install wordllama
    
  • Carregar o modelo de 256 dimensões:

    from wordllama import WordLlama
    wl = WordLlama.load()
    
  • Calcular a similaridade entre duas frases:

    similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
    print(similarity_score)  # saída: 0.06641249096796882
    
  • Ranquear documentos para uma 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)
    # saída:
    # [
    #  ('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 adicionais de inferência:

    wl.deduplicate(candidates, threshold=0.8)  # deduplicação difusa
    wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4)  # rotulagem usando inicialização kmeans/kmeans++
    wl.filter(query, candidates, threshold=0.3)  # filtrar candidatos com base na consulta
    wl.topk(query, candidates, k=3)  # retornar as k principais strings com base na consulta
    

O que é?

WordLlama é um modelo de NLP e embeddings de palavras que reutiliza componentes de grandes modelos de linguagem (LLM) para gerar representações de palavras eficientes e compactas. É semelhante a modelos como GloVe, Word2Vec e FastText.

  • Matryoshka Representations: é possível reduzir a dimensão dos embeddings conforme a necessidade
  • Baixa exigência de recursos: pode rodar rapidamente em CPU com uma simples busca de tokens usando average pooling
  • Binarização: modelos treinados com straight-through estimator podem ser empacotados em pequenos arrays de inteiros (em breve)
  • Inferência apenas com Numpy: leve e simples

WordLlama é adequado para várias tarefas de NLP e útil em análises exploratórias e aplicações utilitárias por ser rápido e portátil.

Resultados no 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

Como carregar embeddings pré-treinados e gerar 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)

Exemplo de uso de um modelo de embeddings binários:

wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car")  # saída: 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)  # saída: 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False  # usar similaridade cosseno em vez de similaridade de Hamming
wl = WordLlama.load(config="l3_supercat", dim=1024)

Notas de treinamento

O modelo de embeddings binários mostrou melhorias mais nítidas em dimensões altas, e 512 ou 1024 dimensões são recomendadas. O L2 Supercat foi treinado por 12 horas em uma única A100 com batch size 512.

Roadmap

  • Trabalhando na adição de recursos de inferência:
    • segmentação semântica de texto
    • adição de notebooks de exemplo
    • avaliador DSPy
    • pipelines de RAG

Extração de embeddings de tokens

Para extrair embeddings de tokens do modelo, é preciso concordar com o termo de consentimento do usuário e fazer login usando a Hugging Face CLI. Em seguida, é possível usar o snippet abaixo:

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

Citação

Se você usar o WordLlama em pesquisa ou projetos, cite da seguinte forma:

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

Licença

Este projeto está sob a licença MIT.

Resumo do GN⁺

  • WordLlama é uma ferramenta de NLP que reutiliza componentes de grandes modelos de linguagem para gerar representações de palavras eficientes e compactas.
  • Roda rapidamente em CPU e pode ser usada como um utilitário “canivete suíço” adequado para várias tarefas de NLP.
  • O modelo de embeddings binários mostra melhorias mais claras em dimensões altas, e 512 ou 1024 dimensões são recomendadas.
  • É útil para análises exploratórias e aplicações utilitárias por ser rápido e ter tamanho portátil.

1 comentários

 
GN⁺ 2024-09-16
Comentários no Hacker News
  • Gosto do tamanho pequeno; é vantajoso em relação ao menor modelo do SBERT

    • Tecnicamente é ultrapassado, mas é um compromisso em prol do desempenho
    • Pedido por uma forma de alternar entre diferentes tipos de similaridade, por exemplo semântica, NLI e substantivo-abstrato
    • Por exemplo, gostaria que "Freezing" e "Burning" fossem semelhantes na classificação de artigos de jornal, mas opostos em artigos de química
    • Quero usar embeddings de NLI para identificar relações causais
    • O SBERT é grande e exige carregar vários modelos, então consome muitos recursos
  • Embeddings capturam muita informação semântica e podem ser usados de forma independente em tarefas úteis

    • Reforço prompts usando embeddings do codificador de texto do modelo CLIP
    • Por exemplo, quando recebo a palavra "building", procuro "concrete", "underground" etc. na matriz de embeddings para substituir ou adicionar
    • Em experimentos limitados, obtive alto recall para a maioria das consultas
  • Pergunta se há planos para idiomas além do inglês

    • Seria uma ferramenta perfeita para o francês
  • Isso mostra que os próprios tokens contêm muito conteúdo semântico

  • Reflexão sobre usar embeddings para resolver Little Alchemy

  • Muito útil para desenvolvimento de jogos, obrigado

  • Parece muito legal; pergunta sobre as vantagens do modelo mini-lm

    • Parece melhor na maior parte das tarefas do MTEB, mas fico curioso se também é melhor em raciocínio e afins
  • Escrevi um "jogo de linguagem" usando um recurso parecido há alguns anos