Treinar seu próprio modelo de embedding não é tão difícil quanto você pensa
Autoria: Prompt Engineering · Assistir no YouTube
Vídeo de autoria do canal indicado, não da IANIA; todos os direitos pertencem ao criador. Transcrição, resumo e tradução gerados automaticamente; o conteúdo no idioma original é preservado na versão em idioma original.
Idioma original: inglês
Vídeo original: Training Your Own Embedding Model Is Not As Hard As You Think · Canal: Prompt Engineering · 12:33 · Assistir no YouTube
Tópicos: Avaliação e benchmarks de IA, Dados, bancos de dados e embeddings, Modelos de IA, RAG, busca e recuperação de informação
O vídeo explica como funciona o fine-tuning de um modelo de embedding e demonstra o processo com Embedding Gemma 2 em dados de áudio e transcrições de vídeos. O treinamento usa pares de consultas e passagens, uma loss que aproveita os demais exemplos do lote como negativos e adaptadores LoRA. Nos experimentos, alguns minutos de treinamento melhoraram a busca nos dados específicos, mas não ensinaram habilidades gerais e reduziram um pouco a qualidade da busca de texto geral. A recomendação é separar os dados de teste por fonte e verificar os efeitos do treinamento em todas as modalidades afetadas pelo backbone compartilhado.
Pontos-chave
Seção intitulada “Pontos-chave”- Modelos de embedding são treinados para aproximar exemplos relacionados no espaço de embedding, não para gerar respostas textuais.
- Os dados de treinamento podem ser organizados em pares de consulta e passagem correspondente.
- A multiple negative ranking loss usa os outros exemplos do lote como negativos, sem exigir que sejam rotulados individualmente.
- Um no duplicate sampler evita que exemplos com o mesmo texto apareçam juntos no lote e sejam tratados como negativos entre si.
- Os prompts e formatos usados no treinamento devem corresponder aos usados na produção ou na inference.
- LoRA permite treinar adaptadores pequenos sem atualizar todos os pesos do modelo.
- Os testes devem usar dados não vistos durante o treinamento e ser separados por fonte, como artigo, vídeo ou gravação.
- No exemplo de sons, o desempenho nos rótulos vistos melhorou, mas não melhorou nos sons mantidos completamente fora do treinamento.
- O treinamento afetou a busca de texto geral, embora a busca de fotos e de voz não tenha mudado nos testes apresentados.
- Ao salvar e recarregar um adaptador de áudio, é importante testar o processor, pois ele pode alterar o processamento dos clipes.
Capítulos
Seção intitulada “Capítulos”| Início | Capítulo | Resumo |
|---|---|---|
| 00:00 | O que o fine-tuning de embeddings faz | O apresentador demonstra uma busca em transcrições e explica como o treinamento de embeddings difere do treinamento de um LLM. |
| 03:09 | Loss, prompts e LoRA | O vídeo aborda negativos dentro dos lotes, duplicatas, consistência dos prompts, adaptadores LoRA e avaliação em dados não vistos. |
| 06:19 | Experimento com sons cotidianos | O modelo é treinado com pares de rótulos e clipes do ESC-50, e o resultado melhora para sons vistos durante o treinamento. |
| 08:23 | Generalização e efeitos nas outras buscas | O teste com sons excluídos do treinamento revela pouca generalização, e os testes medem o impacto sobre outras modalidades e a busca de texto. |
| 10:28 | Experimento com transcrições e recomendações | O apresentador treina com perguntas e passagens de vídeos, relata os resultados e resume as principais precauções para fine-tuning. |
Citações
Seção intitulada “Citações”Você obtém respostas erradas de graça, sem rotular nenhuma delas. — 03:09
O que importa é a qualidade da busca em perguntas que o modelo ainda não viu. — 05:47
O modelo aprende os rótulos que você fornece, não a ouvir de modo geral. — 08:54
Alguns minutos de fine-tuning melhoraram claramente o desempenho nos meus próprios sons e vídeos. — 11:30
Conceitos e entidades
Seção intitulada “Conceitos e entidades”- Embedding Gemma 2 (modelo): Modelo de embedding multimodal usado nos experimentos de busca e fine-tuning do vídeo.
- LoRA (conceito): Método que adiciona matrizes treináveis ao modelo e mantém congelados os pesos originais.
- multiple negative ranking loss (conceito): Função de perda que aproxima cada consulta de sua passagem correspondente e usa as demais passagens do lote como negativos.
- no duplicate sampler (ferramenta): Amostrador do Sentence Transformers que evita repetições de texto dentro do mesmo lote.
- Sentence Transformers (ferramenta): Biblioteca mencionada como referência para a loss e o amostrador usados no treinamento.
- CLIP (modelo): Modelo citado como exemplo de treinamento que aproxima imagens e textos em um mesmo espaço.
- Unsloth (ferramenta): Ferramenta cujos notebooks serviram de base para o notebook de fine-tuning apresentado.
- ESC-50 (repo): Dataset de clipes curtos de 50 sons cotidianos usado no experimento de classificação por busca.
- Gemini 3.8 Flash (modelo): Modelo usado para gerar perguntas no estilo de espectadores a partir de passagens das transcrições.
Tradução completa (pt-BR)
Seção intitulada “Tradução completa (pt-BR)”00:00 Embedding Gemini 2 é um modelo aberto excelente para recuperação multimodal, mas o que o torna ainda melhor é que você pode fazer fine-tuning com seus próprios dados. Isso importa porque um modelo de embedding pronto só conhece os dados gerais com os quais foi treinado, mas não faz ideia dos seus documentos, dos nomes dos seus produtos ou dos sons importantes para suas aplicações. Antes de mostrar como funciona, deixe-me mostrar uma demonstração rápida. Esta é uma versão do Embedding Gemini 2 na qual fiz fine-tuning com o Transcribe para o meu próprio
00:31 canal do YouTube. Digito uma pergunta e ele retorna o momento exato de um vídeo em que falo sobre isso, com um timestamp em que posso clicar. Então, a pergunta que quero responder neste vídeo é se alguns minutos de fine-tuning podem tornar esse modelo visivelmente melhor com os seus próprios dados, sem prejudicar o que ele já faz bem. Neste vídeo, quero mostrar como funciona o fine-tuning de um modelo de embedding e, depois, vamos percorrer um notebook no qual fiz fine-tuning com dois dos meus próprios
01:02 exemplos. Certo, vamos falar sobre o que diferencia o fine-tuning de um modelo de embedding do fine-tuning de um LLM. Quando você faz fine-tuning de um LLM, mostra a ele uma entrada e o texto exato que quer que ele escreva em resposta. Ou seja, os dados de treinamento já contêm a resposta certa, palavra por palavra. Um modelo de embedding não escreve nada. Ele transforma uma entrada em uma lista de números, e esses números só são úteis em relação uns aos outros.
01:34 É isso que as pessoas costumam chamar de espaço de embedding. Portanto, não existe uma lista correta de números ou embeddings que você possa escrever como alvo. A única coisa que você pode dizer ao modelo é quais elementos devem ficar próximos uns dos outros. Isso muda o formato dos seus dados de treinamento. Digamos que você ofereça suporte para uma empresa de casa inteligente e queira uma caixa de pesquisa que responda às perguntas dos clientes usando a central de ajuda. Cada exemplo de treinamento é um par, formado por
02:06 uma pergunta de cliente e um trecho que a responde. Você não precisa de pontuações nem de rotular respostas erradas. Só precisa de perguntas e trechos que correspondam uns aos outros. Mas aproximar cada pergunta do seu trecho não basta, porque o modelo poderia colocar tudo no mesmo lugar e ainda assim obter uma boa pontuação. Então, vamos falar sobre como o modelo aprende o que afastar e o que aproximar. Durante o treinamento, o modelo vê um lote de pares de cada vez. Por
02:38 exemplo, um lote de 32 pares. Para cada pergunta, o trecho correspondente é a resposta certa, e todos os outros trechos do lote são tratados como respostas erradas. Então, você não precisa coletar exemplos negativos. Se coletar esses pares, terá exemplos negativos automaticamente. Assim, a função de perda aproxima cada pergunta do trecho correspondente e a afasta de todos os outros. Isso significa que você obtém as
03:09 respostas erradas de graça, sem rotular nenhuma delas. A maneira mais simples de pensar nisso é como uma questão de múltipla escolha, em que os outros pares do lote são as opções erradas. Em sentence transformers, isso se chama perda de ranqueamento com múltiplos negativos. É a mesma ideia que CLIP usou para colocar imagens e texto no mesmo espaço. Há um porém. Digamos que dois clientes perguntem sobre o mesmo procedimento de redefinição e que os dois pares caiam no
03:42 mesmo lote. A função de perda vai tratar a segunda cópia desse trecho como uma resposta errada para a primeira pergunta. Nesse caso, você está ensinando ao modelo que a resposta certa está errada. A solução é usar um amostrador de lotes que nunca coloque o mesmo texto duas vezes no mesmo lote, chamado de no duplicate sampler pelo Sentence Transformers. A segunda coisa que você precisa acertar é o prompt. Embedding Gemma 2 espera um prompt curto para a tarefa
04:12 antes de uma consulta de pesquisa e um formato de título e texto para os documentos. Portanto, qualquer formato que você usar no treinamento também será o formato que seu código de pesquisa precisará usar. Pense nisso como um modelo de prompt, que as pessoas usam com LLMs. O modelo de prompt usado no treinamento deve ser exatamente igual ao que você usa em produção ou na inference. Certo. Agora, vamos falar sobre o que é realmente treinado, porque essa é a parte mais interessante do vídeo.
04:44 Em vez de atualizar todos os pesos, vamos usar LoRA, que adiciona pequenas matrizes treináveis ao lado das camadas existentes e mantém os pesos originais congelados. Os adaptadores LoRA são extremamente rápidos de treinar, então você não precisa treinar a rede inteira novamente. Nas minhas execuções, isso representou menos de 2% dos pesos, então você pode salvar um pequeno arquivo de adaptador em vez de uma cópia completa do modelo. No último vídeo, vimos que texto, imagens, vídeo e áudio passam todos
05:16 pelo mesmo backbone do Embedding Gemma 2. Então, se você treinar o backbone com áudio, também estará alterando a parte que processa suas fotos e seu texto, e precisamos verificar qual será o custo disso. O último conceito é como medir tudo isso. A queda da perda de treinamento só indica que o modelo melhorou nos exemplos com que foi treinado, mas o que importa é a qualidade da pesquisa em perguntas que ele
05:47 não viu. Caso contrário, será apenas overfitting. Então, reserve um conjunto de teste e divida os dados por fonte. Se houver trechos do mesmo artigo tanto no conjunto de treinamento quanto no de teste, na prática o modelo já terá visto a resposta. Portanto, você deve dividir por artigos, vídeos ou gravações. Isso também levanta uma questão para os experimentos: o modelo aprende uma habilidade geral ou aprende apenas os seus rótulos? Certo,
06:19 essa teoria já basta. Agora, deixe-me mostrar o notebook, baseado nos notebooks de Embedding Gemma 2 da Unsloth. Executei tudo em uma GPU A100 no Colab. O link estará na descrição do vídeo. O primeiro exemplo corrige o ponto fraco do último vídeo. Se você ainda não o viu, recomendo muito que assista. O exemplo era sobre sons do dia a dia. Então, usei um conjunto de dados chamado ESC-50, que contém clipes curtos de 50 sons do dia a dia.
06:50 Coisas como latido de cachorro, chuva ou uma motosserra. Cada nome de som vira uma frase. Por exemplo: o som de uma motosserra. Nesse caso, a classificação vira uma pesquisa, porque o modelo gera o embedding do clipe, gera o embedding da frase do rótulo e, depois do treinamento, escolhe o mais próximo. Antes do treinamento, o modelo só escolhia o som correto em primeiro lugar cerca de uma vez a cada quatro tentativas. Ou seja, a precisão era de aproximadamente 25%. Também notei que
07:22 o prompt de classificação integrado do modelo se saía ainda pior do que escrever o rótulo como uma consulta de pesquisa. Então, um prompt melhor não vai resolver isso; é aí que entra o treinamento. Certo, como exatamente isso é treinado? Os pares de treinamento são a frase do rótulo e o clipe de áudio. É justamente aqui que é importante lembrar da armadilha das duplicatas, porque cada rótulo tem muitos clipes de treinamento. Então, sem o no duplicate sampler, o
07:52 mesmo rótulo acabaria aparecendo em um lote. Adicionei LoRA ao codificador de áudio e ao backbone. O treinamento levou cerca de 7 minutos e meio na GPU A100. O que importa observar é o resultado em primeiro lugar para clipes que o modelo nunca tinha ouvido durante o treinamento. A taxa passou de cerca de 1 em 4 para cerca de 2 em 3. E o mais interessante foi que alguns sons, que antes nunca eram identificados corretamente, passaram a ser identificados corretamente
08:23 quase sempre. Por exemplo, o som de escovar os dentes, certo? Dá para ver que treinar um adaptador LoRA sobre os pesos do modelo realmente aumenta muito a precisão. Certo. Agora, vamos falar sobre se ele aprendeu a ouvir ou se apenas aprendeu os rótulos. Executei o treinamento de novo, mas dessa vez deixei 10 sons completamente de fora do treinamento e testei com esses 10. Nos sons com que foi treinado, ele melhorou como antes. Mas, nos 10 sons
08:54 que nunca tinha visto, não melhorou. Então, o modelo aprende os rótulos que você fornece, não a capacidade de ouvir de forma geral. Isso significa que, se você fizer fine-tuning para a sua aplicação, todos os rótulos que forem importantes precisam estar nos dados de treinamento. Ele não consegue simplesmente generalizar. Agora, vamos falar sobre o impacto disso no restante do modelo. Ou seja, qual é o efeito real de tentar fazer fine-tuning nele? Carreguei o modelo completo com e sem o adaptador e executei três verificações: pesquisa de fotos, voz
09:26 busca e busca geral por texto. A busca de fotos e a busca por voz não mudaram em nada, mas a busca geral por texto caiu cerca de quatro pontos, que é o custo de mudar o backbone compartilhado. Então, se sua aplicação também depende de busca geral por texto, eu testaria isso depois de cada fine-tune. Na primeira vez que fiz essa verificação, a busca por voz caiu quase a zero, o que parecia indicar que o modelo tinha esquecido a fala. Então, analisei tudo passo a passo, e os pesos do adapter foram carregados exatamente
09:58 certo. O problema era o processor salvo com o adapter. No meu caso, ele estava reduzindo cada clipe de áudio a alguns milissegundos, então todos os sons pareciam meio iguais para o modelo. A correção foi só uma linha que reutiliza o processor do modelo base. Então, se você salvar e recarregar um adapter de áudio, pelo menos com a versão que usei, teste de novo depois de recarregá-lo. Certo, agora vamos falar dos exemplos de texto da demonstração. Então, peguei
10:28 transcrições de 120 dos meus vídeos e as dividi em trechos curtos. Eu não tinha as perguntas para esses trechos, então usei o Gemini 3.8 flash para escrever uma pergunta no estilo de um espectador para cada um deles. Isso me deu pares de perguntas e trechos que as respondem, que é exatamente o formato de que falamos. Depois, fiz a divisão por vídeo, então as perguntas de teste vêm de vídeos com os quais o
10:59 modelo não foi treinado, ou que ele não viu durante o treinamento. Antes do treinamento, os trechos corretos apareciam primeiro em cerca de dois terços das vezes. Depois de menos de 3 minutos de treinamento, isso subiu para três em cada quatro vezes. A busca geral por texto caiu novamente cerca de quatro pontos, que é o mesmo custo do exemplo de áudio que vimos antes. Então, esta é a busca desde o início do vídeo. E, para usar isso com seus próprios dados, você só
11:30 precisa de um arquivo de perguntas e trechos no mesmo formato. Então, a resposta é sim. Alguns minutos de fine-tuning melhoraram claramente os resultados com meus próprios sons e meus próprios vídeos, mas o modelo aprendeu meus rótulos, e não habilidades gerais, e abriu mão de alguns pontos na busca geral por texto. Então, se você pretende fazer fine-tuning do Gemma 2, eu me concentraria em três coisas. A primeira é transformar seus dados em pares e manter duplicatas fora dos lotes. A segunda é testar com
12:01 dados que o modelo ainda não viu. Então, você precisa dividir os dados por origem. E a última é verificar o que mais mudou depois do treinamento, porque o backbone é compartilhado por todas as modalidades. E acho que isso é uma das coisas mais práticas que você pode fazer com um modelo de embedding, pelo menos nos meus experimentos. Se você fez fine-tuning de modelos de embedding nas suas próprias aplicações, compartilhe nos comentários abaixo o que funcionou para você. Os links estarão na descrição do vídeo. Enfim, espero que este vídeo tenha sido útil. Obrigado por assistir
12:33 e, como sempre, até o próximo.
Transcrição original
[00:00] Embedding Gemini 2 is great, open model for multimodal retrieval, but what makes it even better is that you can fine-tune it on your own data. Now, this matters because an embedding model off the shelf only knows the general data it is trained on, but it has no clue about your documents, your product names, or sounds your applications care about. Now, before I show you how it works, let me show you a quick demo. This is a version of Embedding Gemini 2 that I fine-tuned on Transcribe for my own
[00:31] YouTube channel. I type a question and it returns the exact moment in a video where I talk about it with a timestamp that I can click. So, the question I want to answer in this video is whether a few minutes of fine-tuning can make this model noticeably better at your own data without breaking what it already does well. In this video, I want to show you how fine-tuning an embedding model works, and then we will walk through a notebook where I fine-tuned it on two of my own
[01:02] examples. Okay, so let’s talk about what makes fine-tuning an embedding model different from fine-tuning a large language model. When you fine-tune an LLM, you show it an input and exact text you want it to write back. So, training data already contains the right answer word for word. Now, an embedding model does not write anything. It turns an input into a list of numbers, and those numbers are only useful in relationship to each other.
[01:34] This is what people usually call the embedding space. So, there is no correct list of numbers or embeddings that you could write down as a target. The only thing you can tell the model is which things should end up close to each other. Now, this changes what your training data looks like. Say you run support for a smart home company. And you want a search box that answers customer questions from your help center. Each training example is a pair, which
[02:06] is a customer question and a passage that answers it. You don’t need scores or label wrong answers. Only questions and passages that belongs to each other. But pulling each question towards its passage is not enough on its own because the model could put everything in the same spot and still score well. So, let’s talk about how the model learns what to push away and what to bring closer. During training, the model sees a batch of pairs at once. For
[02:38] example, a batch of 32 pairs. For each question, its own passage is the right answer and every other passage in the batch is treated as the wrong answer. So, you don’t actually have to collect negative examples. You automatically are going to have access to negative examples if you collect these pairs. So, the loss pulls each question towards its own passage and push it it away from all the others. Which means you get the
[03:09] wrong answers for free without labeling a single one. So, the easiest mental model is a multiple choice question where other pairs in the batch are the wrong options. In sentence transformers, this is called multiple negative ranking loss. And it is the same idea that CLIP used to put images and text into one space. Now, there is one catch with this. Say, two customers ask about the same reset procedure and both pairs land in the
[03:42] same batch. The loss is going to treat the second copy of that passage as a wrong answer for the first question. So, you’re teaching the model that the right answer is wrong in this case. The fix is a batch sampler that is never going to put the same text twice in one batch, which Sentence Transformers calls the no duplicate sampler. Now, the second thing to get right is the prompt. Embedding Gemma 2 expects a short task
[04:12] prompt in front of a search query and a title and text format for documents. So, whatever format you train with is the format your search code needs to use it. Think about this as a prompt template that people use for large language models. The prompt template that you use for training should be exactly the same as the one that you’re using in production or inference. Okay. So, now let’s talk about what actually gets trained because this is the most interesting part of the video.
[04:44] Instead of updating all the weights, we are going to use a LoRA, which adds small trainable matrices next to the existing layers and keeps the original weights frozen. LoRA adapters are extremely fast to train, so you don’t really need to retrain the entire network. In my runs, that was less than 2% of the weights, so you can save a small adapter file instead of a full copy of the model. Now, in the last video we saw that text, images, video, and audio all go through
[05:16] the same backbone for Embedding Gemma 2. So, if you train the backbone on audio, you are also changing the part that handles your photos and your text, and we need to check what actually is going to be the cost of that. The last concept is how you measure all of this. So, training loss going down only tells you that the model got better at the examples it was trained on, but what you want to care about is the search quality on questions that it
[05:47] hasn’t seen. Otherwise, it’s going to be just overfitting. So, you keep a test set aside and you split it by source. If the same article has passages in both train and test, the model has effectively seen the answer already. So, you want to split by articles, by videos, or by recording. Now, this also raises a question for experiments, which is whether the model learns a general skill or only learns your labels. Okay,
[06:19] so that is enough theory. Uh now, let me show you the notebook, which is built on Unsloth embedding Gemma 2 notebooks, and I ran everything on an A100 uh GPU in Colab. The link is going to be in the video description. The first example fixes the weak spot from the last video. Um if you haven’t seen it, I highly recommend to watch that video. The example was everyday sounds. So, I used a dataset called ESC-50, which has short clips of 50 everyday
[06:50] sounds. Things like dog barking, rain, or a chainsaw. Now, each sound uh name becomes a sentence. So, for example, the sound of a chainsaw. So, classification becomes search in this case because the model embeds the clip, embeds the label sentence, and picks the closest one after training. So, before training, the model picked the right sound first only about one time in four. So, you’re looking at about 25% accuracy. I also noticed that
[07:22] the model’s built-in classification prompt did even worse than writing the label as a search query. So, a better prompt is not going to fix this, which is where the training actually comes in. All right, [snorts] so how exactly is this trained? The training pairs are label sentence and the audio clip. Now, this is exactly where the duplicate trap is important to remember because every label has many training clips. So, without the no duplicate sampler, the
[07:52] same label would land in a batch. I added LoRA to the audio encoder and the backbone. And the training took about 7 and 1/2 minutes on the A100 GPU. So, the thing to watch is the top result for clips the model had never heard during training. It went from about 1 in 4 to about 2 in 3. And the most interesting thing was that there were some sounds that were never corrected to be correctly identified
[08:23] almost every time. For example, brushing teeth sound, right? So, you can see that training a LoRA adapter on top of the model weights actually gives you a huge boost in accuracy. Okay. Now, let’s talk about whether it learned to hear or only learned the labels. So, I ran it again, but this time I hid 10 sounds completely from training and tested on those 10. On the sound it trained on, it improved just like before. But, on the 10 sounds
[08:54] it never saw, it didn’t get better. So, the model learns the labels you give it, not hearing in general. Which means if you fine-tune your own application, every label you care about needs to be in the training data. It cannot just generalize. Now, let’s talk about what this cost the rest of the model. That is, what is the actual impact if you try to fine-tune it. So, I loaded the full model with and without the adapter and ran three checks, which are photo search, voice
[09:26] search, and general text search. Photo search and voice search did not move at all, but general text search dropped by about four points, which is the the of changing the shared backbone. So, if your application also relies on general text search, I would test it after every fine-tune. Now, the first time I ran this check, voice search dropped to almost zero, which looked like the model had forgotten speech. So, I went through it step by step and the adapter weights were loaded exactly
[09:58] right. The problem was the processor that is saved with the adapter. Now, in my case, it was cutting every audio clip down to a few milliseconds, so every sound looked kind of the same to the model. The fix was just one line that reuses the processor from the base model. So, if you save and reload an audio adapter, at least with the version I used, test it again after you reload it. Okay, now let’s talk about the text examples from the demo. So, I took
[10:28] transcripts from 120 of my videos and cut them into short passages. Now, I did not have the questions for these passages, so I used Gemini 3.8 flash write one viewer-style question for each one of those passages. That gave me pairs of question and passages that answers it, which is exactly the format we talked about. Then, I split it by video, so the test questions comes from videos that the
[10:59] model was not trained on or it hasn’t seen them during the training. Now, before training, the right passages come back first about two times in three. After less than 3 minutes of training, it went up to three in four. General text search dropped by about four points again, which is the same cost as in the sound example that we saw before. So, this is the search from start of the video. And to use it on your own data, you only
[11:30] need a file of questions and passages in the same format. So, the answer is yes. A few minutes of fine-tuning made it clearly better on my own sounds and my own videos, but it learned my labels rather than general skills and it gave up a few points on general text search. So, if you’re going to be fine-tuning Gemma 2, I would focus on three things. First one is turning your data into pairs and keeping duplicates out of batches. The second one is testing on
[12:01] the data it has not seen. So, you need to split it by source. And the last one is checking what else changed after training because the backbone is shared by every modality. And I think this is one of the most practical things you can do with an embedding model, at least in my experiments. If you have fine-tuned embedding models on your own applications, please do share what worked for you in the comment section below. Links are going to be in the video description. Anyways, I hope you found this video useful. Thanks for watching
[12:33] and as always, see you in the next one.