Machine Learning · Insper · E2.4

Sentence Embeddings

Abordagem fundamental

Um vetor por frase, para que o cosseno acompanhe o significado: média dos vetores de palavras, vetores contextuais, Sentence-BERT e busca semântica

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 parte

  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 (frequência do termo × frequência inversa nos documentos) e média; outras línguas
  4. Buscarbusca semântica é k vizinhos mais próximos
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? → como buscar 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 (global vectors)
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 (Bidirectional Encoder Representations from Transformers, 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 · como buscar 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.

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. Escolha um modelo treinado na sua língua.
  5. Busca semântica = vizinhos mais próximos; confira negação, notas baixas e próximas e tokens raros exatos.
Parte avançada: agrupar frases e as notas práticas (limite de tamanho, custo, escolha do modelo, índices).
Lab fundamental · cerca de 35 min, em duplas

Similaridade de frases em português, passos 1 a 5

  • ASSIN 2 (Avaliação de Similaridade Semântica e Inferência Textual): 2.448 pares de teste 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 (Spearman), leia onde discordam e busque nas 3.659 frases.
  • Baixe o notebook do lab e abra no Colab ou no Jupyter; no Colab, rode !pip install sentence-transformers antes.
  • Simulações: TF-IDF com pedaços de palavras (passo 2) e quanto vem do contexto? (passo 3).

Ritmo: passos 1 e 2 e a primeira simulação em 12 min; passo 3 e a segunda em 10 min; passos 4 e 5 em 13 min.