Study guide

Aula 3: matrizes e camadas

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

Material de estudo para acompanhar os slides, com a revisão das aulas 1 e 2. Dada no encontro on-line de 13/11/2026, junto com a aula 5, por tela compartilhada.

O objetivo da aula é saber dizer o que é uma camada e escrevê-la como matriz, montar à mão a rede que calcula o XOR e explicar por que a ativação da camada oculta não pode ser linear.

Os tópicos

Sem horário marcado: o que não couber hoje entra na aula seguinte.

  1. Revisão das aulas 1 e 2
  2. Uma camada, uma matriz
  3. A ativação
  4. O código
  5. 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 1 e 2 estão nos roteiros delas.

Símbolo Lê-se Quer dizer Slide
WW W maiúsculo a matriz dos pesos de uma camada, com uma linha por neurônio 5
wkjw_{kj} w k j o peso que o neurônio k dá à entrada j: linha k, coluna j de W 5
Wx⃗W\vec{x} W vezes o vetor x matriz vezes vetor: o produto escalar de cada linha de W com x⃗\vec{x} 5
b⃗, h⃗\vec{b},\ \vec{h} o vetor b, o vetor h os vieses e as saídas da camada oculta, um número por neurônio 5
v⃗, c\vec{v},\ c o vetor v, c os pesos e o viés do neurônio de saída 5
(⋅)\begin{pmatrix} \cdot \end{pmatrix} a matriz, o vetor em coluna matriz e vetor escritos por extenso, entre parênteses 5
h1, h2h_1,\ h_2 h um, h dois as saídas dos dois neurônios ocultos 7
W⊤W^{\top} W transposta W com as linhas trocadas pelas colunas 8
X, Z, HX,\ Z,\ H X, Z, H um lote: as entradas, as somas e as saídas da camada, uma por linha 8
W2W1W_2 W_1 W dois vezes W um produto de matrizes: W₁ e depois W₂, numa matriz só 12
σ(z)\sigma(z) sigma de z a sigmoide, 1/(1 + e⁻ᶻ): o degrau alisado, entre 0 e 1 15
ee e o número de Euler, perto de 2,718 15
σ′(z)\sigma'(z) sigma linha de z a inclinação da sigmoide, σ(z)(1 − σ(z)) 15
kk k o número que multiplica a soma, em σ(k z): k grande deixa a sigmoide perto do degrau 16

No NumPy, estas peças resolvem quase tudo:

  • W @ x + b: uma camada inteira, com W um array de duas dimensões, uma linha por neurônio.
  • (z >= 0).astype(int): o degrau, posição por posição; a comparação dá True ou False, e astype(int) troca por 1 e 0.
  • W2 @ W1: o produto de duas matrizes, a camada única equivalente às duas.
  • X @ W.T + b: a camada para um lote, uma entrada por linha de X; W.T é a transposta, e o NumPy soma b a cada linha.
  • np.abs(a - b).max(): a maior diferença entre duas contas que deviam dar o mesmo.
  • rng = np.random.default_rng(3) e rng.normal(size=(3, 2)): uma matriz sorteada, com a semente 3.

1. Revisão das aulas 1 e 2

Slide 1: A capa

A aula 3 trata das camadas: vários neurônios que leem as mesmas entradas, escritos numa conta só com uma matriz. Com duas camadas, a rede calcula o XOR que o perceptron da aula 1 não aprendia, com pesos escolhidos à mão. Achar esses pesos sem escolher é a retropropagação, da aula 5.

A imagem são três desenhos de Santiago Ramón y Cajal publicados em 1899 no livro Comparative study of the sensory areas of the human cortex. À esquerda, o córtex visual de um adulto; no meio, o córtex motor de um adulto, os dois corados pelo método de Nissl; à direita, o córtex de um bebê de um mês e meio, corado pelo método de Golgi. O córtex cerebral tem camadas de células, da superfície para dentro. As camadas de uma rede neural são outra coisa, um grupo de neurônios artificiais que leem as mesmas entradas; a semelhança é de nome.

