Study guide

Aula 4: derivadas parciais e o Jacobiano

  • WhenSexta, 13/11/2026, das 12h às 14h
  • WhereOn-line, no encontro 1

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.

  1. Revisão das aulas 2 e 3
  2. O Jacobiano
  3. A regra da cadeia com vetores
  4. De onde vem
  5. O código
  6. 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, JfJ,\ J_f J, J de f o Jacobiano: a matriz das derivadas parciais de cada saída em relação a cada entrada 6
∂hi∂xj\frac{\partial h_i}{\partial x_j} derivada parcial de h i em relação a x j o número na linha i, coluna j do Jacobiano 6
m×nm \times n m por n o tamanho de uma matriz: m linhas e n colunas 6
Δx⃗\Delta\vec{x} delta x um passo pequeno na entrada 6
tanh⁡(z)\tanh(z) tangente hiperbólica de z a ativação que vai de −1 a 1, com formato de S 8
tanh⁡′(z)\tanh'(z) tangente hiperbólica linha de z a inclinação da tanh, 1 − tanh²(z) 8
Δ\Delta delta o tamanho do passo numa entrada só, na derivada numérica 10
x⃗→ f u⃗\vec{x} \xrightarrow{\ f\ } \vec{u} f leva x a u a função f recebe o vetor x⃗\vec{x} e devolve o vetor u⃗\vec{u} 13
g∘fg \circ f g composta com f, g bola f f e depois g: a saída de f é a entrada de g 13
∇⃗x⃗L\vec{\nabla}_{\vec{x}} L gradiente de L em relação a x o gradiente da perda tomando a entrada como variável 14
 ⋅ ⏟1×2\underbrace{\ \cdot\ }_{1 \times 2} chave embaixo a dimensão do fator de cima 14
g⃗\vec{g} 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) e e[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? h⃗\vec{h} = ativação(W x⃗\vec{x} + b⃗\vec{b}): 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₁ x⃗\vec{x} + b⃗\vec{b}₁) + b⃗\vec{b}₂ = (W₂ W₁) x⃗\vec{x} + (W₂ b⃗\vec{b}₁ + b⃗\vec{b}₂), 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, ∇⃗\vec{\nabla}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(x⃗\vec{x}): 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 x⃗\vec{x}, um passo pequeno Δx⃗\vec{x} na entrada muda a saída de aproximadamente J Δx⃗\vec{x}. É 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, z⃗\vec{z} = W x⃗\vec{x} + b⃗\vec{b}. 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, h⃗\vec{h} = tanh(W x⃗\vec{x} + b⃗\vec{b}). 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), b⃗\vec{b} = (0; −1) e o ponto x⃗\vec{x} = (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 h⃗\vec{h}, e h⃗\vec{h} 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 x⃗\vec{x} 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 h⃗\vec{h}(x⃗\vec{x}): é 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 Δx⃗\vec{x} 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, (h⃗\vec{h}(x⃗\vec{x} + Δ eⱼ) − h⃗\vec{h}(x⃗\vec{x} − Δ 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 h⃗\vec{h}(x⃗\vec{x} + Δ) − h⃗\vec{h}(x⃗\vec{x} − Δ) 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 é x⃗\vec{x} = (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 x⃗\vec{x} a u⃗\vec{u}, e g leva u⃗\vec{u} a y⃗\vec{y}, o Jacobiano da composição g ∘ f, f e depois g, é o produto dos Jacobianos, J_g ∘ f(x⃗\vec{x}) = J_g(f(x⃗\vec{x})) J_f(x⃗\vec{x}). O ∘ se lê composta com, ou bola. O J_g se calcula no ponto f(x⃗\vec{x}), por onde a conta passa, e não em x⃗\vec{x}. A ordem importa: o Jacobiano da última função vem primeiro, à esquerda.

De onde vem: um passo Δx⃗\vec{x} muda u⃗\vec{u} de aproximadamente J_f Δx⃗\vec{x}; essa mudança de u⃗\vec{u} muda y⃗\vec{y} de aproximadamente J_g (J_f Δx⃗\vec{x}) = (J_g J_f) Δx⃗\vec{x}, 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 b⃗\vec{b}₂ = (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, x⃗\vec{x} passa pelas duas camadas com tanh, h⃗\vec{h}₁ e h⃗\vec{h}₂; depois pela saída linear, y = v⃗\vec{v} · h⃗\vec{h}₂ + c, com v⃗\vec{v} = (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 h⃗\vec{h}₂, a linha v⃗\vec{v}; 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 x⃗\vec{x}, 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, g⃗\vec{g} é 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 g⃗\vec{g} tem 4, e cada Jacobiano, 16.

De trás para a frente, em cima: g⃗\vec{g} 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 g⃗\vec{g}, 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 Δx⃗\vec{x} 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:

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.