Material de estudo para acompanhar os slides.
O objetivo da aula é saber dizer o que o Jacobiano guarda, calcular à mão o de uma camada com tanh e conferir com a derivada numérica, aplicar a regra da cadeia com vetores a duas camadas e explicar por que o produto dos Jacobianos se calcula de trás para a frente.
Os tópicos
Sem horário marcado: o que não couber hoje entra na aula seguinte.
- Revisão das aulas 2 e 3
- O Jacobiano
- A regra da cadeia com vetores
- De onde vem
- O código
- Fechamento
Notação
Os símbolos novos dos slides, na ordem em que aparecem. Cada um também é definido na nota do slide em que aparece primeiro; os das aulas anteriores estão nos roteiros delas.
| Símbolo | Lê-se | Quer dizer | Slide |
|---|---|---|---|
| J, J de f | o Jacobiano: a matriz das derivadas parciais de cada saída em relação a cada entrada | 6 | |
| derivada parcial de h i em relação a x j | o número na linha i, coluna j do Jacobiano | 6 | |
| m por n | o tamanho de uma matriz: m linhas e n colunas | 6 | |
| delta x | um passo pequeno na entrada | 6 | |
| tangente hiperbólica de z | a ativação que vai de −1 a 1, com formato de S | 8 | |
| tangente hiperbólica linha de z | a inclinação da tanh, 1 − tanh²(z) | 8 | |
| delta | o tamanho do passo numa entrada só, na derivada numérica | 10 | |
| f leva x a u | a função f recebe o vetor e devolve o vetor | 13 | |
| g composta com f, g bola f | f e depois g: a saída de f é a entrada de g | 13 | |
| gradiente de L em relação a x | o gradiente da perda tomando a entrada como variável | 14 | |
| chave embaixo | a dimensão do fator de cima | 14 | |
| g | a linha da derivada da perda em relação à saída da última camada | 15 |
No NumPy, estas peças resolvem quase tudo:
np.tanh(W @ x + b): a camada com a tangente hiperbólica.(1 - h**2)[:, None] * W: o Jacobiano da camada;[:, None]transforma o vetor numa coluna, e o NumPy multiplica cada linha de W pelo número correspondente.np.zeros_like(x)ee[j] = h: o passo de tamanho h só na entrada j, para a derivada numérica.np.column_stack(colunas): a matriz a partir das colunas.linha @ J: uma linha vezes uma matriz, o passo de trás para a frente.np.abs(A - B).max(): a maior diferença entre duas matrizes que deviam ser iguais.
1. Revisão das aulas 2 e 3
Slide 1: A capa
A aula 4 trata do Jacobiano: a tabela das derivadas parciais de uma função que recebe um vetor e devolve outro, como uma camada de rede neural. Com ele, a regra da cadeia da aula 2 ganha vetores: o Jacobiano de duas camadas seguidas é o produto dos Jacobianos das duas. A rede inteira é uma cadeia de camadas que termina na perda, e o gradiente da perda é o produto de todos os Jacobianos, calculado de trás para a frente. É a conta que a aula 5, a retropropagação, faz camada por camada.
A imagem da capa é uma grade regular do plano das entradas, com retas de −3 a 3 a cada 0,25, levada pela camada do exemplo da aula, a da tanh. Cada reta vira uma curva no plano das saídas, que fica entre −1 e 1 nos dois eixos. Perto das bordas, onde a tanh se achata, as curvas se apertam: a camada estica o meio e espreme as bordas. O Jacobiano é a conta que diz quanto ela estica ou espreme perto de cada ponto. O retrato de Jacobi está no slide da história.
Slide 2: Revisão, de memória
A revisão é de memória: quatro perguntas sobre as aulas 2 e 3, e a turma responde falando.
O que uma camada calcula, escrita como matriz? = ativação(W + ): cada linha de W guarda os pesos de um neurônio e faz o produto escalar com as entradas; a ativação vale para cada posição.
Por que duas camadas lineares valem uma? Porque W₂ (W₁ + ₁) + ₂ = (W₂ W₁) + (W₂ ₁ + ₂), a forma de uma camada só; por isso a camada oculta precisa de uma ativação que não seja linear.
O que é a derivada parcial? A derivada de uma função de várias variáveis em relação a uma delas, com as outras paradas: na aula 2, o corte da superfície da perda por um plano.
Para onde aponta o gradiente? Para onde a função mais cresce. Ele junta as derivadas parciais num vetor, e o gradiente descendente anda contra ele.
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.
Na aula 1, um neurônio desenha uma reta, e nenhuma reta separa o XOR. Na aula 2, o gradiente descendente acha os pesos de um neurônio, e a taxa de aprendizado tem um limiar. Na aula 3, duas camadas separam o XOR, com pesos escolhidos à mão. Nesta aula, a 4, a regra da cadeia ganha vetores, uma camada de cada vez: é a ferramenta que falta para calcular a derivada da perda em relação aos pesos de uma rede com camadas. Na aula 5, a retropropagação usa essa conta, de trás para a frente, e acha os pesos do XOR sozinha.
Depois, a mesma ideia cresce: o MNIST, na aula 6; o PyTorch, na 7; os dados do CERN, na 8; e o projeto, nas aulas 9 e 10, em que o limiar da taxa da aula 2 volta, com uma taxa por camada.
Slide 4: Da aula 2: derivada parcial e gradiente
Duas ideias da aula 2 voltam aqui.
A derivada parcial de uma função f de várias variáveis em relação a uma delas, xⱼ, é a derivada que se obtém com as outras paradas: ∂f/∂xⱼ. Na aula 2, era a inclinação do corte da superfície da perda por um plano vertical.
O gradiente junta as derivadas parciais num vetor, f = (∂f/∂x₁; ∂f/∂x₂), e aponta para onde f mais cresce. A figura aplica a ideia a uma função nova, a perda da rede desta aula em função das duas entradas, L(): as curvas de nível e o gradiente em vários pontos, sempre em ângulo reto com as curvas. A seta laranja é o gradiente no ponto (1; 0,25), (1,0940; −4,6074), que a aula calcula no fim pela regra da cadeia; as cinza têm todas o mesmo tamanho, porque só a direção importa aqui.
A derivada numérica confere qualquer derivada parcial sem fórmula: mexe só a variável j, h para cima e h para baixo, e divide a variação da função por 2h. É assim que esta aula confere o Jacobiano.
Até aqui, a função devolvia um número só, a perda. Uma camada devolve um vetor, e é aí que entra o Jacobiano.
2. O Jacobiano
Slide 5: E quando a saída é um vetor?
Uma camada recebe um vetor e devolve outro. Na rede do XOR, a camada oculta recebe duas entradas e devolve duas saídas, e cada saída depende das duas entradas. São quatro derivadas parciais: a da saída 1 em relação à entrada 1, a da saída 1 em relação à entrada 2, e as duas da saída 2. Com m saídas e n entradas, são m vezes n. A pergunta é como organizar essas derivadas, e como elas se combinam quando uma camada vem depois da outra.
Slide 6: O Jacobiano
O Jacobiano de uma função que recebe n números e devolve m números é a matriz m por n das derivadas parciais de cada saída em relação a cada entrada. A linha i guarda as derivadas da saída i, uma por entrada; a coluna j guarda o efeito da entrada j, uma derivada por saída. Para a camada de duas entradas e duas saídas, J tem quatro números: ∂h₁/∂x₁ e ∂h₁/∂x₂ na primeira linha, ∂h₂/∂x₁ e ∂h₂/∂x₂ na segunda.
O que ele quer dizer: perto de um ponto , um passo pequeno Δ na entrada muda a saída de aproximadamente J Δ. É a derivada da aula 2 em versão de vetores: lá, a variação da saída era a derivada vezes a variação da entrada; aqui, é a matriz vezes o vetor da variação. Por isso se diz que J é a melhor aproximação linear da função perto do ponto.
Com uma saída só, m = 1, o Jacobiano é uma linha com as derivadas parciais: o gradiente, escrito deitado. Alguns livros definem o Jacobiano transposto, com as linhas e as colunas trocadas; o curso usa uma linha por saída, como a Wikipedia.
Slide 7: O Jacobiano de uma camada linear
O caso mais simples é uma camada sem ativação, = W + . A saída k é zₖ = Σⱼ wₖⱼ xⱼ + bₖ, uma soma em que cada entrada aparece multiplicada por um peso. A derivada parcial de zₖ em relação a xⱼ é wₖⱼ: as outras entradas e o viés ficam parados, e a derivada de wₖⱼ xⱼ em relação a xⱼ é wₖⱼ, pela regra de c·w da aula 2. Então o Jacobiano da camada linear é a própria matriz W, em qualquer ponto.
É a versão em vetores de um fato da aula 2: a derivada da reta y = w x + b é w. Uma função linear tem a mesma inclinação em todo lugar, e a melhor aproximação linear dela é ela mesma.
Slide 8: A tangente hiperbólica
A tangente hiperbólica, tanh, é a função de ativação desta aula e do projeto, na aula 9. A fórmula é tanh(z) = (eᶻ − e⁻ᶻ)/(eᶻ + e⁻ᶻ): ela vai de −1 a 1, passa por 0 em z = 0 e tem o formato de S da sigmoide da aula 3, só que centrado no zero.
A inclinação dela sai dela mesma: tanh′(z) = 1 − tanh²(z). Vale 1 em z = 0 e some longe do zero, como a da sigmoide. A conta dessa derivada fica como caixa-preta: entra z, sai a inclinação, e ela não se abre agora porque pede a derivada da exponencial; o código a confere com a derivada numérica.
No gráfico da direita, o ponto laranja marca z = 0,75, a soma de um dos neurônios do exemplo, e a inclinação ali, 1 − tanh²(0,75) = 0,5966.
Slide 9: O Jacobiano de uma camada com tanh
Agora a camada com a ativação, = tanh(W + ). A saída k é hₖ = tanh(zₖ), uma função dentro de outra, e a regra da cadeia de um número só, da aula 2, dá ∂hₖ/∂xⱼ = tanh′(zₖ) · wₖⱼ = (1 − hₖ²) wₖⱼ. Então a linha k do Jacobiano é a linha k de W multiplicada por um número só, 1 − hₖ², a inclinação da tanh no neurônio k.
O exemplo usa W com as linhas (1; −1) e (0,5; 2), = (0; −1) e o ponto = (1; 0,25). As somas são z₁ = 0,75 e z₂ = 0; as saídas, h₁ = 0,6351 e h₂ = 0; as inclinações, 0,5966 e 1. A primeira linha de J é (1; −1) vezes 0,5966; a segunda é a própria linha (0,5; 2), porque em z = 0 a inclinação da tanh é 1. O código confere com a derivada numérica: as duas contas diferem em 7 · 10⁻¹¹.
Diferente da camada linear, o Jacobiano da camada com tanh muda de ponto para ponto: depende de , e depende de onde a entrada está.
Slide 10: O Jacobiano coluna a coluna, em vídeo
O vídeo monta o Jacobiano da camada do exemplo sem fórmula nenhuma, só mexendo nas entradas. É a derivada numérica da aula 2, com vetores, e é a conta que a entrega pede.
Primeiro, só a entrada x₁ se mexe: os dois pontos azuis, à esquerda, são com x₁ trocado por x₁ + Δ e por x₁ − Δ, e x₂ parado. A camada leva os dois a dois pontos do plano das saídas, à direita. A variação da saída, dividida por 2Δ, é a seta azul, desenhada a partir de (): é a coluna 1 de J, o efeito da entrada 1 nas duas saídas. Dividir por 2Δ, e não por Δ, é a diferença central da aula 2: um passo para cada lado.
O Δ encolhe, de 0,5 para 0,25, 0,05 e 0,001, e a coluna chega a (0,5966; 0,5000). Depois, a mesma coisa com x₂, em laranja: com Δ = 0,5, a coluna sai (−0,6034; 1,5232); com 0,001, (−0,5966; 2,0000). A seta laranja cresce até 2, porque perto de z₂ = 0 a tanh é quase uma reta de inclinação 1, e o peso w₂₂ vale 2.
No fim, as duas colunas lado a lado formam J, a mesma matriz da conta à mão do slide anterior.
O Δ do vídeo é o passo numa entrada só; o Δ do slide do Jacobiano é um passo num vetor inteiro.
Slide 11: O passo encolhe, e a coluna chega à conta
A tabela do vídeo, com os números todos. Cada linha é um tamanho de passo Δ; as colunas são as duas colunas do Jacobiano pela diferença central, (( + Δ eⱼ) − ( − Δ eⱼ))/(2Δ), em que eⱼ quer dizer mexer só a entrada j.
Com Δ = 0,5, a coluna 2 sai 1,5232 no lugar de 2: o passo é grande, e a tanh já curvou. Com Δ = 0,25, 1,8485; com 0,05, 1,9934; com 0,001, 2,0000 até a quarta casa. A coluna 1 erra menos com passo grande, porque ali a curva da tanh pesa menos: 0,6034 contra 0,5966.
A conta à mão, na última linha, é (1 − hₖ²) vezes a linha k de W: (0,5966; −0,5966) e (0,5; 2). O código usa Δ = 10⁻⁶, um milionésimo, e a diferença entre as duas contas é de 7 · 10⁻¹¹.
Por que não usar Δ cada vez menor, até zero? Porque o computador guarda os números com umas 16 casas: com Δ pequeno demais, a diferença ( + Δ) − ( − Δ) perde as casas que importam. Neste exemplo, a maior diferença para a conta à mão é 3 · 10⁻⁴ com Δ = 10⁻², 7 · 10⁻¹¹ com 10⁻⁶, a menor, e volta a crescer: 5 · 10⁻⁵ com 10⁻¹² e 6 · 10⁻³ com 10⁻¹⁴.
Na entrega, a tabela é a mesma ideia: o Jacobiano numérico contra o à mão, e a maior diferença entre os dois.
Slide 12: Perto do ponto, a camada age como J
O vídeo mostra o que quer dizer melhor aproximação linear. À esquerda, o plano das entradas, com uma grade de passo 0,25; à direita, o plano das saídas da camada do exemplo. A camada leva a grade reta a uma grade curva, apertada perto das bordas, onde a tanh se achata em −1 e 1.
O ponto laranja é = (1; 0,25), e o quadradinho em volta dele tem lado 0,25. A camada leva o quadradinho a uma figura curva, em laranja, à direita. O paralelogramo tracejado, em azul, é o mesmo quadradinho levado pela matriz J, a partir do ponto de saída: os lados dele são as colunas de J vezes 0,25.
De longe, as duas figuras parecem iguais; a câmera chega perto, e elas quase coincidem. É a mesma ideia da derivada no vídeo da aula 2, em que a curva vista de perto virava reta: aqui, a camada vista de perto vira uma matriz. Quanto menor o quadradinho, mais as duas figuras coincidem.
3. A regra da cadeia com vetores
Slide 13: A regra da cadeia com vetores
A regra da cadeia com vetores: se f leva a , e g leva a , o Jacobiano da composição g ∘ f, f e depois g, é o produto dos Jacobianos, J_g ∘ f() = J_g(f()) J_f(). O ∘ se lê composta com, ou bola. O J_g se calcula no ponto f(), por onde a conta passa, e não em . A ordem importa: o Jacobiano da última função vem primeiro, à esquerda.
De onde vem: um passo Δ muda de aproximadamente J_f Δ; essa mudança de muda de aproximadamente J_g (J_f Δ) = (J_g J_f) Δ, pela associatividade da aula 3. A aproximação linear da composição é o produto das duas. Com um número só em cada passo, é a regra da cadeia da aula 2, em que as taxas se multiplicavam.
A regra das dimensões confere: J_g é m por k, J_f é k por n, e o produto é m por n, o tamanho certo para uma função que leva n números a m números.
No exemplo, a segunda camada tem W₂ com as linhas (2; 1) e (−1; 1) e ₂ = (0; 0,5). O produto J₂ J₁ e o Jacobiano numérico da composição dão a mesma matriz, com diferença de 1 · 10⁻¹⁰.
Slide 14: Até a perda, o gradiente é uma linha
Uma rede é uma cadeia de camadas, e a última peça é a perda, que devolve um número só. No exemplo, passa pelas duas camadas com tanh, ₁ e ₂; depois pela saída linear, y = · ₂ + c, com = (1; −1) e c = 0; e pela perda de um exemplo, L = (y − t)², com t = 0.
Pela regra da cadeia, o Jacobiano da rede inteira é o produto dos Jacobianos de cada peça: o de L em relação a y, um número, 2(y − t); o de y em relação a ₂, a linha ; e os das duas camadas, J₂ e J₁. As dimensões, embaixo de cada um, são 1 por 1, 1 por 2, 2 por 2 e 2 por 2, e o produto dá 1 por 2: uma linha, o gradiente da perda em relação à entrada.
Os números: L = 0,9766, e o gradiente é (1,0940; −4,6074), o mesmo pela cadeia e pela derivada numérica, com diferença de 1,4 · 10⁻¹⁰.
Aqui o gradiente é em relação à entrada , para a conta ficar com poucos números. O treino precisa do gradiente em relação aos pesos, e a aula 5 mostra que a mesma linha, parada em cada camada, dá as derivadas dos pesos daquela camada.
Slide 15: De trás para a frente custa menos
O produto dos Jacobianos dá o mesmo em qualquer ordem, pela associatividade, mas o custo não é o mesmo. Começando pela perda, de trás para a frente, o primeiro fator é uma linha: linha vezes matriz dá outra linha, e cada passo é uma linha vezes uma matriz, m² multiplicações, com m neurônios por camada. Começando pela entrada, da frente para trás, os fatores são matrizes: matriz vezes matriz, m³ multiplicações por passo, e só no fim a linha.
No slide, é a linha da derivada da perda em relação à saída da última camada, 1 por m, e J₁, J₂ e J₃ são os Jacobianos das três camadas, m por m. Os parênteses mostram o que se multiplica primeiro.
Com 3 camadas de largura m, de trás para a frente são 3m² multiplicações, e da frente para trás, 2m³ + m². Com m = 1.000, 3 milhões contra 2 bilhões. A figura mostra as duas contas em escala logarítmica nos dois eixos, em que cada marca vale dez vezes a anterior: a diferença cresce com a largura. O código confere que as duas ordens dão o mesmo gradiente, com matrizes sorteadas: diferença de 9 · 10⁻¹⁶.
A passada para a frente da rede também custa m² por camada, uma matriz vezes um vetor. Que o gradiente de trás para a frente custe da mesma ordem que a passada para a frente é dedução desta contagem, e é o que a literatura chama de princípio do gradiente barato: Griewank, em 2012, mostra que o gradiente de uma função de um número só sai por um múltiplo pequeno do custo da própria função, qualquer que seja o número de variáveis. A derivada numérica, ao contrário, custa duas avaliações da função por variável.
Slide 16: As duas ordens, conta a conta, em vídeo
O vídeo conta as multiplicações do slide anterior, com 4 neurônios por camada e três camadas. Cada quadradinho é um número: a linha tem 4, e cada Jacobiano, 16.
De trás para a frente, em cima: vezes J₃ dá outra linha de 4 números, e cada um deles é uma soma de 4 produtos, 16 multiplicações. A linha engole J₂, mais 16, e J₁, mais 16: 48, e sai o gradiente, uma linha.
Da frente para trás, embaixo: J₂ vezes J₁ dá uma matriz de 16 números, cada um uma soma de 4 produtos, 64 multiplicações. J₃ vezes essa matriz, mais 64. Só no fim entra , mais 16: 144, e o mesmo gradiente.
A diferença cresce com a largura: com m neurônios, de trás para a frente custa 3m² e da frente para trás, 2m³ + m². Com 100 neurônios, 30.000 contra 2.010.000, a tabela que o jacobiano.py imprime. A retropropagação, da aula 5, é a ordem barata.
Slide 17: A retropropagação é esse produto
Esta é a ponte para a aula 5. A retropropagação é a regra da cadeia com vetores, calculada de trás para a frente: uma linha vezes uma matriz, camada por camada, começando pela perda.
A linha que volta pela rede, a derivada da perda em relação à saída de cada camada, é o que a aula 5 chama de δ, delta, quando a derivada é em relação à soma de cada neurônio. E a derivada de cada peso sai dessa linha com uma multiplicação a mais, pela entrada que o peso multiplica.
4. De onde vem
Slide 18: De onde vem
Quatro datas.
1676: a regra da cadeia parece ter sido usada primeiro por Gottfried Wilhelm Leibniz, numa memória de 1676, para derivar a raiz quadrada de a + bz + cz² como uma função dentro de outra, com um erro de sinal na conta. A notação comum da regra também é dele. A palavra parece é da fonte, a Wikipedia, que a apoia num estudo de 1917 dos manuscritos de Leibniz.
1841: Carl Gustav Jacob Jacobi publicou, no volume 22 do Journal für die reine und angewandte Mathematik, o Jornal de Matemática Pura e Aplicada, "De determinantibus functionalibus", sobre os determinantes funcionais: o determinante da matriz das derivadas parciais de n funções de n variáveis, que hoje se chama jacobiano. A matriz e o determinante levam o nome dele. O determinante fica de fora do curso: aqui só a matriz importa.
1970: Seppo Linnainmaa publicou, na dissertação de mestrado na Universidade de Helsinque, o modo reverso da diferenciação automática, a conta de trás para a frente para qualquer cadeia de funções, e não só para redes. A Wikipedia registra também um artigo dele de 1976 sobre o mesmo método. A retropropagação das redes neurais é um caso particular do modo reverso.
1983: Baur e Strassen mostraram, segundo Griewank, que o gradiente custa um múltiplo pequeno do custo da função; é o resultado que Griewank, em 2012, chama de princípio do gradiente barato. O artigo de Baur e Strassen foi conferido pelo texto de Griewank, e não aberto.
O retrato, à direita, é de Carl Gustav Jacob Jacobi, matemático alemão, de 1804 a 1851, pintado por August Kaselowsky em 1843 e reproduzido num livro de 1904 sobre ele, de Leo Koenigsberger. Está no Wikimedia Commons, em domínio público. O nome Jacobiano é uma homenagem a ele.
5. O código
Slide 19: O código
O código da aula fica pronto e testado antes: codigo/jacobiano.py, a solução de referência da entrega, que não vai para a turma antes do prazo.
Os passos dele são: a camada com a tanh; o Jacobiano à mão, a linha k de W vezes 1 − hₖ²; o Jacobiano numérico, uma coluna por entrada, mexendo só aquela entrada, h para cima e h para baixo; a comparação das duas matrizes; a regra da cadeia para duas camadas, o produto J₂ J₁ contra o numérico da composição; e a contagem das multiplicações nas duas ordens.
Quatro peças do NumPy resolvem quase tudo. np.tanh(W @ x + b) é a camada. (1 - h**2)[:, None] * W multiplica cada linha de W pelo seu número: o [:, None] transforma o vetor 1 − h² numa coluna, e o NumPy multiplica cada linha pelo número correspondente. np.column_stack(colunas) monta a matriz a partir das colunas do Jacobiano numérico. E linha @ J é uma linha vezes uma matriz, o passo de trás para a frente.
Slide 20: O que a entrega pede
A entrega é uma função que calcula o Jacobiano numérico de uma camada e o compara com o calculado à mão. O slide mostra as duas matrizes do exemplo de referência, à mão e numérica: iguais até a quarta casa, com diferença de 7 · 10⁻¹¹.
O que conferir antes de entregar: a matriz numérica tem m linhas e n colunas, uma linha por saída; a diferença para a matriz à mão é pequena, perto de 10⁻¹⁰, com h = 10⁻⁶; e, num ponto em que a soma de um neurônio é zero, a linha dele no Jacobiano é a própria linha de W. Cada um escolhe a própria camada e o próprio ponto, e os números não precisam bater com os do slide.
O que se pede é saber dizer o que entra, o que a matriz guarda e o que significa cada número dela.
6. Fechamento
Slide 21: Para estudar e entregar
O estudo prepara a retropropagação. Os capítulos 3 e 4 da série sobre redes neurais do 3Blue1Brown, "Backpropagation, intuitively" e "Backpropagation calculus", de 2017, com legenda e dublagem em português: o 3 mostra a ideia, e o 4, a mesma ideia com a regra da cadeia. E o capítulo 2 do livro de Michael Nielsen, "How the backpropagation algorithm works", que escreve a retropropagação com matrizes, a conta desta aula.
A entrega: a função do Jacobiano numérico de uma camada, comparada com o calculado à mão, e uma pergunta sobre o estudo.
A seguir, a aula 5 faz a conta de trás para a frente na rede do XOR e acha os nove pesos sozinha; a aula 6 leva a mesma conta a um MLP no MNIST, com 70 mil dígitos escritos à mão.
Perguntas que podem aparecer
- Por que o Jacobiano tem uma linha por saída, e não por entrada? É uma convenção, a da Wikipedia e da maior parte dos livros de cálculo; alguns autores usam a transposta. Com uma linha por saída, J Δ dá a mudança da saída, e o produto da regra da cadeia sai na ordem em que as funções são aplicadas, da última à primeira.
- Por que o gradiente aparece como linha, se na aula 2 era um vetor? É o mesmo vetor, deitado: o Jacobiano de uma função com uma saída só tem uma linha. Para andar contra o gradiente, só os números importam.
- Se o produto dá o mesmo em qualquer ordem, por que importa a ordem? Pelo custo: de trás para a frente, cada passo é uma linha vezes uma matriz; da frente para trás, matriz vezes matriz. Com mil neurônios por camada, a diferença é de centenas de vezes.
- E se a rede tiver muitas saídas e poucas entradas? Aí a ordem da frente para trás é a mais barata: começa por uma matriz com poucas colunas. O treino tem uma saída só, a perda, e por isso usa a de trás para a frente.
- Para que o determinante do Jacobiano? Ele mede quanto a função estica ou encolhe as áreas, e aparece na mudança de variáveis das integrais. O curso não usa: aqui só a matriz importa.
Para estudar
O estudo da turma, que é também o seu:
- 3Blue1Brown, série sobre redes neurais, capítulo 3, "Backpropagation, intuitively", 2017, youtube.com/watch?v=Ilg3gGewQ5U. Tem legenda e dublagem em português.
- 3Blue1Brown, série sobre redes neurais, capítulo 4, "Backpropagation calculus", 2017, youtube.com/watch?v=tIeHLnjs5U8. Tem legenda e dublagem em português.
- Michael Nielsen, 2015, Neural Networks and Deep Learning, capítulo 2, "How the backpropagation algorithm works": http://neuralnetworksanddeeplearning.com/chap2.html, com http, porque o endereço com https não abre.
Além dele, para preparar a aula:
- Wikipedia em inglês, "Jacobian matrix and determinant", as seções "Definition" e "Jacobian matrix": a definição, a melhor aproximação linear e a regra da cadeia.
- Andreas Griewank, 2012, "Who invented the reverse mode of differentiation?", Documenta Mathematica, volume extra ISMP, 389-400: a história do modo reverso e o princípio do gradiente barato, em doze páginas.
Fontes dos fatos citados
Só para conferência; o estudo é a lista de cima.
- Verbete "Jacobian matrix and determinant" da Wikipedia em inglês: a definição m por n, com a entrada (i, j) igual a ∂fᵢ/∂xⱼ; a melhor aproximação linear; a regra da cadeia J_g∘f(x) = J_g(f(x)) J_f(x); a nota de que alguns autores definem a transposta; o nome em homenagem a Jacobi.
- Verbete "Carl Gustav Jacob Jacobi" da Wikipedia em inglês: as datas, 1804 e 1851. C. G. J. Jacobi, 1841, "De determinantibus functionalibus", Journal für die reine und angewandte Mathematik 22:319-359, doi:10.1515/crll.1841.22.319, pelo registro do Crossref e do Mathdoc.
- Verbete "Chain rule" da Wikipedia em inglês, seção History: Leibniz, a memória de 1676, o erro de sinal e a notação.
- Verbete "Automatic differentiation" da Wikipedia em inglês: o modo direto e o reverso, a retropropagação como caso particular do reverso e o artigo de 1976 de Linnainmaa. Verbete "Backpropagation", seção History, a mesma revisão de 24/10/2026 conferida na aula 5: a dissertação de mestrado de 1970, na Universidade de Helsinque.
- Andreas Griewank, 2012, "Who invented the reverse mode of differentiation?", Documenta Mathematica, volume extra ISMP, 389-400: Baur e Strassen, 1983, e o princípio do gradiente barato.
- Verbete "Hyperbolic functions" da Wikipedia em inglês: a fórmula da tanh e a derivada 1 − tanh². Verbete "Activation function": o intervalo de −1 a 1.
- Wikimedia Commons, a página do arquivo "Carl Gustav Jacob Jacobi portrait 1843.jpg": August Kaselowsky, 1843, reproduzido em Leo Koenigsberger, 1904, domínio público.
- Os números: codigo/jacobiano.py, com a camada, o ponto e a segunda camada das constantes do arquivo, e a semente 4 na conferência das duas ordens.