Slide 2: Revisão, de memória

A revisão é de memória, antes de qualquer slide de conteúdo: quatro perguntas, e a turma responde falando.

O que um neurônio calcula? A soma ponderada das entradas mais o viés, z = w⃗\vec{w} · x⃗\vec{x} + b, e o degrau decide: saída 1 se z ≥ 0, 0 se z < 0. No plano das duas entradas, os pontos com z = 0 formam uma reta, e o neurônio dispara de um lado dela.

Por que nenhum neurônio sozinho acerta o XOR? Os pontos de resposta 1, (0; 1) e (1; 0), ficam numa diagonal, e os de resposta 0, (0; 0) e (1; 1), na outra: nenhuma reta deixa uns de um lado e os outros do outro. A prova da aula 1 soma as condições de duas entradas e contradiz a de uma terceira.

O que a perda mede? O quanto a rede erra, num número só. A da aula 2 é o erro quadrático médio, a média dos quadrados das diferenças entre a saída y e a resposta certa t.

O que o gradiente descendente faz a cada passo? Calcula a derivada da perda em relação a cada parâmetro e anda contra ela, um passo do tamanho que a taxa de aprendizado η manda. Taxa pequena demais, a perda cai devagar; grande demais, o treino diverge.

Slide 3: Das aulas 1 e 2, três contas

As três contas das aulas 1 e 2 que o curso usa daqui em diante.

O neurônio: y = degrau(w⃗\vec{w} · x⃗\vec{x} + b). O vetor dos pesos w⃗\vec{w} e o viés b são os parâmetros, os números que o treino ajusta.

A perda: L = (1/N) Σ (yᵢ − tᵢ)², a média, nos N exemplos, do quadrado do erro de cada um.

O passo: w ← w − η ∂L/∂w, para cada parâmetro, todos andando juntos, com as derivadas calculadas antes de qualquer um mudar. Na aula 2, a reta tinha dois parâmetros, w e b, e as duas derivadas saíram à mão. A rede do XOR desta aula tem nove, e calcular a derivada da perda em relação a cada um deles é a pergunta da aula 5.

Slide 4: O fio do curso

O curso segue um fio, e este slide aparece em todas as aulas, com a aula do dia em destaque.

O começo é o XOR. Na aula 1, um neurônio desenha uma reta, e nenhuma reta separa os quatro pontos: a regra do perceptron corrige os pesos para sempre. Na aula 2, o gradiente descendente acha os pesos de um neurônio sem o degrau, e a taxa de aprendizado tem um limiar, acima do qual o treino diverge. Nesta aula, a 3, duas camadas separam o XOR, com pesos escolhidos à mão. Na 4, a regra da cadeia ganha vetores, e na 5 a retropropagação calcula as derivadas da perda em relação a todos os pesos: o gradiente descendente da aula 2 acha os pesos do XOR sozinho.

Depois, a mesma rede cresce: o MNIST, na aula 6; o PyTorch, na 7, que faz a retropropagação sozinho; os dados do CERN, na 8. O limiar da taxa da aula 2 volta no projeto, na aula 9, com uma taxa por camada, e a fronteira entre convergir e divergir é a figura que a turma apresenta na aula 10.

2. Uma camada, uma matriz

Slide 5: Uma camada é uma conta só

Uma camada é um grupo de neurônios que leem as mesmas entradas, cada um com os seus pesos e o seu viés. Na figura, os dois neurônios ocultos, h₁ e h₂, leem x₁ e x₂.

Matriz, no curso, é uma tabela de números com m linhas e n colunas. A matriz W guarda os pesos da camada: a linha k é o vetor dos pesos do neurônio k. O peso wₖⱼ, com dois índices, fica na linha k e na coluna j, e é o peso que o neurônio k dá à entrada j: w₁₂ é o peso que o neurônio 1 dá à entrada 2. Na figura, cada peso está junto da linha que ele multiplica. No dia a dia, matriz é também a sede de uma empresa, ou o molde de onde saem cópias; no curso, é só a tabela.

