Machine Learning · Insper · U4.4

Sentence Embeddings

Um vetor por frase, para que o cosseno acompanhe o significado

Média dos vetores de palavras, vetores contextuais, Sentence-BERT, busca semântica e agrupamento

A maioria das tarefas é sobre textos, não palavras

suporte

achar a entrada do FAQ (perguntas frequentes) que responde a uma pergunta

operação

agrupar chamados de suporte

busca

recuperar os documentos que casam com uma consulta

Objetivo: um vetor por frase ou documento curto, arranjado para que o cosseno entre dois deles acompanhe o quanto seus significados são próximos.

O caminho desta aula

  1. Média das palavrasmédia dos vetores GloVe; ordem e negação somem
  2. Palavras em contextoTransformers: uma palavra, vários vetores
  3. Um vetor por fraseSentence-BERT contra TF-IDF e média; outras línguas
  4. Buscar e agruparbusca semântica, agrupamento, notas práticas
Cada etapa responde a uma pergunta: a média dos vetores das palavras basta? → como uma palavra ganha vários vetores? → como ter um vetor que compare frases? → o que fazer com vetores de frase?
Etapa 1 · A média dos vetores das palavras basta?

A resposta óbvia: a média dos vetores de palavras

"the movie was great"os quatro primeiros dos 50 números do GloVe
the0,418 · 0,25 · −0,412 · 0,122 …
movie0,308 · 0,172 · −0,233 · 0,023 …
was0,087 · −0,194 · −0,243 · −0,334 …
great−0,027 · 1,336 · −1,028 · −0,373 …
média0,197 · 0,391 · −0,479 · −0,141 …

À mão: \((0{,}418 + 0{,}308 + 0{,}087 - 0{,}027)/4 = 0{,}1965\). Não custa nada e não precisa de treino.

O que a média perde

Preveja. "the dog bit the man" vs "the man bit the dog": qual o cosseno das médias?
1,00the dog bit the man / the man bit the dog
0,99the movie was good / the movie was not good
0,96the movie was great / the film was excellent
0,66the stock market fell sharply today / my cat likes to sleep on the couch

a ordem some

as mesmas palavras dão a mesma média: exatamente 1,00

a negação mal aparece

"not" é uma palavra em cinco

tudo parece parecido

frases sem relação ainda dão 0,66

Etapa 2 · Como uma palavra ganha vários vetores?

Transformers, em um slide

  • Um Transformer (Vaswani et al., 2017) lê a frase inteira de uma vez.
  • Ele corta o texto em tokens de subpalavras (um vocabulário de cerca de 30.000 pedaços): nenhuma palavra fica fora do vocabulário.
  • Em cada camada, o vetor de cada token é recalculado como uma mistura ponderada de todos os tokens (atenção).
  • BERT (Devlin et al., 2019): treinado para preencher palavras escondidas; um vetor contextual por token.

Embeddings are unbelievably useful → em · ##bed · ##ding · ##s · are · un · ##bel · ##ie · ##va · ##bly · useful

Aqui ele é uma caixa-preta que transforma texto em vetores; como é construído é assunto de Redes Neurais.

Uma palavra, vários vetores

Preveja. O token "bank" em três frases sobre rio e três sobre dinheiro. No GloVe as 36 células seriam 1,00. E aqui?
rio 1rio 2rio 3dinheiro 4dinheiro 5dinheiro 6
rio 11,000,830,860,760,760,76
rio 20,831,000,840,720,720,73
dinheiro 40,760,720,721,000,880,86
dinheiro 50,760,720,730,881,000,82
Todo "bank" de rio fica mais perto dos outros "banks" de rio (0,83 a 0,86) que de qualquer "bank" de dinheiro (0,71 a 0,76). É isso que contextual quer dizer.
Etapa 3 · Como ter um vetor que compare frases?

Sentence-BERT: treinado para comparar frases

Duas frases passam separadamente pelo mesmo transformer: tokens, um vetor contextual por token, mean pooling e comprimento 1 dão u e v de 384 números, comparados pelo cosseno

Mean pooling: a média dos vetores dos tokens, cada um já carregando seu contexto.

O Sentence-BERT (Reimers & Gurevych, 2019) acrescenta um treino: cosseno alto para pares que significam o mesmo, baixo para os que não.

Um bi-encoder: cada frase é codificada separadamente, então uma coleção é codificada uma vez e guardada.

Usando o sentence-transformers


E = model.encode(["the movie was great", "the film was excellent",
                  "the stock market fell sharply today"], normalize_embeddings=True)
E @ E.T     # com linhas de comprimento 1, o produto escalar é o cosseno
  

tamanho

384
números por texto

paráfrases

0,88
a frase da bolsa: 0,04

o modelo

22,7 mi
de parâmetros · lê no máximo 256 tokens

A média do GloVe dava 0,96 contra 0,66: agora a escala é usada de baixo a cima.

Três representações, os mesmos pares

TF-IDF (frequência do termo × frequência inversa nos documentos), média dos vetores GloVe e Sentence-BERT (SBERT) em oito pares, cada um testando uma propriedade:

