Material de estudo para acompanhar os slides.
O objetivo da aula é saber dizer o que é cada pixel do mapa das duas taxas, por que a fronteira entre convergir e divergir é um fractal, como se mede a dimensão dela pela contagem de caixas, e o que cada etapa do projeto entrega para a apresentação da aula 10.
Os tópicos
Sem horário marcado: o que não couber hoje entra na aula seguinte.
- Revisão da aula 8
- Repetir uma conta
- O mapa das duas taxas
- O zoom e a dimensão
- De onde vem
- O projeto
- Fechamento
Notação
Os símbolos novos dos slides, na ordem em que aparecem; os das aulas anteriores estão nos roteiros delas.
| Símbolo | Lê-se | Quer dizer | Slide |
|---|---|---|---|
| x recebe x ao quadrado mais c | a conta repetida; a seta é atribuição | 5 | |
| nabla L de w | o gradiente da perda, o vetor das derivadas parciais | 5 | |
| eta zero, eta um | as taxas da camada de entrada e da camada de saída | 8 | |
| W zero, W um | os pesos da camada de entrada, 8 por 8, e da de saída, 8 | 8 | |
| y chapéu | a saída da rede, a estimativa do alvo y | 8 | |
| v t | a perda no passo t dividida pela do começo | 9 | |
| logaritmo na base 10 | log₁₀ η = 2 quer dizer η = 100 | 10 | |
| N de s | quantas caixas de lado s a figura toca | 15 | |
| proporcional a | igual a menos de um fator fixo | 15 | |
| d | a dimensão: o expoente de N ∝ (1/s)^d | 15 |
Para o projeto, estas peças resolvem quase tudo:
python projeto/varredura.py --conferir: confere o gradiente e a versão rápida.python projeto/varredura.py --resolucao 128 --saida projeto/figuras/janela.png: a janela inteira, no laptop.python projeto/varredura.py --janela X0 X1 Y0 Y1 --resolucao 512 --saida ...: uma janela do zoom, em log₁₀ das taxas.python projeto/varredura.py --redesenhar projeto/figuras/janela.json: refaz a figura do .npy, sem treinar.np.logspace(a, b, n): n taxas de 10^a a 10^b, iguais em escala logarítmica.f[:m*s, :m*s].reshape(m, s, m, s).any(axis=(1, 3)): a grade de caixas de lado s que a fronteira f toca;.sum()conta as caixas.np.polyfit(np.log(1/s), np.log(N), 1)[0]: a inclinação, a dimensão.
1. Revisão da aula 8
Slide 1: A capa
A aula 9 cumpre a promessa da aula 1: desenha o fractal do projeto, com a turma. A pergunta vem da aula 7: lá, com uma taxa só, a fronteira entre o treino que melhora a rede e o que piora ficou quebrada. Aqui, cada camada tem a sua taxa, e a fronteira vira uma figura no plano. O fractal entra pincelado, só o que o projeto precisa: o que é, como aparece quando se repete uma conta e como se mede o quanto uma fronteira é quebrada.
A foto da capa é uma couve romanesca, um fractal da natureza: cada broto repete, em ponto menor, a forma da couve inteira. Foi tirada por Ivar Leidus em 3 de janeiro de 2021 e publicada no Wikimedia Commons com a licença CC BY-SA 4.0. A couve se repete igual a si mesma; a fronteira do treino, que a aula desenha, não se repete e continua quebrada em qualquer escala.
Slide 2: Revisão, de memória
A revisão é de memória: quatro perguntas sobre a aula 8.
O que é a massa invariante, e por que não depende de quem mede? É a massa da partícula que se desfez nos dois múons, M² = (E₁ + E₂)² − |₁ + ₂|². Quem anda em relação à colisão mede outras energias e outros momentos, mas a mesma M.
Por que o histograma tem picos? Cada pico é uma partícula: o J/ψ, o Υ e o Z se desfazem em dois múons, e a massa invariante desses eventos se junta perto da massa da partícula, sobre um fundo liso.
Por que as entradas passam pelo asinh antes da rede? Porque a energia e o momento vão de quase zero a centenas de GeV, e a maior parte dos eventos fica perto do zero. O asinh(x/5) comprime os números grandes como um logaritmo, aceita os negativos e espalha os pequenos.
Onde a rede erra mais? No pico do J/ψ, que ela borra, e no Z, onde há poucos exemplos, 364 no treino. A fórmula erra em milionésimos; a rede, em uns 2%.
Slide 3: O fio do curso
O curso segue um fio, e este slide aparece em todas as aulas, com a aula do dia em destaque e a data e o formato de cada aula.
Na aula 2, a reta treinada pelo gradiente descendente tinha um limiar: abaixo de uma taxa, o treino convergia; acima, divergia. Na aula 7, numa rede de verdade, esse limiar deixou de ser um ponto. Na aula 8, os dados do CMS. Nesta aula, a 9, o limiar ganha duas dimensões, uma taxa por camada, com os dados do CMS, e vira o fractal do projeto. A aula 10 é a apresentação do projeto e a revisão do curso inteiro.
2. Repetir uma conta
Slide 4: Uma taxa para cada camada
A pergunta da aula. Até a aula 7, a rede inteira usou uma taxa de aprendizado só, o η, o tamanho do passo contra o gradiente. Nada impede que cada camada tenha a sua: η₀ para os pesos da camada de entrada, η₁ para os da camada de saída. Cada par (η₀; η₁) é um ponto do plano, e cada ponto é um treino inteiro, do zero.
Com uma taxa só, a aula 7 achou, entre 3,86 e 7,55, uma faixa em que taxas vizinhas dão respostas diferentes. A pergunta é que figura a fronteira faz no plano. A resposta da aula, com a rede do projeto: um fractal, a mesma família de figuras do Buddhabrot da capa da aula 1. A faixa da aula 7 também tem resposta, no slide da rede da aula 7 no plano.
Slide 5: Repetir uma conta
Antes da rede, uma conta de uma linha. Começa-se em x = 0 e repete-se x ← x² + c: o novo x é o quadrado do velho mais c. A seta ← quer dizer que o valor da direita passa a ser o x; é atribuição, como o = do Python. Iterar, no curso, é isso: repetir a mesma conta usando a saída de um passo como entrada do seguinte.
Com c = −1, o x vai de 0 a −1, volta a 0 e fica alternando: não foge. Com c = 0,25, o x sobe devagar, 0,25, 0,3125, 0,3477, e chega perto de 0,5 sem passar. Com c = 1, o x vai a 1, 2, 5, 26 e não para mais: foge para o infinito.
O treino é a mesma coisa com muitos números. O passo do gradiente descendente da aula 2, ← − η∇L(), pega os pesos de um passo e devolve os do seguinte; repetido, o treino converge ou diverge. O c da conta faz o papel da taxa η: é o número que se escolhe antes e que decide se a conta repetida fica perto ou foge.
∇L(), lê-se nabla L, é o gradiente da perda, o vetor das derivadas parciais da aula 2. Em física, nabla também aparece no gradiente de um campo, com o mesmo sentido.
Slide 6: Fica perto ou foge, em vídeo
O vídeo faz a conta para quatro valores de c, ao mesmo tempo, cada um numa reta. O ponto azul é o x de cada passo, e o rastro claro mostra por onde passou.
Com c = −1, o ponto pula entre 0 e −1. Com c = 0,25, anda cada vez menos e se aproxima de 0,5. Com c = 0,3, um pouco maior, anda devagar por 11 passos e, no passo 12, passa de 2 e foge. Com c = 1, foge no passo 3. A diferença entre 0,25 e 0,3 é pequena, e a resposta é outra.
Passar de 2 basta para saber que fugiu: com c entre −2 e 2, um x maior que 2 em tamanho tem x² maior que 2|x|, e cada passo o afasta mais.
Depois, a mesma pergunta para cada c da reta, de −2,5 a 1: azul, onde a conta fica perto; laranja, onde foge. Na reta, a fronteira são dois pontos, −2 e 0,25. Quando o c tem dois números, um ponto do plano, a mesma conta, com a multiplicação dos números complexos, desenha o conjunto de Mandelbrot, e a fronteira vira um fractal. Os números complexos ficam de fora do curso: são uma caixa-preta que recebe dois números e devolve dois. No fim, o mapa do treino da rede do projeto, que esta aula constrói: a conta repetida é o passo do gradiente, e o ponto do plano são as duas taxas.
Slide 7: Fractal, de novo
A definição é a da aula 1. Fractal é uma figura com detalhe em qualquer escala: ampliada, continua cheia de detalhe, em vez de virar uma linha lisa. O nome vem do latim fractus, quebrado, e foi criado por Benoit Mandelbrot em 1975.
O Buddhabrot, a capa da aula 1, é o conjunto de Mandelbrot desenhado pelos caminhos dos pontos que fogem. A nota daquela capa dizia que aquele fractal não era o do projeto, que só aparece em dezembro. É este.
A imagem do slide é o litoral da Noruega, com os fiordes, visto de satélite pela NASA, em domínio público. O litoral é o fractal clássico: em 5 de maio de 1967, antes de existir a palavra fractal, Mandelbrot publicou "How long is the coast of Britain?", sobre a ideia, estudada antes por Lewis Fry Richardson, de que o comprimento de um litoral depende do tamanho da régua: quanto menor a régua, mais reentrâncias ela pega, e mais comprido o litoral fica. A contagem de caixas, no fim desta aula, é a mesma ideia.
O vídeo do 3Blue1Brown do estudo da semana passada tem um título que corrige uma ideia comum: os fractais, em geral, não são iguais a si mesmos. A couve da capa, ampliada, repete a forma inteira; o litoral e a fronteira do treino não repetem, e mesmo assim continuam quebrados em qualquer escala. O que os une é o detalhe sem fim, medido pela dimensão, que esta aula conta no fim.
Os processos caóticos costumam gerar fractais, como fronteiras entre as regiões que levam a destinos diferentes. Caótico, no curso, é o processo em que uma diferença minúscula no começo vira uma diferença grande no fim. Na linguagem comum, caos é bagunça; aqui, é uma conta determinada, sem sorteio nenhum, que amplifica as diferenças.
3. O mapa das duas taxas
Slide 8: A rede do projeto
A rede do projeto é a do artigo de Sohl-Dickstein, menor: 8 entradas, uma camada oculta de 8 neurônios com a tanh, e uma saída, sem viés. As entradas são a energia e as três componentes do momento dos dois múons, com 8 números, padronizadas; a saída é o logaritmo da massa invariante, padronizado. São 64 pesos em W₀ e 8 em W₁, 72 ao todo, e o treino usa 72 eventos do dimuon.csv, sorteados com a semente 0: tantos exemplos quanto pesos, como no artigo.
Os fatores √(2/8) na entrada e 1/8 na saída são a parametrização de campo médio do artigo: uma escala fixa que mantém a soma dos neurônios num tamanho razoável. Não são pesos e não mudam no treino.
A perda é o erro quadrático médio, L, a média de (y − ŷ)² nos 72 eventos. O treino é o gradiente descendente da aula 2 com todos os exemplos a cada passo, 100 passos, em float64, e com duas taxas: η₀ multiplica a derivada em relação a W₀, e η₁, a derivada em relação a W₁. Nada é sorteado durante o treino: o mesmo par de taxas dá sempre o mesmo resultado.
O artigo usa 16 neurônios, 272 exemplos aleatórios e 500 passos. O projeto usa 8, 72 eventos reais e 100 passos, para caber no laptop.
Slide 9: Convergiu ou divergiu
Cada treino tem de virar uma cor, e a regra é a do notebook do artigo. v_t é a perda no passo t dividida pela perda do começo, L₀: v_t = 1 quer dizer que nada mudou; 0,1, que a perda caiu a um décimo; 1.000, que subiu mil vezes. O treino convergiu se a média de v_t nos 20 últimos passos, de 80 a 99, ficou abaixo de 1: no fim, a perda estava menor que no começo. Senão, divergiu.
A cor de dentro de cada região diz a rapidez. No treino que convergiu, a soma dos v_t: quanto menor, mais depressa a perda caiu, e mais claro o azul. No que divergiu, a soma de 1/v_t: quanto menor, mais depressa a perda explodiu, e mais claro o laranja.
Os quatro treinos do vídeo seguinte, com η₀ e η₁ e a perda final sobre a do começo: η₀ = 1 e η₁ = 1, v = 0,74, convergiu devagar; η₀ = 10 e η₁ = 31,6, v = 0,30, convergiu mais rápido; η₀ = 10 e η₁ = 158, a perda chega a 10²⁰⁹, divergiu; η₀ = 10 e η₁ = 31.623, a perda sobe 82 mil vezes no primeiro passo e passa do maior número do float64 no passo 42, divergiu.
As cores são o azul e o laranja do curso, os dos slides desde a aula 1: azul para convergiu, laranja para divergiu, com todo azul mais claro que todo laranja, para as duas regiões se separarem também em escala de cinza e para quem não distingue vermelho de verde. O projeto/varredura.py pinta assim, e as figuras da aula saem da mesma função.
Slide 10: Cada pixel é um treino, em vídeo
O vídeo mostra o que é um pixel do mapa. À esquerda, o plano das taxas, com log₁₀ η₀ na horizontal e log₁₀ η₁ na vertical, de −3 a 6: taxas de 0,001 a 1 milhão. O logaritmo entra porque as taxas boas e ruins se espalham por nove ordens de grandeza; log₁₀ η = 2 quer dizer η = 100.
À direita, a perda passo a passo de quatro treinos, dividida pela do começo, em escala logarítmica, com a linha tracejada em 1. Cada treino vira um quadradinho na sua posição, com a cor da regra do slide anterior.
Depois o plano se enche: 8 por 8 treinos, 16 por 16, até 512 por 512, que são 262.144 treinos. A figura fica mais nítida, e a fronteira, mais recortada. No laptop do professor, a janela de 512 por 512 levou 73 segundos, repartida entre 16 processos; com um processo só, como no projeto/varredura.py, a de 256 por 256 leva 85 segundos.
Slide 11: O mapa inteiro
O mapa da janela inteira, com as taxas de 0,001 a 1 milhão nas duas camadas, e 512 por 512 treinos.
Embaixo e à esquerda, o azul: taxas pequenas, o treino converge. O azul mais escuro, à esquerda, é o treino lento: com η₀ pequena, a camada de entrada quase não anda. Em cima, o laranja: com η₁ acima de uns 20 a 80, o treino explode, qualquer que seja η₀. Embaixo à direita, outro laranja: com η₀ acima de uns 4.000 e η₁ abaixo de uns 0,1, também.
A fronteira de cima é a mais interessante. À direita, de perto, é recortada, com pontos azuis no meio do laranja e o contrário: é dela que sai o zoom.
À esquerda, ela é quase reta, e aqui a conta da aula 2 explica. Com η₀ muito pequena, a camada de entrada quase não anda, e só a de saída treina: o treino é a regressão linear da aula 2 sobre as saídas fixas da camada oculta, e a perda é uma tigela. O passo diverge acima de η₁ = 2/λ, com λ o maior autovalor da hessiana da perda, a mesma conta do limiar 0,513 da reta. Aqui, λ = 0,0388, e o limiar é 51,5: no mapa, logo acima, em η₁ ≈ 52, há uma linha fina de treinos que divergem. Hessiana é a matriz das derivadas segundas da perda; na aula 2 ela entrou como caixa-preta, e aqui dá o número.
Acima da linha, até η₁ ≈ 79, outra faixa azul: a perda explode e volta. Com η₁ = 70, ela sobe a 2.291 e termina em 0,82. Na explosão, o gradiente fica tão grande que a camada de entrada se mexe, 35% dos pesos, mesmo com η₀ = 0,001, e o maior autovalor cai para 0,0231, abaixo de 2/70: o passo deixa de explodir, e o treino converge. Com η₁ = 80, a explosão vence, e o treino diverge.
O artigo observa que nem toda parte da fronteira é fractal: com só a camada de saída treinando, ela é lisa e tem fórmula. É a parte da esquerda.
Slide 12: A rede da aula 7 no plano
A aula 7 achou, entre 3,86 e 7,55, uma faixa em que taxas vizinhas dão respostas diferentes, melhora ou piora, e deixou para esta aula a causa da mistura. Aqui, a rede pequena da aula 7, 784 entradas, 16 neurônios com a tanh e 10 saídas, nos 256 primeiros exemplos do MNIST, sem lotes, ganha uma taxa por camada. A taxa única da aula 7 é a diagonal tracejada, η₀ = η₁.
À esquerda, o plano de 0,01 a 316, com 128 por 128 treinos de 200 passos, como na aula 7. Cada pixel fica numa de três classes no passo 200: voltou, a perda abaixo da de antes do treino, 2,32, o "melhorou a rede" da aula 7; em trânsito, a perda ainda acima dela; explodiu, a perda passou de 1.000 em algum passo. Voltaram 68% dos treinos, estão em trânsito 20% e explodiram 12%. A diagonal cruza a borda da faixa laranja perto de η = 4 a 8, onde a aula 7 achou a mistura.
À direita, a causa do granulado, em duas taxas vizinhas do quadrado preto, a segunda 0,9% maior que a primeira, treinadas por 600 passos. A perda das duas salta da inicial para dezenas nos primeiros passos e depois fica oscilando, sem se assentar: a de η₀ = 5,93 acima da perda de antes o tempo todo, a de η₀ = 5,99 em volta dela, abaixo pela primeira vez no passo 145. No passo 200, a primeira está em trânsito e a segunda voltou. Na mesma linha, de seis taxas vizinhas, três ficam abaixo pela primeira vez nos passos 145, 269 e 325, e três não ficam até o passo 600. A classe num passo fixo depende de onde a oscilação de cada treino está naquele passo, e isso muda sem ordem de uma taxa para a vizinha: é o granulado.
Mais passos não desfazem os grãos. No quadrado preto, η₀ de 3,98 a 12,6 e η₁ de 3,55 a 11,2, com 128 por 128 treinos de 600 passos, voltaram 34% no passo 200, 40% no 400 e 43% no 600, e os pares de pixels vizinhos em classes diferentes foram de 15,5% para 18,5%. Nas 601 taxas da diagonal, as da figura do zoom da aula 7, as que pioram a rede caem de 375 no passo 200 para 345 no 600, e a resposta continua trocando entre vizinhas, 81 vezes.
A oscilação muda sem ordem porque o treino, nessa faixa, é caótico: uma diferença minúscula no começo cresce até mudar o resultado. Com η = 5, a conta da aula 7 dá 11,13 de perda final, e a mesma conta com as somas em outra ordem, a do programa desta aula, 14,99; a diferença começa na 16ª casa decimal. Pelo mesmo motivo, no passo 200 o programa desta aula conta 375 taxas da diagonal que pioram a rede, e o da aula 7, 383.
A regra do artigo, a média da perda nos 20 últimos passos abaixo da do começo, dá a mesma classe que "voltou" em 99,3% dos pixels: neste mapa, a fronteira do artigo é a mesma faixa granulada.
4. O zoom e a dimensão
Slide 13: O zoom na fronteira, em vídeo
O vídeo amplia a fronteira de cima seis vezes seguidas, cada janela quatro vezes menor que a anterior, até 1.024 vezes. Cada janela é um mapa novo, de 512 por 512 treinos, calculado do zero; o quadrado preto marca onde fica a seguinte. Ao lado, o aumento e as taxas da janela: na última, η₀ vai de 11,97 a 12,22 e η₁ de 46,46 a 47,41.
Em nenhuma escala a fronteira vira uma linha lisa: aparecem filamentos, redemoinhos e ilhas de uma cor dentro da outra. É o que define um fractal. Os centros das janelas foram escolhidos à mão, olhando cada mapa, como o próprio artigo diz que fez.
Mil vezes são três ordens de grandeza. O artigo foi muito mais longe: sequências de uns 50 mapas, cada um com o dobro do aumento do anterior, e a fronteira continuou fractal por mais de dez ordens de grandeza, até onde o float64 deixa de distinguir taxas vizinhas.
As cores de cada janela se ajustam ao próprio mapa, como no artigo: o mesmo azul pode ser rápido numa janela e lento na outra. A troca de convergiu para divergiu é a mesma em todas.
Slide 14: Seis janelas, uma dentro da outra
As seis janelas do vídeo, paradas, para estudar. Cada uma tem 512 por 512 treinos e levou 73 segundos no laptop do professor, com 16 processos. O quadrado preto de cada uma é a janela seguinte.
Janela 0: a janela inteira, com a fronteira de cima quase reta. Janela 1, 4 vezes: a fronteira de cima já é dentada. Janela 2, 16 vezes: pontos laranja no azul e faixas inclinadas. Janela 3, 64 vezes: uma língua laranja entra no azul e se enrola. Janela 4, 256 vezes, a da capa: a ponta da língua vira um gancho com filamentos. Janela 5, 1.024 vezes: dentro do gancho, mais redemoinhos.
Convergiram 46%, 52%, 48%, 53%, 60% e 31% dos treinos de cada janela: o zoom fica sempre em cima da fronteira, com as duas regiões presentes.
Slide 15: A dimensão pela contagem de caixas
Dimensão, aqui, é um número que diz o quanto uma figura enche o plano. A ideia é a contagem de caixas. Corta-se a imagem numa grade de caixas de lado s e contam-se as caixas que a figura toca, N(s). Depois, corta-se a caixa pela metade e conta-se de novo.
Uma linha toca 2 vezes mais caixas quando s cai pela metade: N ∝ (1/s)¹. Uma área, 4 vezes: N ∝ (1/s)². O símbolo ∝, lê-se proporcional a, quer dizer igual a menos de um fator fixo. O expoente d de N ∝ (1/s)^d é a dimensão. Numa fronteira fractal, ele fica entre 1 e 2: quebrada demais para ser linha, magra demais para ser área.
Tirando o logaritmo, log N = d log(1/s) + constante: os pontos (log(1/s); log N) caem numa reta, e d é a inclinação. É a conta de caixas() e dimensao() em codigo/fractal.py, com caixas de 2, 4, 8 e 16 pixels.
Na física e na geometria, dimensão costuma ser o número de direções independentes, 1 na linha, 2 no plano, 3 no espaço, sempre inteiro. A contagem de caixas dá o mesmo número para essas figuras e dá números quebrados para as fractais.
Slide 16: Contar caixas, em vídeo
O vídeo faz a contagem. Primeiro, para calibrar: uma diagonal de 512 pixels toca 4, 8 e 16 caixas de 128, 64 e 32 pixels, sempre o dobro; um quadrado cheio de 256 pixels toca 4, 16 e 64, sempre o quádruplo.
Depois, a fronteira da janela 3 do zoom, 64 vezes ampliada: os pixels que têm um vizinho do outro lado, convergiu de um lado e divergiu do outro. Com caixas de 16, 8, 4 e 2 pixels, ela toca 836, 2.795, 9.018 e 27.260 caixas. Cada vez que a caixa cai pela metade, a contagem sobe umas 3,2 vezes: 2^1,68. A inclinação da reta é 1,68, a dimensão da fronteira nessa janela.
As caixas de 32 e 64 pixels ficaram de fora da reta: nessa janela, quase todas tocam a fronteira, a contagem para de crescer e a reta entortaria. O pixel sozinho também: nele, a conta mede a espessura do desenho, não a fronteira.
Slide 17: A dimensão da fronteira
A mesma conta nas seis janelas do zoom. A dimensão sobe da janela inteira para as de dentro: 1,39, 1,51, 1,57, 1,68, 1,66 e 1,72. Na janela inteira, boa parte da fronteira é a linha quase reta da esquerda, que não é fractal, e puxa o número para perto de 1. Nas janelas de dentro, a fronteira é toda quebrada.
O artigo estima a dimensão como a mediana das estimativas de todos os mapas de um zoom. Aqui, a mediana das seis é 1,62. O artigo, com a tanh, o lote completo e dado aleatório, mede 1,66; com a ReLU, 1,20; numa rede linear, 1,17; com um exemplo só, 1,41; com lotes de 16, 1,55.
O número depende das janelas escolhidas à mão, dos tamanhos de caixa e da resolução, e a variação de uma janela para outra dá a ordem dessa incerteza: de 1,51 a 1,72 nas cinco janelas de dentro. O artigo usa outra ferramenta, a contagem de caixas da biblioteca PoreSpy, e 50 mapas por zoom. A fronteira dos múons tem dimensão perto de 1,6, entre a linha e a área. A diferença para o 1,66 do artigo, 0,04, é menor que a variação entre as janelas: os dois números são compatíveis, com outra rede e outros dados.
5. De onde vem
Slide 18: De onde vem
A conta repetida tem mais de cem anos. Em 1918, Gaston Julia publicou, aos 25 anos, o Mémoire sur l'itération des fonctions rationnelles, 199 páginas sobre o que acontece quando se repete uma conta como z² + c; Pierre Fatou trabalhou no mesmo problema, na mesma época. Sem computador, as figuras ficaram na imaginação.
Em 1975, Benoit Mandelbrot criou a palavra fractal. Em 1978, Robert Brooks e Peter Matelski definiram e desenharam pela primeira vez o conjunto que hoje leva o nome de Mandelbrot, num estudo de grupos de Klein. Em 1980, Mandelbrot obteve imagens de alta qualidade do conjunto no centro de pesquisa Thomas J. Watson, da IBM.
Em 9 de fevereiro de 2024, Jascha Sohl-Dickstein publicou no arXiv "The boundary of neural network trainability is fractal", três páginas: a fronteira entre as taxas que treinam e as que não treinam é fractal em todas as configurações que testou. A imagem do slide é a da figura 1 do artigo, a rede com a tanh e o lote completo, de dimensão 1,66, publicada com a licença CC BY 4.0.
O artigo também diz por que isso importa: as melhores taxas costumam ficar perto da borda da instabilidade, e quem as procura anda em cima de um fractal. É o que a aula 7 já tinha visto, com a melhor taxa logo antes da região em que o treino piora.
6. O projeto
Slide 19: O projeto: os dados do CMS
O projeto refaz o artigo com dados reais. A pergunta: com 72 eventos de dois múons do CMS no lugar do dado aleatório, a fronteira continua fractal, e qual é a dimensão dela?
A figura compara as duas janelas inteiras, com a mesma rede, os mesmos pesos iniciais e 256 por 256 treinos. À esquerda, entradas e alvos sorteados de uma normal, como no artigo; à direita, os 72 eventos. A paisagem é quase a mesma: o azul embaixo, o laranja em cima e embaixo à direita, a fronteira de cima perto de log₁₀ η₁ = 1,2 a 1,9. Com os múons, a região que diverge embaixo à direita começa um pouco mais acima, em η₁ perto de 0,1, e a de cima tem uma faixa mais clara acima de η₁ = 10⁵.
A resposta da primeira parte já está no zoom desta aula: com os múons, a fronteira é fractal até mil vezes de aumento, com dimensão perto de 1,6. O que falta ao projeto é ir mais fundo, com mais janelas e mais resolução, e medir a dimensão com cuidado.
Slide 20: O custo: cada pixel é um treino
Cada pixel é um treino de 100 passos, e o custo cresce com o número de pixels: dobrar o lado da imagem quadruplica a conta.
Medido no laptop do professor, com 16 processos: 128 por 128, 16.384 treinos, 3,6 segundos; 512 por 512, 262.144 treinos, 73 segundos. Com um processo só, como o projeto/varredura.py roda, 256 por 256 levou 85 segundos. A janela do tamanho do artigo, 4.096 por 4.096, tem 16.777.216 treinos: 64 vezes a de 512, perto de 78 minutos no mesmo laptop, uma estimativa pela proporção, não medida. O artigo fez uns 50 mapas desse tamanho para cada zoom.
O laptop do professor é bem mais forte que o dos alunos, e o tempo dele não vale para a turma. No laptop de cada um, a varredura fica em 128 por 128. As janelas grandes e o zoom fundo vão para o PC do laboratório, o Dell Aurora R15 com o Core i9-13900K e a GeForce RTX 4070 Ti, acessado pelo Chrome Remote Desktop.
Conta pesada não se repete à toa: cada mapa sai com um .npy, a imagem em números, e um .json com a semente, a janela, a resolução, o SHA-256 do arquivo de dados e o tempo. A figura se refaz do .npy, sem treinar.
Slide 21: O código
O código do projeto está em projeto/varredura.py, e o desta aula, em codigo/fractal.py, que só o chama.
perda_e_gradientes é a rede escrita para ser lida: a passada para a frente, a perda e a retropropagação da aula 5, para uma rede só. treinar faz a mesma conta para milhares de redes de uma vez, uma por par de taxas, reorganizada em multiplicações de matrizes grandes. medida resume cada treino num número, com a regra do notebook do artigo.
Antes de qualquer imagem, python projeto/varredura.py --conferir confere as duas versões: o gradiente bate com a derivada numérica, a diferença central da aula 4, até a décima casa, e um passo da versão rápida dá a mesma perda que a de leitura. Conta que não se confere não vira figura.
fractal.py reparte os pixels entre os núcleos do processador: cada processo treina um pedaço com a função treinar do projeto. O mapa de 256 por 256 que sai dele é igual, pixel a pixel, ao do projeto, feito com um processo só.
Slide 22: Cinco etapas, feitas pela turma inteira
O projeto se faz junto, pela turma inteira, em cinco etapas, uma depois da outra, como se trabalha no CERN.
A conferência da rede: rodar o --conferir, entender o que ele confere e saber explicar por que o gradiente da versão rápida é o mesmo da versão de leitura. Sem ela, nenhuma imagem vale.
A varredura: a janela inteira em 128 por 128 no laptop de cada um, e as janelas grandes no PC do laboratório, cada uma com o .json ao lado.
As imagens: as figuras finais, com os eixos em log₁₀ da taxa, a vírgula decimal, a legenda fora dos dados e as cores do curso, que se separam em cinza.
O zoom e a dimensão: a sequência de janelas na fronteira, mais funda que a desta aula, e a dimensão de cada uma pela contagem de caixas.
Os dados e a história: o que é o dimuon.csv, quais são os 72 eventos, o que é o CMS, o que o artigo fez e o que o projeto muda; é o fio da apresentação.
Cada etapa usa o que a anterior entregou, e todos passam por todas: na apresentação, qualquer um explica qualquer parte.
Slide 23: A apresentação da aula 10
A apresentação da aula 10 conta o projeto como um artigo curto, na ordem em que se lê um artigo.
A pergunta: a fronteira de treinabilidade continua fractal com dados do CMS, e qual é a dimensão dela? O método: a rede, os dados, o treino, a regra de convergência e as cores, com o suficiente para outra pessoa refazer. Os resultados: a janela inteira, o zoom e a dimensão, com o número e a incerteza dele. A comparação com o artigo: o que bate e o que não bate.
Os limites, ditos como tal: as janelas foram escolhidas à mão, e a dimensão depende dos tamanhos de caixa. Um resultado com o limite dito é mais forte que um sem.
E como refazer: o repositório, a semente, a versão dos dados e o comando de cada figura. Experimento que não se reproduz não existe.
7. Fechamento
Slide 24: Para estudar e entregar
O estudo da semana é a própria apresentação, e o artigo de Sohl-Dickstein, de três páginas, para a apresentação citar o método com as palavras dele. O texto do blog, do estudo da aula 8, mostra as imagens e os vídeos dos zooms.
A entrega, até 11/12: as imagens finais do projeto e a apresentação pronta, no repositório de cada um.
A seguir, a aula 10, a última: a apresentação do projeto e a revisão do curso inteiro, do neurônio da aula 1 ao fractal desta aula.
Perguntas que podem aparecer
- O fractal é só um problema? Não só. O artigo lembra que as melhores taxas ficam perto da borda da instabilidade, e quem procura a taxa mais rápida anda em cima da fronteira. Na prática, isso explica por que uma taxa boa às vezes falha com uma mudança pequena.
- Por que float64 e não float32? O artigo usa float64, e o zoom fundo pede: a janela do zoom do projeto, em 256 por 256 treinos, dá a mesma classe em 98,7% dos pixels nas duas precisões, e os que trocam estão quase todos em cima da fronteira, 80% deles. Mais fundo, as taxas vizinhas de uma janela ficam mais perto uma da outra que o float32 distingue, uns sete algarismos, e o mapa perde o sentido; o float64 distingue uns dezesseis.
- A dimensão 1,62 é a dimensão verdadeira? É uma estimativa com caixas de 2 a 16 pixels, em seis janelas de 512 por 512 escolhidas à mão. Outra escolha daria outro número perto deste.
- Os pontos isolados de uma cor no meio da outra são erro? Não: o treino é uma conta determinada, sem sorteio, e cada pixel foi calculado. Perto da fronteira, uma diferença minúscula na taxa muda o destino do treino.
- Por que a rede da aula 7 deu grãos e não filamentos? Porque, na faixa, a perda não se assenta: salta para dezenas nos primeiros passos e fica oscilando, e o mapa de um passo fixo pega cada treino num ponto da oscilação. Taxas vizinhas caem em classes diferentes sem ordem, e com mais passos o mapa continua granulado. O slide da rede da aula 7 no plano mostra as contas.
- Por que 72 eventos e não os 100 mil? Porque o artigo usa tantos exemplos quanto pesos, e o projeto refaz o artigo com dados reais. Com 100 mil, cada treino custaria mais de mil vezes mais.
Para estudar
O estudo da turma, que é também o seu:
- Preparar a apresentação da aula 10.
- Jascha Sohl-Dickstein, 2024, "The boundary of neural network trainability is fractal", arXiv:2402.06184, três páginas.
Além dele, para preparar a aula:
- Jascha Sohl-Dickstein, 2024, "Neural network training makes beautiful fractals", sohl-dickstein.github.io/2024/02/12/fractal.html, o texto do estudo da aula 8, com os vídeos dos zooms.
- O notebook do artigo, github.com/Sohl-Dickstein/fractal, de onde vêm a parametrização e a regra de convergência do projeto/varredura.py.
Fontes dos fatos citados
Só para conferência; o estudo é a lista de cima.
- Sohl-Dickstein, 2024, arXiv:2402.06184, versão 1 de 09/02/2024, licença CC BY 4.0, lido no HTML do arXiv: a rede de uma camada oculta com 16 neurônios, a parametrização de campo médio, 272 exemplos, 500 passos, float64, as cores, os zooms de uns 50 mapas de 4.096 por 4.096, cada um com o dobro do aumento, a dimensão como mediana pela contagem de caixas da PoreSpy, as dimensões 1,17, 1,20, 1,41, 1,55, 1,66 e 1,98, mais de dez ordens de grandeza, a regressão linear quando só a saída treina, as melhores taxas perto da borda da instabilidade. A figura do slide da história é a da rede com a tanh e o lote completo.
- Verbete "Mandelbrot set" da Wikipedia em inglês: Fatou e Julia no começo do século 20; Brooks e Matelski, 1978, grupos de Klein; Mandelbrot, 1980, o centro Thomas J. Watson da IBM.
- Verbete "Gaston Julia", revisão 1372414589: o Mémoire de 1918, 199 páginas, aos 25 anos, no Journal de Mathématiques Pures et Appliquées; Fatou.
- Verbete "Fractal", revisão 1383882391: a palavra criada por Mandelbrot em 1975, do latim frāctus, quebrado; os processos caóticos geram fractais como atratores ou como fronteiras entre bacias de atração.
- Os números: codigo/fractal.py, com a semente 0 e o dimuon.csv do registro 303, gravados em resultados/curvas.json, resolucoes.json, zoom.json e dimensao.json; codigo/plano_aula7.py, em resultados/plano-aula7.json; o tempo de 85 segundos de projeto/figuras/janela-muons.json.