O produto da matriz pelo vetor, W x⃗\vec{x}, faz o produto escalar da aula 1 de cada linha de W com x⃗\vec{x} e devolve um vetor com um número por linha: z₁ = w₁₁x₁ + w₁₂x₂ e z₂ = w₂₁x₁ + w₂₂x₂. Somando o vetor dos vieses, b⃗\vec{b} = (b₁, b₂), sai W x⃗\vec{x} + b⃗\vec{b}, as somas dos dois neurônios numa conta só. A regra das dimensões: W com m linhas e n colunas, vezes x⃗\vec{x} com n números, dá um vetor com m números; aqui, 2 por 2 vezes 2 dá 2.

O degrau vale para cada posição do vetor, separadamente: h⃗\vec{h} = degrau(W x⃗\vec{x} + b⃗\vec{b}) quer dizer h₁ = degrau(z₁) e h₂ = degrau(z₂). A função aplicada à soma de cada neurônio se chama função de ativação; o degrau é uma, e a sigmoide, no fim da aula, é outra.

A camada de saída tem um neurônio só, como o da aula 1, com as saídas da camada oculta como entradas: pesos v⃗\vec{v} = (v₁; v₂) e viés c, e y = degrau(v⃗\vec{v} · h⃗\vec{h} + c). Ao todo, a rede tem nove parâmetros: os quatro de W, os dois de b⃗\vec{b}, os dois de v⃗\vec{v} e c.

O viés entra no desenho por uma seta curta, de fora da rede. É o viés da aula 1, o peso de uma entrada que vale sempre 1; a bolinha do 1 ficou de fora, para o desenho não encher.

Na programação, matriz costuma ser um array de duas dimensões, e no NumPy W @ x faz o produto da matriz pelo vetor.

Slide 6: A matriz vezes o vetor, em vídeo

O vídeo faz o produto da matriz pelo vetor com números, para a regra ficar na mão. W = (1 −2; 3 0,5), em duas linhas, x⃗\vec{x} = (2; 1) e b⃗\vec{b} = (0,5; −1).

A linha 1 de W, (1; −2), faz o produto escalar da aula 1 com x⃗\vec{x}: 1 · 2 + (−2) · 1 = 0; mais o viés 0,5, dá 0,5. A linha 2, (3; 0,5): 3 · 2 + 0,5 · 1 = 6,5; mais o viés −1, dá 5,5. O vetor z⃗\vec{z} = (0,5; 5,5) tem um número por linha de W, isto é, um por neurônio da camada. Cada número que entra na conta é copiado do lugar dele, para se ver de onde vem: a linha de W, o vetor x⃗\vec{x} inteiro e um número de b⃗\vec{b}.

Depois, o degrau vale para cada posição, separadamente: 0,5 ≥ 0 e 5,5 ≥ 0, e h⃗\vec{h} = (1; 1).

No fim, as dimensões, embaixo de cada peça: W é 2 por 2, duas linhas e duas colunas; x⃗\vec{x} tem 2 números; a saída tem 2. A regra: o número de colunas de W é o número de entradas, e o de linhas, o número de neurônios. A camada oculta da aula 6, com 784 entradas e 256 neurônios, tem W de 256 linhas e 784 colunas.

Slide 7: O XOR com pesos escolhidos à mão

Os pesos escolhidos à mão reaproveitam os neurônios da aula 1. O neurônio h₁ tem pesos (1; 1) e viés −0,5: dispara quando x₁ + x₂ ≥ 0,5, isto é, com pelo menos uma entrada em 1; calcula o OU. O neurônio h₂ tem os mesmos pesos e viés −1,5: dispara quando x₁ + x₂ ≥ 1,5, só com as duas entradas em 1; é o neurônio da tabela do E da aula 1. Em matriz, W tem as duas linhas iguais a (1; 1), e b⃗\vec{b} = (−0,5; −1,5).

