Flow matching para iniciantes | @ariG23498
Autoria: Hugging Face · 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: Flow matching for Beginners | @ariG23498 · Canal: Hugging Face · 28:05 · Assistir no YouTube
Tópicos: Geração de conteúdo com IA, Modelos de IA
O vídeo apresenta a intuição do flow matching: transformar ruído gaussiano em dados, como imagens, seguindo um campo de velocidades. Explica como construir uma trajetória linear entre ruído e uma amostra de treinamento, treinar um modelo para prever a velocidade e gerar amostras usando o método de Euler. Em demonstrações interativas, mostra o treinamento de campos de velocidade para distribuições simples e de um modelo que gera dígitos manuscritos. Ao final, o apresentador ressalta que a explicação é introdutória e recomenda aulas e materiais adicionais para aprofundamento.
Pontos-chave
Seção intitulada “Pontos-chave”- Uma trajetória linear entre ruído e dado pode ser escrita como uma mistura ponderada dos dois, controlada pelo tempo t.
- A velocidade-alvo dessa trajetória é a diferença entre a amostra de dado e o ruído: Z − ε.
- O modelo recebe o ponto intermediário Xₜ e o tempo t para prever a velocidade correspondente.
- A geração consiste em seguir o campo de velocidades, usando o método de Euler para avançar em pequenos passos.
- O campo de velocidades transporta amostras da distribuição gaussiana para a distribuição dos dados.
- O treinamento compara a velocidade prevista com a velocidade-alvo usando uma perda L2.
- A demonstração de dígitos usa PCA para comprimir as imagens antes de aplicar o objetivo de flow matching às representações.
- Mais passos de amostragem permitem acompanhar melhor o campo de velocidades durante a geração.
Capítulos
Seção intitulada “Capítulos”| Início | Capítulo | Resumo |
|---|---|---|
| 00:00 | Da distribuição de ruído à imagem | O apresentador introduz flow matching e explica a trajetória linear entre uma amostra de ruído e uma imagem de treinamento. |
| 06:10 | Distribuições de dados e distribuição gaussiana | O vídeo relaciona a geração de imagens à distribuição dos dados e apresenta a distribuição gaussiana como ponto de partida conhecido. |
| 13:30 | Transporte entre distribuições | O apresentador explica como seguir um campo de velocidades pode transportar amostras da distribuição de ruído para a distribuição dos dados. |
| 15:37 | Treinamento do campo de velocidades | A demonstração em código mostra como formar pontos intermediários, calcular a velocidade-alvo e treinar o modelo com uma perda L2. |
| 20:15 | Geração de dígitos manuscritos | O modelo é treinado no navegador com representações comprimidas por PCA e gera dígitos seguindo o campo de velocidades. |
| 24:54 | Conclusões e materiais para aprofundamento | O apresentador contextualiza os limites da introdução e recomenda aulas, cursos e outros materiais para estudar flow matching e probabilidade. |
Citações
Seção intitulada “Citações”A velocidade-alvo é, de forma simples, Z menos ε. — 02:35
Você começa com uma distribuição gaussiana e, em cada passo, prevê a velocidade e se move nessa direção. — 05:08
Esse transporte é o que está por trás de todo esse flow matching. — 15:04
Flow matching não é tão simples quanto esta publicação tenta fazer parecer. — 24:54
Conceitos e entidades
Seção intitulada “Conceitos e entidades”- flow matching (conceito): Método generativo que aprende um campo de velocidades para transportar amostras de uma distribuição inicial até a distribuição dos dados.
- Gaussian distribution (conceito): Distribuição em forma de sino usada no vídeo como distribuição inicial conhecida para gerar ruído.
- Euler method (conceito): Método numérico que avança em passos sucessivos seguindo o campo de velocidades previsto pelo modelo.
- vector field (conceito): Campo de vetores que indica a direção e a velocidade a seguir em cada ponto da trajetória.
- MNIST (repo): Conjunto de dados de dígitos manuscritos usado como exemplo de geração de imagens no vídeo.
- PCA (conceito): Técnica de redução de dimensionalidade usada na demonstração para comprimir as imagens em representações.
- PyTorch (ferramenta): Framework usado como referência para explicar o carregamento de dados e o ciclo de treinamento do modelo.
- Claude (ferramenta): Assistente mencionado pelo apresentador como um dos recursos que ajudaram a criar a demonstração.
- Codex (ferramenta): Ferramenta mencionada pelo apresentador como um dos recursos que ajudaram a criar a demonstração.
- Hugging Face (empresa): Canal do vídeo e plataforma onde o apresentador diz que o material relacionado está disponível.
Tradução completa (pt-BR)
Seção intitulada “Tradução completa (pt-BR)”00:00 Olá, pessoal. Eu sou Auditory e hoje vou falar sobre flow matching. Considerem este vídeo um complemento ao texto do blog que escrevi recentemente sobre o mesmo assunto. Neste vídeo, vamos falar sobre algumas coisas. A primeira é passar do ruído para as imagens. É isso que queremos, certo? Depois, vamos falar sobre como treinar esse objetivo. Qual é o objetivo e, então, como fazer inferência com ele. Também veremos no navegador como treinar um exemplo bem simples. Vamos passar do ruído para dígitos manuscritos do MNIST, o que vai ser
00:31 muito legal. Assistam ao vídeo. Leiam também o texto do blog. E, sempre que acharem que não estão conseguindo entender, basta relacionar rapidamente o vídeo ao texto do blog, e espero que tudo faça sentido. É assim que eu gostaria de conduzir o vídeo. Então, o que treinar? Escolha uma imagem de treinamento Z. Z é nossa imagem de treinamento. É um dos dados do conjunto de dados. E um ruído independente adicionado, épsilon. Épsilon é uma amostra da distribuição Gaussiana de
01:02 ruído que temos, com o mesmo formato. Agora, escolha um número T. T é essencialmente o tempo, que vai de zero a um. E misture os dois. Então, esta é uma soma ponderada de épsilon, que é o ruído, e Z, que são nossos dados. O que acontece no tempo T? No tempo T, quando X T é igual a zero, ou X de zero, temos apenas ruído puro. E quando T é igual
01:33 a um, X de um é o dado. No meio do caminho, que é X de T, você terá uma mistura em partes iguais de ruído e dados. E T, ou tempo, é simplesmente uma barra de progresso. Então, de zero a um, você vai do ruído aos dados. E isso traça uma trajetória em linha reta, do ruído até nossa imagem. E por que essa é uma trajetória em linha reta? Por que não é algo não linear? Ou por que isso é muito
02:04 simples é porque presumimos que seja assim; queremos que seja assim. Se nos aprofundarmos nas minúcias dos artigos sobre difusão e flow, veremos que este é um caso muito especial. Mas é muito intuitivo de entender, e foi essa abordagem que adotei. Com essa trajetória, você também verá que a velocidade-alvo, ou simplesmente a taxa de variação desse ruído para os dados, digamos, ou da trajetória, ou a taxa de variação dessa
02:35 trajetória, ou a velocidade-alvo, é simplesmente Z - E, ou seja, os dados menos o ruído que você amostrou. E o que isso faz é: se você tem X em qualquer ponto e sabe em que direção e com que velocidade precisa seguir, sabe onde vai acabar, e esse lugar é essencialmente seus dados. Então, se
03:05 você tem ruído e tem a velocidade, ou seja, a direção e a velocidade, vai acabar nos dados. E é isso que acontece em toda a demonstração interativa incorporada. Então, vamos reproduzir. Você parte do ruído, isto é, 0,0. E, à medida que o tempo aumenta e você segue essa velocidade-alvo, chega a um dado. Vamos escolher outro dígito. E você chega a ele e simplesmente reproduz.
03:36 Ele segue a velocidade e vai do ruído à imagem. E isso é extremamente intuitivo. Você tem essa linha reta, dada por 1 - t épsilon + t vezes Z. E, com a velocidade-alvo, dá para entender que, se você está em um ponto e tem uma velocidade-alvo, ao segui-la acaba chegando aos dados. Isso é bom. Isso nos dá tudo de que precisamos para
04:06 construir, essencialmente. Você fornece ao modelo XT e o tempo T, e o modelo prevê a velocidade, que é Z - E. E, quando o modelo fornece a previsão, você entende o que deve inferir. Isso me leva à próxima seção: o que inferir. Se você tem a velocidade, ou seja, se o modelo fornece a velocidade, pode simplesmente dar um passo na direção da velocidade, ou usar a velocidade para dar um passo a partir de
04:38 onde você está, naquela direção e com aquela velocidade. E, ao fazer isso, ou ao seguir nessa direção da velocidade, você acaba chegando a algum lugar, e esse lugar vai ser sua distribuição de dados. E a ideia toda com que todos nos deparamos são os campos vetoriais, ou seja, um campo com velocidades, e como você pode traçar uma trajetória simplesmente seguindo esse campo de velocidades. E esse
05:08 método de seguir a trajetória que usamos aqui se chama método de Euler, ou método de Euler para ir de um lugar a outro seguindo esse campo vetorial. A geração em Python fica assim. Então, se você tem um modelo, vamos esquecer o formato e falar apenas dos passos, isto é, de quantos passos você precisa dar. Você começa com uma Gaussiana. Você tem
05:39 um dividido pelo número de passos, que é o tamanho do passo; e, para cada passo, basta prever a velocidade e avançar naquela direção e com aquela velocidade. É basicamente isso, e é muito fácil de entender. Isso também me leva às trajetórias ODE opcionais e ao flow. Se você é pesquisador e quer entender melhor, fique à vontade para ler isto. No vídeo, acho que isso não é realmente necessário e vai ser um pouco
06:10 avançado. Então, vou pular esta parte, mas não deixe de ler. Brinque com os campos e veja o que tudo isso significa. Na seção sobre passar do ruído às imagens, vou explicar o que queremos dizer com geração e como o flow matching entra nisso. Então, imagine um conjunto de dados com milhares de dígitos manuscritos, e cada imagem tem 28 por 28 pixels e, quando achatada, pode ter 784 pixels ou 784
06:43 dimensões. E cada uma dessas imagens pode ser vista como um ponto nesse espaço de dimensão muito alta, isto é, 784 dimensões. Nosso conjunto de dados nos fornece mil pontos assim, e esses pontos não estão espalhados uniformemente, o que é muito importante destacar, porque, se estivessem, esta seção inteira, ou o texto inteiro do blog, nem existiria. A ideia central é que esses pontos não estão espalhados uniformemente, e
07:15 os dígitos manuscritos ocupam algumas regiões mais densamente do que outras. E o que descreve essa intuição, ou a ferramenta com que podemos descrevê-la, é chamado de distribuição de probabilidade. A distribuição de probabilidade nos diz como a probabilidade está distribuída, o que é útil. Algumas regiões, com alta probabilidade de conter dígitos manuscritos, são mais plausíveis, enquanto regiões que contêm imagens sem sentido são menos prováveis ou têm pouca probabilidade.
07:46 Agora, pense em tudo isso junto. Esta é a distribuição de probabilidade dos dígitos manuscritos. É uma distribuição de probabilidade muito específica, que trata apenas de dígitos manuscritos. E esta é a distribuição de dados. Agora, se você tem a distribuição de dados, pode criar imagens inéditas, imagens manuscritas inéditas, a partir dela, porque sabe o que é plausível, sabe o que tem alta probabilidade de acontecer e também sabe o que não é tão provável.
08:17 Com essas informações, você pode amostrar ou gerar imagens manuscritas inéditas a partir dessa distribuição de dados, o que é ótimo. Agora, você tem essa distribuição? Essa é a pergunta que vou fazer. Você, como usuário ou como pesquisador, tem a distribuição de probabilidade em mãos? Se tivesse, não haveria toda a pesquisa que muitas pessoas estão fazendo para descobrir essas imagens inéditas ou realistas. Elas não têm a
08:49 distribuição e querem mapear uma distribuição que conhecemos. E, alerta de spoiler, essa será a distribuição normal, ou distribuição Gaussiana. Vamos falar sobre a distribuição Gaussiana um pouco mais adiante. É muito conhecida e está bem estabelecida. As equações matemáticas estão disponíveis. Então, em essência: distribuição normal, ótimo. Podemos amostrar dela. Conhecemos a função densidade de probabilidade. Ela é elegante.
09:20 Agora, se você tem a distribuição normal, como pode mapear ou moldar essa distribuição normal para que corresponda à sua distribuição de dados? Essa é toda a essência de qualquer coisa relacionada a diffusion que você vê. Não só modelos de flow, mas também modelos de diffusion, score matching, ou DDPMs, DDIMs. Estou usando muitos jargões, mas você não precisa se lembrar de tudo isso. Pense na intuição que estou tentando construir. Se tivéssemos a distribuição de dados à mão, se tivéssemos a distribuição de probabilidade dos dados, não precisaríamos passar por tanta pesquisa para
09:52 chegar lá. Como não a temos, queremos uma maneira de mapear algo que conhecemos, isto é, a distribuição gaussiana, para a distribuição de dados. Queremos ir daqui até aqui. E, olhando para isso, você meio que entende aonde quero chegar. Com diffusion, com flow matching, com score matching, queremos ir de uma distribuição que conhecemos para uma distribuição que não conhecemos.
10:23 Como eu disse, sou um homem de palavra. Vou falar um pouco sobre a distribuição gaussiana. Se você já entende bem a distribuição gaussiana, pule esta seção, pois não vai precisar dela. Então, uma distribuição gaussiana é… Deixe-me limpar isto. Uma distribuição gaussiana se parece com isto. É uma curva em forma de sino. E ela é centrada na média, que é mu. E a dispersão é determinada pela variância, que é sigma ao quadrado. O que queremos dizer com dispersão? Se você desenhar isso, verá que
10:55 o sino encolhe ou se alarga conforme a variância. A variância diminui, o sino encolhe. Se a variância aumenta, o sino se alarga. E a média desloca o sino inteiro. Então, se você mover a média, verá que o sino se move junto com ela, mantendo a mesma variância. Certo? Agora, o que queremos fazer é amostrar dessa distribuição. Então, o que significa amostrar? Amostrar é obter uma amostra de uma distribuição, junto com a intuição de
11:27 probabilidade. Então, pense sempre no eixo x como os valores amostrados e, para cada amostra correspondente, qual é a probabilidade de ela ocorrer. Então, se ela estiver centrada em zero, deixe-me movê-la para 0, 0. Certo? E a variância talvez seja um. O que quero dizer com isso é que, se fizermos uma amostragem,
11:57 vamos ver muitos valores entre 0,5 e -0,5. E, se fizermos uma amostragem, vocês verão que um ponto verde aparece. Também vemos outro ponto verde. E vocês vão conseguir perceber que os valores estão sempre dentro de toda essa dispersão. Isso significa que não ultrapassa esses limites nem chega aos valores atípicos? Com certeza chega aos valores atípicos. Esse é justamente o objetivo da probabilidade. Probabilidade é a matemática
12:29 da incerteza. Você nunca tem certeza do que vai acontecer. Você apenas tem mais certeza de certas coisas porque elas são prováveis. Não são certas. Essa é toda a essência. E, quando você assimilar essa ideia, tudo vai ficar muito mais claro. Então, se fizer 50 amostragens, verá valores que ultrapassam a variância. Há valores que ultrapassam a variância tanto no lado positivo quanto no negativo. Mas
13:00 a maioria dos valores fica concentrada em torno da variância. E, conforme você aumenta a variância e faz amostragens, verá que agora elas estão mais dispersas. Vai conseguir perceber que elas ficam mais próximas das extremidades, porque estão muito dispersas. Falei bastante, então vamos para a próxima seção. Agora, antes de passar ao treinamento do campo de velocidade, deixe-me falar com você por um segundo. Entendemos
13:30 uma coisa importante sobre a distribuição de ruído e sobre ir da distribuição de ruído, ou gaussiana, para a distribuição de probabilidade dos dados. Também entendemos que, se houver uma única linha reta de um ponto de dados de ruído até um ponto de dados, podemos essencialmente inferir o caminho usando o método de Euler, desde que tenhamos a velocidade. Mas como o movimento de um ponto a outro com essa velocidade também estabelece uma ligação entre
14:01 a passagem de uma distribuição de probabilidade para outra? Essa é uma ideia bastante intuitiva, que eu vejo de um jeito um pouco diferente. Se você começa com ruído, essencialmente começa com uma distribuição de ruído. Então, é uma amostra da distribuição de ruído. Mas, assim que você move, ou move o seu ruído, ou move todas as suas amostras de ruído ao longo de uma velocidade ou de um campo de velocidade, essencialmente também está transportando
14:32 a distribuição de ruído para a distribuição de dados. Então, o campo vetorial, ou o campo com muitos vetores de velocidade, como vocês podem ver aqui, é um campo com muitas dessas setas. Essas setas são campos vetoriais. Os vetores de velocidade. Desculpe. E, quando você tem essa amostra de um ponto de uma distribuição de ruído, está partindo do ruído e indo para
15:04 a distribuição de dados. Então, se você amostrar muitos desses pontos, terá muitos desses pontos de ruído dos quais começa. E, seguindo esse campo de velocidade, você chega à distribuição de probabilidade dos dados. E esse transporte é o que está por trás de todo esse processo de flow matching. Você tem um campo de velocidade. Quer treiná-lo, e vamos ver como fazer isso. E por que o treinamos? Porque isso nos ajuda a transportar de P noise ou
15:37 P init ou P Gaussian ou P normal. P significa probabilidade. Para P de dados, a distribuição de dados que sempre quisemos alcançar, mas nunca tivemos. Dito isso, vamos à seção. Nesta seção, treinamos o campo de velocidade. Vamos direto ao código. O código é muito mais fácil do que os parágrafos de texto. Um carregador de dados; isto é bem parecido com PyTorch. Então, é um carregador de dados, e você obtém Z. Z é uma amostra do
16:08 conjunto de dados ou um lote pequeno desse conjunto de dados. Epsilons são amostras aleatórias da distribuição normal, randn. N significa normal. T é uma amostra de uma distribuição uniforme, de 0 a 1. Esse é o tempo. Pode ser qualquer valor entre 0 e 1. Tanto 0 quanto 1 são inclusivos. Xt é a linha reta do ruído até os dados, e Xt dá a você
16:39 um ponto ao longo dessa linha, que é uma mistura, ou uma mistura ponderada, de epsilon, que é o nosso ruído, e Z, que são os nossos dados. E o alvo é Z menos epsilon. Então, esse é o valor de referência. Essa é a velocidade conhecida. E a previsão do modelo seria a velocidade-alvo. O objetivo é alcançar a velocidade-alvo. A perda é a previsão menos o alvo, ou seja, a velocidade que conhecemos comparada com a velocidade que prevemos. E isso é apenas a norma L2, que
17:10 é muito simples. É apenas a previsão menos o alvo ao quadrado, o que sempre vai dar um resultado positivo, e então calculamos a média. E agora, com PyTorch, zeramos os gradientes dos otimizadores, fazemos loss.backward, atualizamos os gradientes e, essencialmente, damos um passo com o otimizador para otimizar a rede neural. Então, essencialmente, o que fazemos é tentar reproduzir o campo de velocidade
17:42 inteiro, de P normal até P de dados. E, nesta incorporação, duas luas é a distribuição-alvo que queremos alcançar. E, quando clicamos em treinar, você verá que a perda de treinamento diminui. E, no início, haverá uma amostra, isto é, muitas amostragens da distribuição normal, e as setas são o que estamos
18:12 treinando. As setas serão o campo de velocidade, ou os vetores, e vão empurrar as amostras para essas duas distribuições-alvo. Vamos ver isso em ação. Então, essencialmente, ele foi da distribuição normal e ainda está tentando chegar a essas duas luas. Vamos redefinir. Vamos escolher uma espiral. E então treinar de novo. Vejam, as velocidades estão mudando e o mapeamento está mais ou menos acontecendo, mas não está mapeando completamente para essa espiral. Não está
18:44 sobreajustando à espiral, o que é bom. Vamos redefinir. Vamos escolher um anel. E acontece a mesma coisa de novo. Fiquem à vontade para brincar com o campo no tempo T para verificar como será a velocidade em cada passo de tempo e também ver como a perda de treinamento diminui. Vocês também podem desmarcar e marcar os campos, mostrar o alvo e fazer muitas outras coisas nesta incorporação.
19:14 E o objetivo de treinamento é, essencialmente, uma equação bem densa, como vemos nos artigos, mas, no fundo, ele diz que o alvo é Z menos E. Você precisa subtrair o alvo da previsão, e a previsão é simplesmente UT de theta; UT é a velocidade dada pelo ponto de XT. Então, XT é isto: a previsão é XT e T, dado o modelo. O modelo simplesmente vai
19:45 dar a velocidade, e você calcula previsão menos alvo. Exatamente isso, mas muito mais fácil no código. Esse é o objetivo final. Fizemos tudo. Analisamos a teoria. Analisamos os embeddings, que recebem P D P e o transformam em P data, e queremos entender algo de que realmente precisamos. Precisamos treinar uma rede neural com o mesmo objetivo
20:15 que nos permita criar imagens que pareçam dígitos escritos à mão. E isso é algo que Claude e Codex me ajudaram a construir. Não fui eu que fiz isso. É justo deixar isso bem claro, mas fui a pessoa no loop humano, guiando cada vez mais o processo até chegar ao que é agora. Então, vamos treinar. O que vemos aqui é um modelo sendo treinado no seu navegador com o objetivo de fluxo, que é
20:45 prever a velocidade, que é Z menos epsilon. E, à medida que o treinamento é atualizado, o erro de previsão diminui. O tempo de treinamento também aparece aqui, e você vê que ele se estabilizou porque duas coisas estão acontecendo. Uma delas é que estamos fazendo um erro de treinamento por pixel. Ou seja, não estamos calculando Z menos epsilon, em que Z é uma imagem e epsilon é outra imagem de
21:17 ruído. O que fazemos é aplicar PCA a essa imagem, um algoritmo que a comprime, mantendo apenas os recursos de que precisamos ou os recursos de maior impacto. Depois, calculamos uma velocidade-alvo para o PCA, o que é um pouco contraintuitivo, mas vai fazer sentido. Temos os pixels, comprimimos tudo em algo que já não são pixels, mas que pode ser codificado e decodificado
21:47 novamente em pixels. E essas codificações agora formam o conjunto de dados, e o ruído ocupa o mesmo espaço que as codificações. Temos, então, o caminho do ruído até essas codificações e aplicamos toda a teoria — ou, melhor dizendo, simplesmente aplicamos toda a teoria que aprendemos a essas codificações e treinamos o modelo. Como essas compressões não são tão boas,
22:18 o erro de previsão se estabiliza. Uma compressão melhor, ou representações melhores, talvez resultem em erros menores. Ou seja, o erro talvez diminua muito rapidamente. Mas temos algo que está funcionando. Esse é o primeiro ponto. O segundo é que acho que esta configuração é bem ingênua. Então, com otimizadores melhores ou maneiras melhores de otimizar isso ou de analisar os gradientes e descobrir
22:49 o que está acontecendo, talvez você consiga descobrir como quer que a perda diminua com facilidade. Essa é a primeira parte do treinamento, que está boa. Então, cada dígito escrito à mão é mais ou menos reconhecível. Os três parecem muito com oitos, mas dá para identificar bem os zeros — embora os zeros pareçam dois. Os seis parecem zeros, e assim por diante. Agora, quando você tem esse campo vetorial, isto é, o modelo que fornece o campo vetorial, você pode gerar amostras usando o método de Euler. E vamos escolher o sete como alvo. O número de etapas de amostragem é o que você quiser. Isso não importa muito, mas, quando você usa 30 etapas de amostragem, vê que o sete fica parecido com o passo de Euler; quando você aumenta o número de etapas de amostragem do passo de Euler, ele se aproxima mais e segue melhor o campo de velocidades. Ele
23:20 não ultrapassa o alvo nem fica aquém dele. E, quando você escolhe outro dígito como alvo, digamos, dois, e gera outro ruído, às vezes você obtém um dois, às vezes não. E é essencialmente isso que acontece com a probabilidade. Ah, aí está. Eu estava clicando em novo ruído muitas vezes para descobrir o que estava errado, mas aqui parece mais ou menos um dois. Mas
23:50 com mais etapas de amostragem e, de novo, um novo ruído, parece um três. De novo, um bom dois, mas ele vai de oito, aparentemente, para dois — não me pergunte como isso acontece. Simplesmente acontece, e isso me deixa de queixo caído toda vez. Com isso, quero encerrar, mas antes também quero garantir que vocês recebam algumas conclusões importantes. As conclusões são
24:23 que o flow matching não é tão fácil quanto esta publicação de blog faz parecer. É muito mais complicado. Há vários jargões técnicos e matemáticos que alguém precisa conhecer ao fazer pesquisa, mas o objetivo central desta publicação de blog é ajudar você a entender um pouco. E, assim que entender e as coisas fizerem sentido, talvez você queira passar para algo mais difícil. Para
24:54 passar para algo mais difícil, estas aulas são exatamente o que você precisa. São de Stanford, e uma delas é do MIT. Essas duas aulas foram de grande ajuda para mim, e são de primeira classe. Claro que tinham que ser. Mas, se você está começando e quer saber sobre flow matching, simplesmente conhecê-lo ou tentar entendê-lo, Julia faz um
25:25 trabalho incrível para garantir que você entenda toda a difusão. Também vou incluir um link para a playlist dela. Ela é incrível. Outra coisa que eu queria mencionar, e que talvez pareça um pouco — como se diz? — um pouco intimidadora, é que todas as notações de probabilidade não são tão complicadas. É só que os matemáticos querem se comunicar
25:56 — ou os engenheiros, ou qualquer pessoa que trabalhe em uma área — com muita eficiência e usando menos jargão. Para entender tudo isso, tive que ler muitos artigos. Todos eles tinham uma matemática bem intimidadora. Fiz este curso de Stanford. É uma introdução à probabilidade, e isso mudou completamente minha perspectiva, não só sobre probabilidade, mas também sobre ensino e sobre essa forma de comunicação.
26:29 E me desculpem se este vídeo acabar ficando um pouco longo, mas, na minha opinião, vocês também deveriam dar uma olhada neste curso. Ele muda completamente sua perspectiva sobre o ensino, sobre probabilidade, sobre ensinar com paixão e também sobre como respeitar o tempo uns dos outros. Para respeitar o tempo uns dos outros, os matemáticos criaram símbolos. Os símbolos não são muito complicados. Eles só querem
27:00 representar certas coisas que, quando você as conhece, se encaixam tão bem e de forma tão eficaz e eficiente em uma ou duas linhas que é incrível. Então, o que você leva daqui? Primeiro, as aulas estão todas disponíveis on-line. Vá em frente e acompanhe, se quiser. Esta publicação de blog continua no Hugging Face como um Space. Se gostou do que fiz, ajude votando a favor. E também, se
27:32 você tiver outras dúvidas ou quiser que eu aborde outra coisa, me avise nos comentários, nas minhas mensagens diretas no Twitter ou simplesmente publique no Twitter. Seria ótimo. E, com isso, até a próxima.
28:05 Se tiverem outras dúvidas ou quiserem que eu aborde outro assunto, me avisem nos comentários, nas minhas mensagens diretas do Twitter ou simplesmente publiquem no Twitter. Seria ótimo. E, com isso, até a próxima.
Transcrição original
[00:00] Hello everybody. I am Auditory and today I’m going to talk about flow matching. Consider this video as an addendum to the blog post that I have recently written on the same topic. And in this video we are going to talk about a few things. Number one is going from noise to images. That is what we want, right? And then we talk about how to train this objective. What is the objective and then how to infer on it. We will also see in the browser how to train a very simple example. We go from noise to handwritten MNIST digits, which is
[00:31] going to be super cool. Look at the video. Look at the blog post as well. And whenever you think you are not able to understand, just quickly map from the video to the blog post and I I hope it’s going to make sense. And that’s how I would want to flow in the video. So, what to train? Choose a training image Z. Z is our training image. It’s one of the data from the data sets. And an independent noise added epsilon. Epsilon is a draw from the Gaussian
[01:02] noise distribution that we have. Of the same shape. Now choose a number T. And T is time essentially, which goes from zero to one. And blend the two. So, this is a weighted sum of epsilon that is noise and Z, which is our data. What happens at time T? At time T, which is X T is equal to zero or X of zero, it’s just plain noise. And at T is equal
[01:33] to one, X of one, it’s the data. At halfway, which is X of T, you will have an equal mixture of both noise and data. And T or time is simply a progress bar. So, from zero to one, you go from noise to data. And this traces a straight line trajectory from noise to to our image. And why this is a straight line trajectory, why is this not something non-linear, or why is this very
[02:04] straightforward is because we assume it to be, we want this to be. Um going further down the weeds of diffusion papers and flow papers, you will find that this this is a very special case. But this is very intuitive to understand and this is what I went on with. And with this trajectory, you will also see that the target velocity, or just the rate of change of this of this noise to data, let’s say, or the trajectory, or the rate of change of
[02:35] this trajectory, or the target velocity is very simply put z - e, that is the data, subtract it with the noise that you have sampled out. And what this does is if you have x at any point and you know which direction and with what speed you need to go uh you need to go to you know where you will end up, and that where is essentially your data. So, if
[03:05] you have noise and you have the velocity, that is the direction and the speed you will end up with data. And this is the entire um interactive embed that happens. So, let’s play. You go from noise, that is 0.0. And as time increases and you follow this target velocity you go to a data. Let’s pick out a different digit. And you go to and you just play.
[03:36] It’s following the velocity and it goes from noise to image. And this is extremely intuitive. You have this uh straight line, which is given by 1 - t epsilon + t of z. And as you have the target velocity, you can understand that if you are at a point and you have a target velocity, and if you follow that target velocity, you end up into the data. This is nice. This gives us everything that we need to
[04:06] construct, essentially. You give the model the XT and the time T, and the model will predict the velocity, which is Z - E. And once you have the model give out the prediction, you will understand what to infer. And that takes me to the next section, which is what to infer. If you have the velocity, that is if the model gives you the velocity, you can simply go one step towards the velocity, or or use use the velocity to go one step from
[04:38] where you are in that direction in that speed. And as you do that, or as you go in that direction of velocity, you essentially go end up somewhere, and that somewhere is going to be your data distribution. And the entire thing that that we all came across is vector fields, that is a field with velocities, and how you can map out a trajectory by just following this velocity field, and this
[05:08] following the trajectory is something which we which we have used here is called the Euler method or Euler’s method of going to going from one place to another following this vector field. The generation in Python looks like this. So, if you have a model, let’s forget shape, let’s just talk about steps, that that is the how many steps you have to move. You start with Gaussian. You have
[05:39] one by the number of steps is how small the step size is, and for each step size, you just predict the velocity and move in that direction and speed. That’s That’s essentially it, and it’s very simple to wrap your heads around. And this also takes me to the optional OD trajectories and flow. And if you are a researcher, you want to understand more about it, please feel free to read this. Uh in the video, I don’t think this is quite necessary, and it’s going to be a little
[06:10] advanced. So, I’m going to skip this part, but be sure to read this. Uh play with the play with the fields, and see what this all means. In the section from noise to images, I’m going to formulate what we mean by generation and how uh flow matching comes into play. So, imagine a data set containing thousands of handwritten digits, and each image is uh 28 by 28, and when flattened can be of 784 pixels or 784
[06:43] dimensions. And each of this image can be thought of as a point in this very high-dimensional, that is 784, dimensional space. Our data Our data set gives us 1,000 such points, and these points are not scattered uniformly, which is very important to uh point out because if it would have been, the entire section or the entire blog post would not come into existence. The entire essence is these points are not scattered uniformly, and
[07:15] and handwritten digits occupy some regions more densely than others. And what we can describe this intuition, or the tool with which we can describe this intuition, is called probability distribution. Now, the probability distribution tells us how probability is spread, which is good. Some regions with high handwritten digit probability are more plausible, while regions that contain meaningless images are less probable or have little probability.
[07:46] Now think of the entire thing together. This is the handwritten digit probability distribution. It’s a very specific probability distribution which only talks about handwritten digits. And this is the data distribution. Now, if you have the data distribution, what you what you can do is you can now draw novel novel images, novel handwritten images from this data distribution because you know which is plausible, you know what is highly probable to happen, and you also know what is not that probable to happen.
[08:17] Once you have this information with you, you can sample or draw from this data distribution novel handwritten images, which is good. Now, do you have it? That’s the question I’m going to ask. Do you Do you as a user or do you as a researcher have the probability distribution in your hand? If you had it, we wouldn’t have had the research that a lot of people are doing on figuring out these novel images or these realistic images. They don’t have the
[08:49] distribution and they want to map a distribution which which we know, and spoiler alert, that is going to be the normal distribution at the Gaussian distribution, and we are going to talk about Gaussian distribution a little later. It’s It’s a very known It’s very well drawn out. The mathematical equations are there. So, in essence, normal distribution, good. We can draw from it. We know the probability density function. It’s It’s It’s elegant.
[09:20] Now, if you have the normal distribution, how can you map or mold this normal distribution into your data distribution? That is the entire essence of anything diffusion that you see. Not only flow models, but also diffusion models, score matching, um or or DDPMs, DDIMs. I’m just out a lot of jargons, but you don’t have to remember all of this. Think about the intuition that I’m trying to build. We have If we had data distribution at hand, if we had the probability data distribution, we would not have to go
[09:52] through so much of research. Due to the fact that we don’t have it, we want a way to map from something we know, that is the Gaussian distribution, to the data distribution. We want to go from this to this. And looking at this, you you kind of understand where I’m going. We want with diffusion, with flow matching, with score matching, we want to go from a distribution that we know to a distribution which we don’t.
[10:23] As I said, I’m a man of my words. I’m going to talk about Gaussian a little bit. Um, if you if you are good with Gaussian, please skip this section as you won’t need it. So, a Gaussian distribution is Let me clear this. A Gaussian distribution looks like this. It’s a bell-shaped curve. And uh it’s centered around the mean, that is mu. And the spread is uh devised with its variance, that is sigma squared. What do we mean by spread? So, if you draw this, you will see that
[10:55] the bell either shrinks or spreads out with the variance. The variance goes down, the bell shrinks. If the variance goes up, the bell spreads out. And uh a mean shifts the entire bell. So, if you move the mean, you’ll see that the bell moves along with it, with the variance being the same. Okay? Now, what we want to do is we want to draw from this distribution. So, what does draw mean? Draw is to sample from a distribution along with the intuition of
[11:27] the probability. So, always think about the x-axis as the samples that are there and corresponding to each sample, what is the likelihood of that sample being present. So, if it is surrounded if it is centered at zero, let me move to 0 0. Okay? And the variance is one, maybe. So, what I mean by this is if we draw,
[11:57] we’re going to see um a a value between 0.5 to -0.5 a lot. And uh if we draw it, you see that a green point comes into position. We also see another green point. And you you’ll you’ll be able to figure out that it’s always between the entire spread. Does that mean it it does not overshoot and it goes to outliers? It definitely goes to outliers. That’s the whole point of probability. Probability is the math
[12:29] of uncertainty. You’re never certain of what is going to happen. You’re just more certain of certain things because it’s probable. It’s it’s not definite. That’s the entire essence. And once you have the idea wrapped around your head, it’s going to be so much better. So, if you draw 50, you’ll see that there are values that overshoot the uh variance. There are values that overshoot the variance on the positive and the negative side. But,
[13:00] most of the values are centered around the variance. And as you move the variance and you draw, you’ll see that the draws are more spread out now. You’ll be able to figure out that they are more towards the tail end because it’s very draw it’s very spread out. I’ve blabbered a lot and we go to the next section. Now, before going to training the velocity field, let me talk to you for a second. We We understood
[13:30] a major thing about noise distribution and going from noise distribution or Gaussian to the probability data distribution. We also understood that if there is one single straight line from one data point of noise to one data point of data, we can essentially infer by using the Euler method given that we have the velocity. But how does moving from one point to another with the velocity also bridge
[14:01] moving from one probability distribution to another? Now, this is a very intuitive setting that I think a little differently. If you start with noise, you essentially are starting with noise distribution. So, it’s one draw from the noise distribution. But as soon as you move or you move your no or or you move all of your samples of the noise al- along a velocity or along a velocity field, you’re essentially also transporting
[14:32] your noise distribution to the data distribution. So, the vector field or the field with a lot of velocity vectors, as you might see here, this is a field with a lot of these arrows. These arrows are vector fields. The vector velocity vectors. I beg your pardon. And once you have this one point sample from a noise distribution, you are moving from noise and you’re going into
[15:04] the data distribution. So, if you sample a lot of this, you have a lot of these noise data’s that you start off from. And following along this velocity, you go into the probability distribution of the data. And that transport is what is um underlying all of this flow matching bit. You have a velocity field. You want to train it, and we’ll see how to train this. And why do we train it? It’s because that helps us transport from P noise or
[15:37] um P init or P Gaussian or P normal. P is probability to P of data, the data distribution that we always wanted to achieve but never had. Having said that, let’s come uh to the section. And in the section, we train the velocity field. Let’s straight away go to the code. The code is so much easier uh than the paragraphs of text. A data loader, this is very PyTorch-like. So, it’s a data loader, and you get Z. Z is one sample from the
[16:08] data set or a bunch of mini batch of this data set. Epsilons are um a draw from the random normal, randn. N stands for normal. T is a sample of uh from a uniform distribution, 0 to 1. This is the time. It can be anything between 0 to 1. 0 and 1 both considered inclusive. Xt is the straight line from uh noise to data, and Xt gives you
[16:39] one point in between this line, which is a mixture of or a weighted mixture of uh epsilon, that is our noise, and Z, that is our data. And target is Z minus epsilon. So, this is the ground truth. This is the known velocity. And the prediction of the model would be the target velocity. It It’s to achieve the target velocity. The loss is prediction minus target, which is the velocity which we know versus the velocity which we predict. And this is just L2 norm, which
[17:10] is very simple. It’s just one the prediction minus the target squared, which is always going to give you a positive result and you mean it. And now with PyTorch, you zero grad the optimizers, you do a loss.backward, you update the gradients, and you essentially go one step with your optimizer and optimize your neural network. So, essentially what we do is we are trying to emulate the velocity
[17:42] field, the entire field from P normal to P of data. And in this embed, two moons is the target distribution that we want to achieve. And once we hit train, you will see that the training loss goes down. And there will be a there will be at the very beginning a sample at as a as in a sample a lot of draws from the normal distribution, and the arrows are something that we are
[18:12] training. The arrows will be the velocity field or the vectors, and it will push the samples to these two target distributions. Let’s see that in action. So, essentially it went from normal and it’s still trying it’s still trying to go to these two moons. Let’s reset. Let’s do a spiral. And then train again. See the velocities are changing and it kind of maps, but is not completely mapping to this spiral. It’s not
[18:44] overfitting on the spiral, which is good. Let’s reset. Let’s do a ring. And the same thing happens all over again. Please feel free to play with the field at time T to check at which time step what the velocity is going to look like, and also see how the training loss is going down. You can also uncheck check the fields, show the target, and so so much in in this embed.
[19:14] And the training objective is essentially really dense equation as as we see in the papers, but it essentially tells you that the target the target is Z minus E. You need to subtract the target from the prediction and the prediction is just UT of theta and UT is the velocity given the point of XT. So, the XT is this, prediction is XT and T given the model. The model is just going
[19:45] to give you the velocity and you do a prediction minus target. Exactly this, but so much easier in code. This is the end game. We have done everything. We have looked at theory. We have looked at embeds which take uh P D P in it to P data and we want to wrap our heads around to something which we actually need. We need to train with the same objective a neural network
[20:15] which lets us create images that look like handwritten digits. And this is something which Claude and Codex has helped me build. This is not me at all. Very fair disclaimer, but I have been the human in the loop to guide it more and more to what it is now. So, let’s just let’s just train. So, what we see here is a model that is getting trained in your browser with the flow objective that is
[20:45] predict the velocity that is Z minus epsilon. And as the as the training updates the prediction error goes down, the training time is also something which we have here and you see that it’s saturated because there are two things that are happening. One is we are and doing a pixel wise um training error. That is we are not doing a Z minus epsilon where Z is an Z is an image and epsilon is another image of
[21:17] noise. But what we do is we do a PCA of this image which compresses its an algorithm of compressing uh to only features that we need or highly impactful features. And then we do a target velocity of the PCA which is a little unintuitive but it it it’ll make sense. So you have pixels, you compress it into something which is not pixels anymore but these can be en- these are encoded which can be decoded
[21:47] to the pixels again. And uh these encodings now formulate your data set and the noise is of the same space as the encodings and you have from noise to these encodings and you do the entire theory and or or better to say that you just apply the entire theory that we learned to these encodings and you would train this. So due to the fact that these compressions are not that great,
[22:18] the prediction error saturates. So better the compression or better representations might um give you better errors. That is the error might come down very quickly. But we have something which is working. So that’s one. Number two that I think is this is a very naive kind of a setup. So if you have better um optimizers or if you have better ways to optimize it or to look into the gradients and figure
[22:49] out what is happening, you might be able to figure out how uh you want the loss to go down easily. So that’s the first part of training, which is good. So every uh handwritten digit is somewhat noticeable. Threes are three looks looks very like eights, but you can fairly figure out zeros, but zeros look like two. Sixes look like zeros and so on. Now, once you have this vector field, that is the that is a
[23:20] model that gives you the vector field, you can sample using the Euler method. And let’s target seven. And sampling steps are whatever. Like this does not really matter, but as soon as you do a sampling step of 30, you see that seven is like the Euler step as soon as you give more sampling steps to the Euler step, it goes closer to the it follows the velocity field better. It
[23:50] does not overshoot, it does not undershoot. And as as you go to another target digit, say two, figure out another noise, you get two sometimes, you don’t get two sometimes. And this is essentially what happens with probability. Ah, there you have it. I was I was clicking on new noise so many times to figure out what is what is wrong, but here it looks more or less like two. But
[24:23] with more sampling steps and again a new noise, looks like three. Again, a good two, but it goes from eight, apparently, two two, which is uh Don’t ask me how this happens. It just happens and it blows my mind every time that that it that it does. And with that, I want to close, but before that, I also want to make sure I give you some key takeaways. The takeaways would be
[24:54] that flow matching is not as easy as this blog post tries to be. It’s much more complicated. There are a bunch of technical jargons, mathematical jargons that one would want to know when they’re doing research, but the entire essence of this blog post is for you to understand some of it. And as soon as you understand and as soon as things click, you might want to switch to something more difficult and to
[25:25] switch to something more difficult, these lectures are just what you need. So, by Stanford and one of them is by MIT. So, these two lectures as I have taken a lot of help from and they are they are top class. Of course, they have to be. But, if you are a newbie, if you want to know about flow matching, just know or wrap your head around it. Julia does a
[25:56] tremendous task of making sure you understand the entire diffusion. I’ll also link the playlist she has. She is incredible. And another thing that I wanted to mention, which might sound a little um how do you call it? A a little intimidating is all the notations of probability are not that complicated. It’s just that uh mathematicians want to communicate
[26:29] or or engineers or whoever, if you are in a field, you want to communicate with a high efficiency and less jargon way. And to understand all of this, I had to go through a lot of papers. All of these papers had very intimidating math. And I took this course from Stanford. It’s uh introduction to probability and this changed the entire perspective of me for not only probability but also teaching and this way of communication
[27:00] and I’m sorry if this video goes to ends up being a little longer but my opinion would be to also look at this course and this suddenly changes your entire perspective of teaching of probability of passionate teaching and also how do you how do you want to respect each other’s time. So to respect each other’s time mathematicians have devised symbols. The symbols are not very complicated. They just want to
[27:32] signify certain things which once you know it just forms so well and so effectively so efficiently in one line or two lines that it’s crazy. So what do you take away from this? One is the lectures are all online. Go go ahead if you want to follow along. This blog post remains in hugging face as a space. If you like what I did do help me with up voting it and also if
[28:05] you have any other queries if you want me to cover something else do let me know in the comments or in my Twitter DMs or just post in Twitter. That would be great. And with that uh see you next time.