Backpropagation passo a passo

Da regra da cadeia no grafo ao treino de uma MLP ao vivo

Cinco visualizações que acompanham os slides. Primeiro o backward pass passo a passo: o forward e o backward executados no grafo computacional do exemplo calculado a mão na aula (θ(1) = −0.5, θ(2) = 0.5, X1 = 1, y = 1), o mesmo algoritmo em forma vetorizada com as matrizes do exemplo 2-3-1 dos slides, e os gradientes de uma MLP 2-2-1 calculados ao vivo. Depois o algoritmo em ação: uma MLP de duas entradas treinada aqui mesmo, em JavaScript, com a fronteira de decisão se dobrando enquanto a loss cai, e os mapas de ativação que revelam o que cada neurônio escondido aprende. Notação dos slides: pré-ativação z(l), ativação a(l) = σ(z(l)), custo J(θ) = ½(y − ŷ)², delta δ(l) = ∂J/∂z(l).

1 · Forward e backward passo a passo no grafo

A rede dos slides tem 2 camadas com 1 neurônio cada, sem bias: ŷ = a(2) = σ(σ(X1·θ(1))·θ(2)) com custo J(θ) = ½(y − ŷ)². Avance os passos: primeiro o forward pass preenche os nós da esquerda para a direita, depois o backward pass percorre as arestas de volta, multiplicando as derivadas locais (regra da cadeia) até chegar em θ(2) e θ(1). Os valores iniciais são exatamente os do exemplo da aula, então cada número da animação aparece também nos slides.

passo 0/11

Grafo computacional de J(θ) = ½(y − ŷ)². Verde: valores do forward; laranja: derivadas locais das arestas; rosa: gradientes acumulados ∂J/∂(nó).

💡 Deixe θ(2) perto de 0 e avance até o fim: o gradiente ∂J/∂θ(1) quase desaparece, pois o erro precisa atravessar θ(2) para chegar à camada 1. Esse é o mesmo mecanismo do gradiente que some em redes profundas.

2 · Backpropagation vetorizada passo a passo

O mesmo algoritmo da seção 1, agora em forma matricial, com a rede do exemplo vetorizado da aula: 2 entradas, 3 unidades ocultas e 1 saída, sem bias, sigmoide nas duas camadas. A rede processa um batch de 2 exemplos de uma vez, cada linha de X é um exemplo e J = ½Σ(y − ŷ)² soma o erro do batch. Na convenção dos slides, θij(l) conecta a entrada j à saída i, então o forward usa Z(1) = X·θ(1)ᵀ e Z(2) = A(1)·θ(2)ᵀ. A cada passo, as matrizes usadas ganham borda roxa e a recém-calculada recebe o destaque mais forte; a linha de equação abaixo mostra a conta de um elemento com os números atuais.

passo 0/9

💡 Compare com a seção 1: δ(2) e δ(1) são os mesmos produtos acumulados da regra da cadeia, agora calculados para uma camada inteira (e para o batch inteiro) de uma vez. No passo de δ(1), multiplicar por θ(2) faz o papel da aresta a(1) → z(2) do grafo: é por ela que o erro da saída volta para a camada 1. E cada gradiente continua sendo delta vezes a entrada da camada: ∂J/∂θ(2) usa A(1) e ∂J/∂θ(1) usa X.

3 · Gradientes numa MLP 2-2-1 ao vivo

Agora uma rede um pouco maior, no espírito do exemplo vetorizado da aula: 2 entradas, 2 unidades ocultas com sigmoide e 1 saída, sem bias. A entrada padrão é o primeiro exemplo do dataset dos slides (x = [0.5, 0.1], y = 0.6). Na aba Ativações, cada conexão mostra seu peso θij(l) e cada nó sua ativação. Na aba Gradientes, as mesmas conexões mostram ∂J/∂θij(l) = δi(l)·aj(l−1) e os nós mostram seus deltas. Tudo é recalculado analiticamente a cada movimento dos sliders.

MLP 2-2-1 sem bias, ativação sigmoide. Espessura ∝ |valor da aresta|; ciano/laranja: peso positivo/negativo; roxo/rosa: gradiente positivo/negativo.

💡 Aplique alguns passos de gradiente seguidos e observe J cair a cada clique enquanto as setas da aba Gradientes afinam. Depois empurre x1 e x2 para os extremos: a sigmoide satura, a(1)(1−a(1)) fica perto de zero e os gradientes da camada 1 quase desaparecem.

4 · Treine uma MLP na fronteira de decisão

Classificação binária em 2D: a rede recebe (x₁, x₂), produz ŷ = σ(z(L)) e minimiza a entropia cruzada binária por descida de gradiente em batch completo, sem nenhum truque além do próprio backpropagation. Os pesos iniciais são pequenos valores gaussianos sorteados com semente fixa (nada de esquemas sofisticados de inicialização aqui). Escolha o dataset, a arquitetura, a ativação e a taxa de aprendizado η, e observe a fronteira se dobrar enquanto a loss cai.

épocas: 0 · loss: — · acurácia: —

Fronteira de decisão ŷ(x₁, x₂) com os dados por cima (ciano: classe 0, laranja: classe 1)

Loss J(θ) por época, escala log. O tracejado em ln 2 é o nível do chute aleatório.

💡 Tente o XOR com 1 camada de 4 neurônios e depois com 2 camadas: a mesma quantidade de épocas produz fronteiras bem diferentes. Suba η ao máximo com ReLU e veja a loss oscilar. E lembre da aula de perceptron: sem camada escondida, nenhuma dessas fronteiras curvas seria possível, um neurônio sozinho só traça retas.

5 · O que os neurônios escondidos aprendem

A fronteira da seção 4 não sai pronta: ela é a composição de funções mais simples aprendidas pelos neurônios escondidos. Cada mapa abaixo mostra a ativação aj(1) = φ(zj(1)) de um neurônio da primeira camada escondida sobre o plano de entrada (verde: ativação positiva, roxo: negativa). Cada unidade traça essencialmente uma faixa orientada, definida pelos pesos θj(1); as camadas seguintes combinam essas peças para dobrar a fronteira final. Os mapas se atualizam sozinhos enquanto o modelo da seção 4 treina.

neurônio 1

neurônio 2

neurônio 3

neurônio 4

neurônio 5

neurônio 6

neurônio 7

neurônio 8

💡 Antes de treinar, os mapas são faixas aleatórias (os pesos iniciais são ruído). Treine o XOR com 1 camada de 4 neurônios e repare como cada unidade se alinha a uma diagonal ou a um par de quadrantes. Com ReLU os mapas só têm a parte verde, a ativação nunca fica negativa; com sigmoide o mapa mostra 2a − 1, centrando a faixa em a = 0.5.