O neurônio de saída tem pesos v⃗\vec{v} = (1; −1) e viés c = −0,5: y = degrau(h₁ − h₂ − 0,5). Ele dispara só com h₁ = 1 e h₂ = 0: o OU disse sim e o E disse não, isto é, exatamente uma entrada em 1. É o XOR.

A tabela confere as quatro entradas. Em (0; 0), nenhum neurônio oculto dispara, e y = 0. Em (0; 1) e (1; 0), só o OU dispara, e y = 1. Em (1; 1), os dois disparam, h₁ − h₂ − 0,5 = −0,5, e y = 0. O programa codigo/xor_a_mao.py faz a mesma conta, com a matriz, e confere.

Outros pesos também calculam o XOR; estes foram escolhidos porque reaproveitam o E e o OU da aula 1. A rede treinada na aula 5 acha uma solução diferente.

Slide 8: As quatro entradas numa conta só

Na rede, cada entrada passa pela mesma camada. Em vez de fazer W x⃗\vec{x} + b⃗\vec{b} quatro vezes, as quatro entradas do XOR vão juntas, uma por linha de uma matriz X, de 4 linhas e 2 colunas.

Wᵀ, a transposta de W, é W com as linhas trocadas pelas colunas: a coluna k de Wᵀ guarda os pesos do neurônio k. O produto X Wᵀ faz o produto escalar de cada linha de X, uma entrada, com cada coluna de Wᵀ, um neurônio. A linha i de Z = X Wᵀ + b⃗\vec{b} guarda as somas dos dois neurônios para a entrada i, e b⃗\vec{b} se soma a cada linha. Na rede do XOR, as duas linhas de W são iguais, (1; 1), e Wᵀ é a própria W; em geral, não.

As contas: (0; 0) dá as somas (−0,5; −1,5); (0; 1) e (1; 0) dão (0,5; −0,5); (1; 1) dá (1,5; 0,5). O degrau, posição por posição, dá as linhas (0; 0), (1; 0), (1; 0) e (1; 1): as colunas h₁ e h₂ da tabela do slide anterior.

Lote, no curso, é o grupo de entradas que passa junto pela rede; aqui, as quatro. No NumPy, a camada inteira para o lote é X @ W.T + b, e o NumPy soma b a cada linha sozinho, o que ele chama de broadcasting. É a forma que o código da aula 6 usa, com X de 64 linhas, uma por imagem, e 784 colunas.

Slide 9: A camada oculta muda o plano

O vídeo mostra o que a camada oculta faz com os quatro pontos. À esquerda, o plano das entradas, (x₁; x₂). O neurônio h₁, o OU, tem a reta x₁ + x₂ = 0,5, cheia; o neurônio h₂, o E, a reta x₁ + x₂ = 1,5, tracejada.

Cada ponto passa pela camada oculta e vira o par (h₁; h₂), um ponto de outro plano, o da direita. (0; 0) vai para (0; 0); (0; 1) e (1; 0) vão os dois para (1; 0), porque nos dois só o OU dispara; (1; 1) vai para (1; 1). Os dois círculos chegam ao mesmo lugar.

No plano novo, uma reta separa os círculos dos quadrados: a do neurônio de saída, h₁ − h₂ = 0,5, que deixa (1; 0) de um lado e (0; 0) e (1; 1) do outro. O problema que não tinha reta no plano das entradas ganhou uma reta no plano da camada oculta. É o que a camada oculta faz aqui: troca a descrição de cada ponto por outra, em que o problema fica fácil.

No fim, a região em que a rede inteira dispara volta ao plano das entradas: a faixa entre as duas retas. Uma reta só não separa o XOR; duas retas, combinadas pelo neurônio de saída, separam.

Slide 10: Camada, camada oculta e MLP

