O que são embeddings e por que eles são importantes
(simonwillison.net)- Embeddings convertem conteúdos como texto, imagem e código em um array de ponto flutuante de tamanho fixo, permitindo encontrar itens semanticamente próximos por cálculo de distância
- No espaço vetorial criado pelo mesmo modelo, mesmo sem saber o significado de cada número individual, é possível comparar documentos relacionados, imagens semelhantes e trechos de código com similaridade de cosseno
- Em um caso que armazenou 472 posts de TIL como vetores de 1.536 dimensões com o OpenAI
text-embedding-ada-002, a consulta para buscar posts relacionados levou cerca de 400 ms, e o custo total de embedding de 402.500 tokens foi de cerca de US$ 0,04 - Mesmo só com modelos locais e uma combinação de ferramentas pequenas, é possível implementar busca em README, busca de código, busca de imagens, clustering e RAG; os exemplos usam
LLM,llm-sentence-transformers,Symbex,CLIPeE5-large-v2 - A busca semântica baseada em embeddings não depende de correspondência exata de palavras, tornando-se um meio essencial em RAG, como em perguntas e respostas sobre documentos internos, ao inserir trechos relevantes no prompt do LLM
Conceitos básicos de embeddings
- Embedding é uma forma de transformar um pedaço de conteúdo em um array de números de ponto flutuante
- Independentemente do tamanho do conteúdo, o tamanho do array é sempre o mesmo
- O tamanho do array é definido pelo modelo de embedding usado; por exemplo, podem sair 300, 1.000 ou 1.536 números
- Esse array pode ser visto como uma coordenada em um espaço multidimensional
- A posição nesse espaço representa o significado do conteúdo como entendido pelo modelo de embedding
- Características do conteúdo, como cor, forma ou conceito, podem ser refletidas ali
- Mesmo sem entender completamente o significado de cada número individual, é possível usar as relações de posição para tarefas úteis, como encontrar itens próximos
Recomendar conteúdo relacionado: caso do blog TIL
- Em um site TIL com 472 posts, foi calculado um vetor de embedding de 1.536 dimensões para cada post com o modelo OpenAI
text-embedding-ada-002- Os vetores foram armazenados no banco de dados SQLite do site
- Os posts relacionados foram encontrados calculando a similaridade de cosseno entre o vetor do post-alvo e os vetores de todos os outros posts, retornando os 10 mais próximos
- Para o post de exemplo “Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg”, os principais resultados relacionados incluíam posts sobre SQLite, SpatiaLite, GDAL e consultas SQL espaciais
- A similaridade com ele mesmo era 1.0
sqlite_geopoly.mdtinha 0.8817322855676049spatialite_viewing-geopackage-data-with-spatialite-and-datasette.mdtinha 0.8813094978399854
- A consulta para calcular posts relacionados levou cerca de 400 ms, então as 10 maiores similaridades para todos os posts foram pré-calculadas e armazenadas em uma tabela
similarities - O custo da API de embeddings da OpenAI, no caso do site TIL, foi de cerca de US$ 0,04 para aproximadamente 402.500 tokens, à taxa de US$ 0,0001 por 1.000 tokens
- Modelos proprietários exigem cuidados operacionais
- A OpenAI já descontinuou alguns modelos antigos de embedding no passado
- Se houver muitos embeddings armazenados com um modelo antigo, pode ser necessário recalculá-los com um modelo ainda suportado para embutir conteúdo novo
- A OpenAI prometeu arcar com o custo de re-embedding para o novo modelo, mas o risco de dependência de modelo proprietário continua existindo
- Modelos com licença aberta podem ser executados em hardware próprio, evitando o risco de descontinuação do modelo
O espaço vetorial visto com Word2Vec
- Efficient Estimation of Word Representations in Vector Space, do Google Research, é o artigo do Word2Vec, publicado em 16 de janeiro de 2013
- Word2Vec é um modelo inicial de embedding que transforma uma palavra em um array de 300 números
- turbomaze.github.io/word2vecjson é uma demo que permite explorar 10.000 palavras e o array de 300 números de cada uma
- Para “france”, aparecem palavras próximas como
french,belgium,paris,germany,italyespain
- Para “france”, aparecem palavras próximas como
- Relações também aparecem em operações vetoriais
- Se você somar “paris” ao vetor de “germany” e subtrair “france”, o vetor resultante fica mais próximo de “berlin”
- Isso mostra que o modelo capturou relações de nacionalidade e geografia dentro do espaço vetorial
- O Word2Vec foi treinado com conteúdo de 1,6 bilhão de palavras, e os modelos de embedding atuais são treinados com conjuntos de dados muito maiores, capturando relações mais ricas
Calculando embeddings com a ferramenta LLM
- LLM é uma ferramenta de linha de comando e também uma biblioteca Python para trabalhar com grandes modelos de linguagem
- Pode ser instalada com
pip install llmoubrew install llm - Por padrão, pode ser usada com a API da OpenAI
- Pode ser instalada com
- Ao instalar plugins, é possível adicionar novos modelos de linguagem ou de embedding
- O plugin
llm-sentence-transformersempacota a biblioteca SentenceTransformers- Ele permite baixar o modelo
all-MiniLM-L6-v2do Hugging Face e usá-lo localmente - O comando
llm embedimprime um array JSON de números para uma única frase
- Ele permite baixar o modelo
- Um embedding isolado, como array numérico sozinho, não tem muito valor; ele se torna útil quando é armazenado e comparado
llm embed-multipermite embutir vários conteúdos de uma vez e armazená-los em uma tabela SQLite chamada collection- O comando de exemplo encontra todos os arquivos
README.mdsob o diretório home e os armazena na collectionreadmes - A opção
--storesalva também o texto original junto na tabela SQLite - Na execução, foram armazenados 16.796 arquivos
README.md, e isso levou cerca de 30 minutos em um computador local
- O comando de exemplo encontra todos os arquivos
Busca semântica e “vibes-based search”
- O comando
llm similarencontra itens semelhantes à frase de entrada em uma collection de embeddings armazenada - Ao pesquisar a collection
readmescom a frasesqlite backup tools, aparecem no topo READMEs de projetos SQLite comosqlite-diffable,sqlite-dump,sqlite-generate,sqlite-historyesqlite-utils - Não há garantia de que a palavra “backups” esteja diretamente presente nos documentos de resultado
- Se o conteúdo for semanticamente semelhante ao termo de busca, ele pode aparecer como resultado
- Esse método é busca semântica; no texto original, ele é chamado de vibes-based search
- Como a correspondência exata de texto nem sempre encontra o que o usuário procura, isso é útil em mecanismos de busca para vários tipos de conteúdo
Embeddings de código: Symbex e Datasette
- Symbex é uma ferramenta para explorar símbolos de codebases Python
- Ela foi criada para localizar rapidamente funções e classes Python e passá-las a um LLM
- Depois, passou a permitir calcular embeddings de todas as funções do codebase para criar um mecanismo de busca de código
- O Symbex pode exportar os símbolos encontrados em JSON ou CSV, formatos que podem ser usados como entrada do
llm embed-multi - Um exemplo de embedding de todas as funções e métodos de classe do projeto Datasette usa o modelo gte-tiny
gte-tinyé um arquivo de 60 MBsymbex '*' '*:*' --nlproduz JSON delimitado por nova linha com funções e métodos de classe do diretório atualllm embed-multi ... --format nlpode receber diretamente essa saída e gerar os embeddings
- Depois, é possível executar busca semântica de código com SQL usando o Datasette e o plugin datasette-llm-embed
- O SQLite funciona como um ponto de integração para várias ferramentas
- Extrai funções do código
- Passa o resultado pelo modelo de embedding
- Registra os resultados no SQLite
- Faz a busca com SQL
Embutindo texto e imagem no mesmo espaço com CLIP
- CLIP é um modelo lançado pela OpenAI em janeiro de 2021 que consegue gerar embeddings tanto para texto quanto para imagens
- O ponto central é que texto e imagem são colocados no mesmo espaço vetorial
- A posição do embedding da string “dog” e a posição do embedding de uma foto de cachorro ficam próximas dentro do mesmo espaço
- Isso permite encontrar imagens relacionadas a partir de texto ou textos relacionados a partir de imagem
- A demo de CLIP executada no navegador foi criada como um notebook Observable e roda o modelo CLIP dentro do navegador
- A página carrega 158 MB de recursos
- O modelo de texto do CLIP tem 64,6 MB e o modelo de imagem tem 87,6 MB
- Há um exemplo que calcula pontuações de similaridade para vários textos em relação a uma foto de praia
beach: 26.946%city: 19.839%sunshine: 24.146%california beach: 27.427%
- Mais importante do que perguntar a similaridade entre uma foto qualquer e uma palavra isolada é construir uma interface de busca sobre isso
Faucet Finder: busca de imagens baseada em CLIP
- Faucet Finder é uma ferramenta de busca personalizada para encontrar fotos de torneiras de banheiro
- Drew Breunig coletou 20.000 fotos de torneiras de fornecedores e calculou os embeddings com CLIP
- Na implementação, foram usados o LLM e o plugin llm-clip
- O sistema foi publicado com Datasette
- A ferramenta permite encontrar outras torneiras visualmente parecidas com uma torneira específica
- Se você gostar de uma torneira cara, pode buscar uma opção mais barata visualmente semelhante
- A demo de Drew usa embeddings pré-calculados para mostrar resultados semelhantes sem executar o modelo CLIP no servidor
- Depois, um modelo CLIP no lado do servidor foi implantado no Fly.io, e foi criada uma demo em notebook Observable combinando uma API de embeddings de strings de texto com uma API da tabela de embeddings de torneiras
- É possível buscar imagens de torneiras por significado com termos como “gold purple”
Clustering e visualização em 2D
- Embeddings podem ser usados não só para recomendação de conteúdo relacionado e busca semântica, mas também para clustering
- llm-cluster é um plugin que implementa clustering com sklearn.cluster, do scikit-learn
- Usando a API de issues do GitHub e o paginate-json, é possível criar uma collection
llm-issuescom os títulos das issues do repositóriosimonw/llme gerar 10 clusters - A opção
llm cluster llm-issues 10 --summaryenvia o texto dos clusters a um LLM para gerar nomes descritivos- Exemplos de nomes incluem “Log Management and Interactive Prompt Tracking” e “Continuing Conversation Mechanism and Management”
- Espaços de alta dimensão são difíceis de visualizar, então é possível reduzir a dimensionalidade com análise de componentes principais (PCA)
- Matt Webb gerou embeddings com OpenAI para descrições de episódios do podcast BBC
In Our Timee criou uma visualização 2D com PCA - Mesmo ao reduzir 1.536 dimensões para duas, episódios sobre guerras históricas ou descobertas científicas modernas ainda aparecem próximos entre si
- Matt Webb gerou embeddings com OpenAI para descrições de episódios do podcast BBC
Classificando frases pela posição média
- Embeddings também podem ser usados para classificação
- Primeiro, calcula-se a posição média de grupos de embeddings previamente classificados de uma certa maneira
- Depois, atribui-se uma categoria ao novo embedding comparando de qual dessas posições ele está mais próximo
- Getting creative with embeddings, de Amelia Wattenberger, mostra um caso de pontuação de frases como mais concretas ou mais abstratas
- São criadas amostras de frases concretas e abstratas, e calcula-se a posição média de cada grupo
- Uma nova frase recebe pontuação conforme sua proximidade relativa entre essas duas posições médias
- Essa pontuação também pode ser convertida em uma cor que indica de forma solta o quão abstrata ou concreta é a frase
RAG: perguntas e respostas com documentos pessoais e internos
- Quem já usou ChatGPT costuma se perguntar como fazer o modelo responder com base em notas pessoais ou documentos internos da empresa
- A resposta pode não ser um treinamento caro de modelo customizado, mas uma combinação entre um LLM pronto e RAG (Retrieval-Augmented Generation)
- O processo básico de RAG é simples
- O usuário faz uma pergunta
- Busca-se, nos documentos pessoais, conteúdo que pareça relevante para a pergunta
- Respeitando o limite de tamanho do LLM, trechos relevantes e a pergunta original são inseridos no prompt
- O LLM responde com base no conteúdo adicional fornecido
- Um limite de tamanho comum fica na faixa de 3.000 a 6.000 palavras
- A parte difícil no RAG é encontrar os melhores trechos para colocar no prompt
- A busca semântica baseada em embeddings é adequada para reunir conteúdo com alta probabilidade de relevância
Implementando Q&A offline baseado em blog com E5-large-v2
- Um exemplo de RAG baseado em conteúdo de blog usa E5-large-v2
- Frases de pergunta e de resposta têm gramáticas diferentes, então uma pergunta nem sempre fica semanticamente próxima de um documento que contém a resposta
- O E5-large-v2 suporta dois tipos de conteúdo
- Uma factual sentence é embutida como phrase
- Uma question é embutida como query
- Isso é parecido com a forma como o CLIP coloca imagem e texto no mesmo espaço
- Os 19.000 parágrafos do blog são embutidos como phrase, e a pergunta é embutida como query para encontrar os parágrafos mais próximos da resposta
- O exemplo implementa RAG com um script Bash de uma linha
llm similarencontra os parágrafos relevantesjqextrai o conteúdo- A pergunta e os parágrafos são enviados a um modelo Llama 2 Chat 7B executando localmente em um notebook
- Para a pergunta
What is shot-scraper?, foi gerada a resposta de queshot-scraperé um utilitário Python que encapsula o Playwright e automatiza screenshots de páginas web e scraping baseado em JavaScript por meio de uma interface de linha de comando e um fluxo de configuração baseado em YAML - A resposta gerada não era uma correspondência exata de frases já existentes no conteúdo do blog
Opções que podem ser ajustadas na prática
- LangChain é um framework para implementar funcionalidades sobre LLMs, e RAG é uma de suas capacidades centrais
- É possível construir a mesma funcionalidade sobre LangChain, mas entender LangChain exige um investimento considerável
- Aqui, a preferência é por um conjunto de ferramentas pequenas que podem ser combinadas, em vez de um framework único para resolver tudo
- A função de distância usada por padrão é a similaridade de cosseno
- Outras funções de distância ainda não foram testadas
- RAG tem muitos elementos ajustáveis: função de distância, modelo de embedding, estratégia de prompt e LLM
- Os exemplos tinham no máximo cerca de 20.000 embeddings, e nessa escala ainda é razoável obter resultados em tempo aceitável usando cálculo de similaridade de cosseno por força bruta sobre o conjunto inteiro
- Em dados maiores, como 1 bilhão de objetos, bancos de dados vetoriais ou extensões de bancos existentes passam a ser uma opção
- O SQLite tem sqlite-vss
- O PostgreSQL tem pgvector
- O FAISS, do Facebook, também foi usado em experimentos, assim como o plugin para Datasette datasette-faiss que o utiliza
- Uma direção promissora para o futuro são os modelos multimodais e modelos menores
- O ImageBind, do Facebook, aprende embeddings conjuntos para seis modalidades de dados: imagem, texto, áudio, profundidade, térmico e dados de IMU
- Modelos cada vez menores, como o
gte-tinyde 60 MB, aumentam a viabilidade em dispositivos limitados ou em execução no navegador
Leitura adicional
- What are embeddings? by Vicki Boykis
- Text Embeddings Visually Explained by Meor Amer for Cohere
- The Tensorflow Embedding Projector: ferramenta interativa para explorar o espaço de embeddings
- Learn to Love Working with Vector Embeddings: coleção de tutoriais sobre embeddings vetoriais da Pinecone
1 comentários
Comentários do Hacker News
Depois de publicar este texto, encontrei mais alguns materiais úteis para entender embeddings em um nível mais baixo
Meu texto foi propositalmente escrito em um nível bem alto, com foco principalmente em aplicações
Text Embeddings Visually Explained, da Cohere: https://txt.cohere.com/text-embeddings/
Ferramenta Tensorflow Embedding Projector: https://projector.tensorflow.org/
What are embeddings?, de Vicki Boykis, também vale a pena ver: https://vickiboykis.com/what_are_embeddings/
Pretendo adicioná-los à seção “further reading” no fim da página
Usei embeddings para aumentar o engajamento com posts relacionados e, pessoalmente, vejo embeddings como uma ferramenta poderosa e subestimada
Eles podem ser usados para navegar por similaridade entre documentos ou trechos, ou, ao contrário, para encontrar conteúdo único; e são bastante “seguros”, já que não é preciso se preocupar com alucinações
Também pode ser interessante entender como embeddings são criados. Por exemplo, há abordagens como cortar a camada de classificação depois do treinamento, ou métodos como o EfficientNet
Eles estão se tornando uma base central de machine learning
Em visão computacional e algoritmos de SLAM visual, embeddings se tornaram praticamente o método padrão para reconhecimento de lugares, e isso é muito parecido com o que o texto descreve
É chamado de “bag-of-word place recognition” e hoje é usado em quase todas as bibliotecas open source
A ideia central é passar cada imagem por um pipeline de extração de features e descritores, “embutindo-a” em um vetor com as N principais features
Enquanto a câmera se move, cria-se um banco de dados de imagens chamado keyframes, e as imagens são armazenadas como vetores de dimensão muito menor
Depois, o banco de dados é consultado com todas as imagens, e a melhor correspondência é encontrada no banco vetorial por métodos como similaridade de cosseno
Quando há uma correspondência, é possível calcular as restrições estéreo entre a imagem de consulta e a imagem correspondente para atualizar o mapa
O artigo original é [1], e a implementação mais famosa é https://github.com/dorian3d/DBoW2
[1]: https://www.google.com/search?client=firefox-b-d&q=Bags+of+B...
É uma excelente referência introdutória
Anos atrás, criei meu próprio app de notas para iOS, e adicionar embeddings à busca full-text existente foi 1) surpreendentemente fácil e 2) muito mais poderoso do que eu tinha imaginado inicialmente
Eu sabia que, ao buscar por “dog”, também apareceriam notas contendo “canine”, mas só percebi mesmo quando testei uma busca como “animais de estimação de que eu gostaria” e ela encontrou várias notas relacionadas a animais com sentimento positivo
Esse foi meu primeiro grande momento de “eureka”
Na época, o PR do DocsGPT da Supabase foi útil como código de exemplo: https://github.com/supabase/supabase/pull/12056
Muitas aplicações dependem muito de nomes ou nomes próprios, e frequentemente têm pouco contexto
Se um cachorro for mencionado apenas pelo nome, sem descrição, certos modelos de embedding podem não capturar isso
Nomes próprios como pessoas, lugares e nomes de ruas podem ser muito importantes para ancorar buscas personalizadas ou específicas de domínio, mas modelos de linguagem de uso geral não os conhecem
Tenho curiosidade se existem métodos específicos para lidar com esse problema
A maior dúvida agora é quanto texto transformar em um único embedding
Fico na dúvida entre fazer isso por frase ou agrupar em um só embedding todos os blocos de frases pertencentes a uma página de um app de notas
Um exemplo clássico de embedding de palavras é o famoso King - Man + Woman = Queen
No espaço vetorial funciona bem, mas, quando projetado em 2D, visualmente não fica tão intuitivo
Pela minha experiência, foi a mesma coisa com PCA, MDS e t-SNE: https://bhugueney.gitlab.io/test-notebooks-org-publish/jupyt...
É um JupyterLite Notebook que executa embeddings de palavras no navegador; é melhor não rodar em smartphones
Fico curioso se alguém conhece uma boa forma de visualizar de maneira clara esse exemplo clássico de embedding de palavras
Se você realmente quiser ortogonalidade, pode usar Gram-Schmidt
Em 3D, dá para adicionar mais um eixo Z como “king”-“queen”, e a versão ortogonalizada fica mais próxima da noção de distância que o modelo enxerga
Em 2D, ao calcular “king”-“man”+“woman”, não dá para mostrar quanto ele se desvia de “queen”, mas o restante da distância pode ser obtido com precisão
Em 3D, deve ser possível fornecer a distância exata
“queen” normalmente é escolhida por ser a palavra com o embedding mais próximo de X="king"-"man"+"woman"
Em um gráfico 2D, também dá para mostrar algumas das palavras mais próximas seguintes e anexar a cada palavra a distância ortogonal em relação ao plano 2D
Assim, “queen” deveria ser a palavra com a menor soma entre a distância quadrada a partir de X e a distância ortogonal quadrada a partir do plano, então dá para verificar isso visualmente até certo ponto
Era algo como “Não dá para visualizar 4 dimensões... pelo menos eu não consigo. Só tenho três branes”, um trocadilho com branes e brains
Depois, o ChatGPT admitiu que tinha inventado e pediu desculpas
Em seguida, trouxe citações de John von Neumann, H. G. Wells e Ian Stewart, e por fim respondeu algo como “para visualizar 4 dimensões, visualize 3 dimensões e então diga ‘n+1’”, que foi o mais parecido com a piada de que eu me lembrava, mas menos engraçado
Então pedi para ele criar citações alucinatórias, no estilo Deepak Chopra, sobre visualizar espaços de alta dimensão, e ele despejou citações falsas plausíveis misturando expressões como embeddings septilhões-dimensionais, espaço de Hilbert, conjectura de Poincaré, princípio da incerteza de Heisenberg e entropia de Shannon
Um erro comum em trigonometria prática é fazer cálculos de raiz quadrada desnecessários
No código de exemplo,
magnitude_a = sum(x * x for x in a) * 0.5emagnitude_b = sum(x * x for x in b) * 0.5não precisam de*0.5Se você vai comparar cossenos, pode comparar os valores ao quadrado, evitando o cálculo caro da raiz
De forma parecida, em criptografia de curvas elípticas, operações caras como cálculo de inverso são adiadas o máximo possível, ou, quando se está apenas comparando dois pontos, às vezes evita-se até calcular o valor canônico
Caso contrário, teria sido substituído por código SIMD de baixo nível
dot_product = sum(x * y for x, y in zip(a, b)); fico me perguntando por que fazer assim e não usar operações vetorizadas do numpyAí entendi ao ver o trecho “pedi ao ChatGPT para escrever várias versões de código de similaridade de cosseno”
Primeiro, ao explicar para as pessoas, sinto que a sintaxe do numpy mais atrapalha do que ajuda
Segundo, numpy não é a dependência mais leve
Eu o uso quando preciso de desempenho, mas não quero adotá-lo como opção padrão
Se você quiser ver publicações do Show HN, startups do ProductHunt, empresas da YC e repositórios do Github relacionados a embeddings de LLM, dá para encontrá-los rapidamente no MVP de mecanismo de busca baseado em embeddings de LLM que acabei de lançar
https://payperrun.com/%3E/search?displayParams={%22q%22:%22L...
Eu esperava que, ao clicar nos vários botões de filtro, os resultados da busca fossem atualizados imediatamente, e não sabia que teria que pesquisar de novo
Entendo por que foi feito assim
É a coisa mais interessante relacionada a “AI” que li nos últimos meses
Sempre que via modelos de embedding em listas, ficava me perguntando o que eram, e também por que todo mundo fala de bancos de dados vetoriais
Já consigo imaginar uma forma de aplicar isso imediatamente a um side project antigo
Se todos os documentos tiverem embeddings, talvez um agrupamento útil dos dados dos usuários se torne realisticamente possível
Fico curioso se alguém já usou embeddings na prática para algo além de vizinhos mais próximos aproximados e clusterização
Possibilidades que me vêm à mente são projeção, indexação e ordenação em eixos arbitrários. Por exemplo, eixos como “quente-frio”, “felicidade-tristeza”, “ficção científica-realismo”, “literariedade-comercialidade”
Também deve haver formas de treinar embeddings diretamente, além de fazer classificação ao estilo SVM no espaço de embeddings, inferência ao estilo word2vec como woman-man+king=queen, ou extrair uma camada de um LLM
Sei que aprendizagem contrastiva é usada, mas parece valer explorar outros métodos também, como aprender embeddings junto com uma rede neural de funções e gerar uma equação funcional para calcular a perda de erro quadrático médio
É surpreendente ver tanto foco em busca semântica, e com certeza deve haver outras aplicações interessantes
O primeiro e o terceiro são, na prática, a mesma coisa
Em visão computacional, você pode querer alterar semanticamente uma imagem, como adicionar óculos a uma foto, e os trabalhos que vemos em anúncios do Google são exemplos disso
Esse tipo de trabalho acontece no espaço latente
Em fluxos normalizadores, isso fica especialmente claro porque o espaço é transformado em uma gaussiana
Modelos de difusão fazem algo parecido por aproximação, mas não são reversíveis, embora seja possível voltar
Você projeta a imagem, frase ou dado que quer manipular, manipula no espaço gaussiano e depois volta para o espaço de destino
Mas talvez estejamos nos confundindo porque a palavra embedding é um termo sobrecarregado, com significados demais
Talvez você esteja pensando apenas no primeiro bloco, que transforma tokens inteiros discretos em números de ponto flutuante contínuos
Mas esse embedding também é aprendido, então, mesmo que acabe parecendo uma tabela de consulta, ainda é um processo de rede neural
Também há usos de SVM nesse espaço
Vejo como algo parecido com espaço latente, mas um pouco mais abstrato
No mínimo, um embedding deveria ser injetivo. Matematicamente é assim, mas…
Treinar embeddings diretamente é literalmente o modelo de embeddings original, o Word2Vec
Encontrei muitas variantes e abreviações de nomes químicos e bioquímicos, como formas com hífen, sem hífen e com espaços
Provavelmente daria até para construir um dicionário de termos técnicos
Não sei até onde seria possível chegar em definições, mas, embora só vetores tenham limites, eles servem como ponto de partida
É bem provável que outras pessoas também tenham construído dicionários dessa forma
Já mexi com embeddings e criei alguns casos de uso em produção, e eles são uma ótima ferramenta que viabiliza muitas aplicações legais
Mas, ao construir algo para um domínio específico, você esbarra nas limitações dos modelos de embeddings prontos
Modelos prontos têm muitas dimensões, mas algumas delas podem ser importantes para classificação, similaridade de conteúdo, clusterização etc. na minha aplicação, enquanto outras podem não ser
Em outras palavras, dois vetores podem parecer próximos porque estão próximos em dimensões que não me interessam
Espero ver ferramentas e literatura melhores para ajuste fino de modelos de embeddings
Essas ferramentas existem há muito tempo; por exemplo, basta rotular um pouco de dados e depois treinar um SVM de classificação sobre o espaço de embeddings