parTF-IDFmédia GloVeSBERT
paráfrase0,280,960,88
paráfrase, outras palavras0,190,920,56
mesma necessidade, outras palavras0,150,920,68
negação0,820,990,82
ordem das palavras1,001,000,98
bank: rio vs dinheiro0,290,920,60
apple: empresa vs fruta0,180,870,23
sem relação0,040,660,02

Antes do próximo slide: em qual coluna você confiaria para separar relacionado de não relacionado?

Lendo a tabela

TF-IDF

mede palavras em comum: paráfrases sem elas ficam entre 0,15 e 0,28

média GloVe

diz "parecido" para tudo: de 0,66 a 1,00, nenhum limiar funciona

SBERT

usa a escala inteira: de 0,02 a 0,88; as duas "apples" dão 0,23

O que nenhum deles resolve: a negação fica em 0,82 e a ordem das palavras em 0,98. Se sua tarefa depende delas (sentimento, contradições, quem fez o quê), confira explicitamente.

Outras línguas

par (português)só inglêsmultilíngue
o filme foi ótimo / o longa foi excelente0,650,66
esqueci minha senha / não lembro a senha da conta0,400,81
o filme foi ótimo / the movie was great0,080,98
o filme foi ótimo / a bolsa de valores caiu hoje0,40−0,02
O modelo em inglês não falha de forma barulhenta: dá a uma paráfrase e a um par sem relação o mesmo 0,40. Escolha um modelo treinado na sua língua.
Etapa 4 · O que fazer com vetores de frase?

Busca semântica é k vizinhos mais próximos

Offline, uma vez: N documentos passam pelo codificador e viram um índice N × 384. Online, por consulta: um vetor q, índice · q dá os N cossenos, ficam os k maiores

Codifique a coleção uma vez; para cada consulta, um produto de matrizes dá todos os cossenos. Sem rótulos e sem previsão: só achar vizinhos.

Um FAQ em português, oito entradas

consulta1ª respostacos
esqueci minha senhaComo faço para trocar a senha da minha conta?0,68
onde está minha encomenda?Como rastrear o meu pedido?0,60
desisti da compraComo cancelar uma compra que ainda não foi enviada?0,62
o celular veio com defeitoPosso devolver um produto depois de usado? (garantia em 2º, 0,24)0,26
I need a copy of my invoiceComo faço para trocar a senha… (erro)0,43
Quatro de seis certas com outras palavras. Notas baixas e próximas querem dizer "incerto"; expressões ("segunda via da nota fiscal") são onde embeddings gerais falham.

Simulador: embeddings vs TF-IDF

Preveja. Para a consulta "erro 402", qual ranking ganha, embeddings ou TF-IDF? Depois digite sua própria consulta.

O que o simulador mostra

embeddings

15 / 19
frases relevantes no top 3, nas dez consultas

TF-IDF

6 / 19
mas ganha em "erro 402": o token raro é exato
Buscadores de produção combinam os dois rankings: a busca híbrida.

Agrupando frases

16 manchetes em português, quatro assuntos (futebol, culinária, economia, tempo), k-means com 4 grupos, avaliado pelo índice de Rand ajustado (ARI):

TF-IDF

0,02
não melhor que o acaso: manchetes curtas quase não dividem palavras

embeddings

0,68
futebol, culinária e tempo saem inteiros
Textos curtos são onde sentence embeddings mais ajudam a agrupar: o BERTopic (U5.3) constrói um método inteiro sobre isso.

Notas práticas

  • Normalize: o cosseno vira produto escalar.
  • Codifique em lotes uma única vez e salve a matriz.
  • Limite de tamanho: um texto de 330 tokens mais uma última frase decisiva → cosseno 1,0000 (o modelo lê 256; o multilíngue, 128). Quebre documentos longos em pedaços.
  • Custo: 22,7 milhões de parâmetros (117,7 milhões no multilíngue), de segundos a minutos numa CPU; 1,5 KB por texto em float32.
  • Escolha: língua, tipo de texto, orçamento; faça uma lista curta no MTEB (Massive Text Embedding Benchmark) e meça nos seus dados.
  • Escala: bancos de dados vetoriais para milhões de textos.

Resumo

  1. A média dos vetores de palavras é de graça, mas cega à ordem e à negação: tudo parece igual.
  2. Um Transformer dá a cada token um vetor contextual: dois "banks", dois vetores.
  3. Sentence-BERT: agregado e treinado para que o cosseno acompanhe o significado, na escala inteira.
  4. Busca semântica = vizinhos mais próximos; agrupar textos curtos funciona muito melhor que no TF-IDF.
  5. Confira negação e papéis, escolha o modelo pela sua língua, cuidado com o limite de tamanho.
Lab · cerca de um minuto na CPU de um notebook, depois dos downloads

Similaridade de frases em português

  • ASSIN 2: 2.448 pares de teste de frases em português do Brasil, avaliados por pessoas de 1 a 5.
  • Pontue-os com TF-IDF e dois modelos do sentence-transformers, meça quanto cada um acompanha a nota humana e leia onde discordam.
  • Depois busque, agrupe e desenhe as 3.659 frases distintas.
  • Baixe o notebook do lab e abra no Jupyter ou no Colab; no Colab, rode !pip install sentence-transformers antes.

Downloads dos modelos: cerca de 90 MB e 470 MB; uma GPU do Colab faz o lab em poucos segundos.