Uma camada é um grupo de neurônios que leem as mesmas entradas; a saída de uma camada é a entrada da seguinte. A camada de saída dá a resposta da rede. As camadas do meio, entre a entrada e a saída, são as camadas ocultas: não recebem os dados nem dão a resposta, e de fora só se veem a entrada e a saída. A entrada não tem neurônio nenhum: é só a lista dos números que entram.

O perceptron multicamadas, o MLP, do inglês multilayer perceptron, é uma rede de camadas empilhadas assim, com cada neurônio ligado a todos os da camada seguinte. O nome guarda o perceptron de Rosenblatt, mas os neurônios de um MLP usam outras funções de ativação, como a sigmoide de dois slides adiante, e não o degrau. A rede do XOR é um MLP 2-2-1: duas entradas, dois neurônios ocultos e uma saída.

O artigo de 1986 de Rumelhart, Hinton e Williams, que volta na aula 5, chama de ocultas, hidden em inglês, as unidades internas que não são parte da entrada nem da saída.

Slide 11: Quantos números a rede guarda

Quantos números uma rede guarda? Cada camada tem uma matriz W, com um peso por par de entrada e neurônio, e um viés por neurônio. Uma camada de n entradas e m neurônios guarda n · m + m números. A rede inteira soma as camadas.

A rede do XOR, 2-2-1: a camada oculta, 2 · 2 + 2 = 6; a saída, 2 · 1 + 1 = 3; ao todo, 9, os nove da aula. A rede pequena da aula 7, que volta na aula 9, 784-16-10: 784 · 16 + 16 = 12.560 e 16 · 10 + 10 = 170, ao todo 12.730. A rede do MNIST da aula 6, 784-256-10: 200.960 e 2.570, ao todo 203.530. A rede da massa invariante, da aula 8, 8-256-256-1: 2.304, 65.792 e 257, ao todo 68.353.

Quase todos os números ficam nas matrizes, e a primeira camada da rede do MNIST guarda quase todos, porque cada um dos 784 pixels liga a cada um dos 256 neurônios. Escolher 203.530 números à mão é impossível: é a razão da retropropagação, da aula 5.

3. A ativação

Slide 12: O plano inteiro, em vídeo

O vídeo mostra o que uma matriz faz com o plano inteiro, e não só com um ponto: cada ponto da grade vai para W x⃗\vec{x}.

À esquerda, W₁ = (1 0,5; 0 1) inclina a grade: o ponto (x₁; x₂) vai para (x₁ + 0,5 x₂; x₂). As retas continuam retas, as paralelas continuam paralelas, e a origem fica no lugar: é isso que linear quer dizer. O viés b⃗\vec{b}, que o vídeo deixa de fora, só deslocaria a grade inteira. Depois, W₂ = (1 0; −0,5 1) inclina na outra direção, e a grade continua feita de retas.

À direita, a matriz do produto, W₂W₁ = (1 0,5; −0,5 0,75), faz numa vez o que as duas fizeram em duas, e as grades ficam iguais: duas camadas lineares valem uma.

Por fim, a direita recomeça: W₁, e depois a sigmoide em cada coordenada. O plano inteiro cabe no quadrado de 0 a 1, e as retas entortam. É essa curva que deixa uma rede de várias camadas desenhar fronteiras que não são retas.

É a ideia do capítulo 3 da série sobre álgebra linear do 3Blue1Brown, do estudo da aula 2: uma matriz é uma transformação do plano, e as colunas dela dizem para onde vão os vetores (1; 0) e (0; 1).

Slide 13: Sem ativação, duas camadas valem uma

Por que a camada oculta precisa do degrau, ou de outra função que não seja linear? Sem ela, duas camadas seguidas valem uma.

A conta: a primeira camada dá W₁ x⃗\vec{x} + b⃗\vec{b}₁; a segunda aplica W₂ a isso e soma b⃗\vec{b}₂. Distribuindo, W₂ (W₁ x⃗\vec{x} + b⃗\vec{b}₁) + b⃗\vec{b}₂ = (W₂ W₁) x⃗\vec{x} + (W₂ b⃗\vec{b}₁ + b⃗\vec{b}₂), que tem a forma W x⃗\vec{x} + b⃗\vec{b} de uma camada só, com W = W₂ W₁ e b⃗\vec{b} = W₂ b⃗\vec{b}₁ + b⃗\vec{b}₂. Uma camada só desenha de novo uma reta por neurônio de saída, e o XOR volta a não ter solução.

W₂ W₁ é o produto de duas matrizes, definido para que (W₂ W₁) x⃗\vec{x} dê o mesmo que W₂ (W₁ x⃗\vec{x}) para todo x⃗\vec{x}: a matriz do produto faz numa conta só o que W₁ e depois W₂ fazem em duas. É a composição do capítulo 4 da série sobre álgebra linear do 3Blue1Brown, do estudo da aula 2. A regra das dimensões continua: W₂ com 1 linha e 3 colunas vezes W₁ com 3 linhas e 2 colunas dá uma matriz de 1 por 2. A ordem importa: em geral, W₂ W₁ é diferente de W₁ W₂, que pode nem existir, se as dimensões não casarem.

O xor_a_mao.py confere com matrizes sorteadas, semente 3: uma camada de 2 entradas para 3 neurônios e outra de 3 para 1. Em cem entradas sorteadas, duas camadas e uma dão o mesmo número, com diferença de 7 · 10⁻¹⁵, o tamanho do arredondamento do computador.

Linear, no curso, é uma conta da forma W x⃗\vec{x} + b⃗\vec{b}, que leva retas a retas. Na matemática, com o b⃗\vec{b} a conta se diz afim, e linear fica para W x⃗\vec{x} sem o b⃗\vec{b}; a área de redes neurais chama as duas de linear. No dia a dia, linear quer dizer em linha reta.

Slide 14: Duas camadas lineares, com números

A conta do slide anterior com números pequenos, para conferir à mão. A primeira camada tem W₁ = (1 2; 0 1) e b⃗\vec{b}₁ = (1; −1); a segunda, um neurônio só, tem W₂ = (1 −1), uma linha, e b₂ = 3.

A camada única: W₂W₁ é a linha (1 −1) vezes cada coluna de W₁. Com a coluna (1; 0), 1 · 1 + (−1) · 0 = 1; com a coluna (2; 1), 1 · 2 + (−1) · 1 = 1. Então W₂W₁ = (1 1). O viés: W₂b⃗\vec{b}₁ + b₂ = 1 · 1 + (−1) · (−1) + 3 = 5.

Conferindo com x⃗\vec{x} = (2; 1). Pelas duas camadas: W₁x⃗\vec{x} + b⃗\vec{b}₁ = (2 + 2 + 1; 0 + 1 − 1) = (5; 0), e W₂ (5; 0) + 3 = 5 − 0 + 3 = 8. Pela camada única: (1 1) · (2; 1) + 5 = 3 + 5 = 8. O mesmo número, para qualquer x⃗\vec{x}, porque as duas contas são a mesma função.

O produto de matrizes é o produto escalar de cada linha da primeira com cada coluna da segunda; por isso o número de colunas da primeira tem de ser o número de linhas da segunda.

Slide 15: Do degrau à sigmoide

A função de ativação é a função aplicada à soma z de cada neurônio. O degrau da aula 1 é uma, e foi a dos pesos à mão. Para o gradiente descendente, o degrau não serve: é plano em todo ponto fora do zero, a derivada é zero, e o passo, −η · 0, não sai do lugar.

A sigmoide, σ(z) = 1/(1 + e⁻ᶻ), faz a mesma passagem de 0 a 1, mas lisa. O e é o número de Euler, perto de 2,718. Para z muito negativo, e⁻ᶻ é enorme, e σ fica perto de 0; para z muito positivo, e⁻ᶻ é quase 0, e σ fica perto de 1; em z = 0, σ = 1/2. A saída fica sempre entre 0 e 1, e y ≥ 0,5 se lê como resposta 1. A letra σ é o sigma minúsculo; o Σ da soma é o maiúsculo da mesma letra.

A inclinação da sigmoide sai dela mesma: σ′(z) = σ(z)(1 − σ(z)). O maior valor é 0,25, em z = 0; longe do zero, a inclinação some, e o neurônio quase não aprende. 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 da aula 5 a confere com a derivada numérica, junto com as outras derivadas.

A sigmoide é a função logística, que Pierre François Verhulst criou entre 1838 e 1847 como modelo do crescimento de uma população. O projeto da aula 9 usa outra ativação, a tangente hiperbólica, tanh, que vai de −1 a 1 com o mesmo formato de S.

Slide 16: Do degrau à sigmoide, em vídeo

O vídeo compara as duas ativações. O degrau vale 0 antes do zero e 1 depois, com um salto no zero. A sigmoide faz a mesma passagem sem salto, e σ(0) = 0,5.

Com a soma multiplicada por um número k, a sigmoide de k z fica mais íngreme; com k = 12, quase não se distingue do degrau. É o que acontece quando os pesos de um neurônio crescem: a sigmoide se aproxima do degrau, e o slide seguinte mostra isso na rede do XOR.

Depois, com k = 1, a reta tangente percorre a curva, e a inclinação, σ(z)(1 − σ(z)), aparece ao lado: 0,018 em z = −4, 0,25 em z = 0, o máximo, e 0,045 em z = 3. O degrau tem inclinação zero em todo ponto fora do zero, e no zero não tem inclinação nenhuma. O gradiente descendente anda contra a derivada; com derivada zero, o passo é zero, e o degrau não treina. A sigmoide treina, e treina mais devagar longe do zero, onde a inclinação some.

Slide 17: Os pesos do XOR com a sigmoide

A rede do XOR com os pesos à mão e a sigmoide no lugar do degrau, com todos os pesos e vieses multiplicados por k. A cor é a saída y da rede em cada ponto do plano, do fundo, 0, ao azul, 1, e a linha escura é y = 0,5, a fronteira entre responder 0 e 1.

Com k = 1, os pesos à mão, a saída fica entre 0,42 e 0,44 nos quatro pontos, abaixo de 0,5 em todos: a rede erra (0; 1) e (1; 0), e o plano inteiro tem quase a mesma cor. Com k = 5, a saída é 0,107 em (0; 0) e (1; 1) e 0,851 em (0; 1) e (1; 0): acerta, com margem, e a faixa do XOR aparece entre as duas retas. Com k = 25, a saída é 0,000 e 1,000 até a terceira casa: o degrau de volta.

Duas lições. Com a sigmoide, a saída é um número entre 0 e 1, e y ≥ 0,5 se lê como resposta 1. E o tamanho dos pesos importa: os mesmos pesos, pequenos, dão uma rede indecisa. Na aula 5, os pesos e o tamanho deles saem do treino.

Os números saem de codigo/figuras_slides.py, que imprime a tabela.

Slide 18: Como achar os nove números?

A pergunta que fecha a aula 3 e abre a aula 5. Os pesos do XOR foram escolhidos à mão porque a rede é pequena e o problema é conhecido. Com nove parâmetros, testar valores ao acaso já é loteria, e uma rede de hoje tem milhões de pesos. O gradiente descendente da aula 2 resolve, desde que se saiba a derivada da perda em relação a cada parâmetro. Com a reta, eram duas derivadas, feitas à mão. Com camadas, cada peso da primeira camada mexe na perda através da camada seguinte, e a derivada passa pela regra da cadeia, da aula 4. A aula 5 junta as duas coisas: a retropropagação.

4. O código

Slide 19: O código

O código da aula fica pronto e testado antes: codigo/xor_a_mao.py, que roda na tela.

Ele monta a rede do XOR com os pesos à mão como lista de camadas, cada uma o par (W, b⃗\vec{b}), e faz a passada para a frente com o degrau: imprime a tabela das quatro entradas, com as somas z⃗\vec{z} e as saídas h⃗\vec{h} da camada oculta e a soma z e a saída y do neurônio de saída, e confere que y é o XOR. A função da passada para a frente serve para qualquer número de camadas: recebe a lista das camadas e leva a saída de uma para a entrada da seguinte. Depois, o programa confere com matrizes sorteadas, semente 3, que duas camadas lineares seguidas valem uma, com diferença de 7 · 10⁻¹⁵.

Quatro peças do NumPy resolvem quase tudo. W @ x + b faz a camada inteira. (z >= 0).astype(int) é o degrau, posição por posição: a comparação dá True ou False, e o astype troca por 1 e 0. W2 @ W1 é o produto das matrizes. E np.abs(a - b).max() mede a maior diferença entre duas contas que deviam dar o mesmo.

A entrega pede a passada para a frente para qualquer número de camadas e a conferência de que duas camadas lineares valem uma; o xor_a_mao.py é a solução de referência e não vai para a turma antes do prazo.

5. Fechamento

Slide 20: Para estudar e entregar

O estudo prepara as aulas 4 e 5, que usam a regra da cadeia. O capítulo 4 da série sobre cálculo do 3Blue1Brown mostra a regra da cadeia e a regra do produto com desenhos. Os vídeos da Khan Academy sobre o Jacobiano mostram a matriz das derivadas parciais de uma função que recebe um vetor e devolve outro, o assunto da aula 4.

A entrega: a passada para a frente para qualquer número de camadas, a conferência em NumPy de que duas camadas lineares seguidas valem uma e uma pergunta sobre o estudo.

A seguir, a aula 4 escreve a regra da cadeia com vetores, uma camada de cada vez, e a aula 5 usa essa conta, de trás para a frente, para achar os nove pesos da rede do XOR sem escolher à mão.

Perguntas que podem aparecer

  • Por que dois neurônios na camada oculta, e não um? Com um só, e sem ligação direta da entrada para a saída, a saída lê um número que depende de uma reta só, e a rede inteira continua desenhando uma reta.
  • A entrada é uma camada? Não tem neurônio, só passa os números adiante; por isso a rede do XOR se diz de duas camadas, a oculta e a de saída, embora o desenho tenha três colunas.
  • Outros pesos calculam o XOR? Sim, muitos: qualquer par de retas que deixe os dois círculos de um lado e os dois quadrados do outro, combinado pela saída. A rede treinada na aula 5 acha uma solução diferente desta.
  • Por que não usar a sigmoide desde o começo? Com pesos à mão, o degrau deixa as contas exatas, com 0 e 1; com a sigmoide, as saídas seriam números perto de 0 e de 1, e a tabela ficaria com decimais. Para treinar, na aula 5, a sigmoide é necessária.

Para estudar

O estudo da turma, que é também o seu:

Além dele, para preparar a aula:

Fontes dos fatos citados

Só para conferência; o estudo é a lista de cima.

  • Wikimedia Commons, a página do arquivo "Cajal cortex drawings.png", com a descrição dos três desenhos, o livro de 1899 e a licença.
  • David E. Rumelhart, Geoffrey E. Hinton e Ronald J. Williams, 1986, "Learning representations by back-propagating errors", Nature 323(6088):533-536, doi:10.1038/323533a0: o resumo, com as unidades "hidden".
  • Verbete "Logistic function" da Wikipedia em inglês: Verhulst, entre 1838 e 1847, e a derivada f(x)(1 − f(x)).
  • A página do vídeo do 3Blue1Brown, com título, data e as faixas de legenda, e a página da unidade sobre o Jacobiano da Khan Academy, com os títulos dos vídeos.
  • Os números: codigo/xor_a_mao.py, com os pesos à mão e, na conferência das camadas lineares, a semente 3; o 2-2-1 do projeto e a tanh, em projeto/varredura.py.