Otimização e Álgebra Linear para Machine Learning
2026-10-15
Considere uma função composta com subexpressões repetidas: \[f(x) = \sqrt{x^2 + \exp(x^2)} + \cos(x^2 + \exp(x^2))\]
Aplicando a regra da cadeia analítica diretamente: \[\frac{df}{dx} = \frac{2x + 2x\exp(x^2)}{2\sqrt{x^2 + \exp(x^2)}} - \sin(x^2 + \exp(x^2))\cdot(2x + 2x\exp(x^2))\]
Simplificando os termos comuns: \[\frac{df}{dx} = 2x(1 + \exp(x^2))\left[ \frac{1}{2\sqrt{x^2 + \exp(x^2)}} - \sin(x^2 + \exp(x^2)) \right]\]
O Problema do Inchaço Algébrico
A Dupla Face da Diferenciação em Deep Learning
Problema Motivador: Arquitetura \(4 \to 3 \to 1\) no California Housing
Pergunta Aberta
Por que não podemos simplesmente aplicar o algoritmo de Descida do Gradiente da Aula 8 em um MLP calculando derivadas analíticas individuais para cada um dos parâmetros de forma independente, tratando cada peso como uma função isolada?
Otimização em Modelos Profundos
Julgue V ou F — a questão só conta se acertar os 4 itens:
Otimização em Modelos Profundos — Resposta
Voltando à pergunta: Tratar cada peso isoladamente geraria uma redundância computacional catastrófica: recalcularíamos as ativações e sensibilidades da rede inteira \(d\) vezes. A regra da cadeia explora o compartilhamento de cálculos intermediários.
O Motor do Backpropagation
Cada neurônio soma termos ponderados (Regra da Soma); cada camada compõe a anterior (Regra da Cadeia). O treino da rede orquestra ambas recursivamente!
\[\begin{aligned} \frac{\partial \mathcal{L}}{\partial \boldsymbol{\theta}_{K-1}} &= \frac{\partial \mathcal{L}}{\partial f_K} \frac{\partial f_K}{\partial \boldsymbol{\theta}_{K-1}} \\ \frac{\partial \mathcal{L}}{\partial \boldsymbol{\theta}_{K-2}} &= \frac{\partial \mathcal{L}}{\partial f_K} \frac{\partial f_K}{\partial f_{K-1}} \frac{\partial f_{K-1}}{\partial \boldsymbol{\theta}_{K-2}} \\ \frac{\partial \mathcal{L}}{\partial \boldsymbol{\theta}_{K-3}} &= \frac{\partial \mathcal{L}}{\partial f_K} \frac{\partial f_K}{\partial f_{K-1}} \frac{\partial f_{K-1}}{\partial f_{K-2}} \frac{\partial f_{K-2}}{\partial \boldsymbol{\theta}_{K-3}} \\ &\;\;\vdots \\ \frac{\partial \mathcal{L}}{\partial \boldsymbol{\theta}_i} &= \underbrace{\left( \frac{\partial \mathcal{L}}{\partial f_K} \frac{\partial f_K}{\partial f_{K-1}} \dots \frac{\partial f_{i+2}}{\partial f_{i+1}} \right)}_{\text{Prefixo já computado para a camada } i+1} \frac{\partial f_{i+1}}{\partial \boldsymbol{\theta}_i} \end{aligned}\]
Pontos-Chave do Backpropagation
Sensibilidade Pré-Sináptica
Definimos o vetor de erro pré-sináptico de cada camada \(l\) como o gradiente: \[\boldsymbol{\delta}^{(l)} := \nabla_{\mathbf{z}^{(l)}} \mathcal{L} \in \mathbb{R}^{d_l}\]
Pergunta Aberta
Por que a propagação da sensibilidade de uma camada para a anterior multiplica a sensibilidade pela matriz transposta \((W^{(l+1)})^T\), e por que o gradiente do peso \(W^{(l)}\) tem a forma exata de um produto diádico \(\boldsymbol{\delta}^{(l)} (\mathbf{a}^{(l-1)})^T\)?
Álgebra do Backpropagation
Julgue V ou F — a questão só conta se acertar os 4 itens:
Álgebra do Backpropagation — Resposta
Voltando à pergunta: A transposta \((W^{(l+1)})^T\) é o operador adjunto que mapeia o espaço de perturbação de saída de volta para o espaço de entrada da transformação linear. O produto diádico expressa que a taxa de variação da perda com relação ao peso \(W_{jk}\) é proporcional a “quanto o neurônio \(j\) precisava mudar” multiplicado por “quanto a entrada \(k\) contribuiu”.
O que é \(C_{\text{eval}}\)?
\(C_{\text{eval}}\) (Cost of Evaluation) é o custo computacional (tempo / operações) para avaliar a função \(f(\mathbf{x})\) para a frente uma única vez (forward pass).
Como a Autodiff Opera
O sistema não deduz derivadas: ele possui uma tabela pré-programada de derivadas locais analíticas para cada operação atômica.
O Segredo da Adição no Backward Pass
Como \(\frac{\partial (x+y)}{\partial x} = 1\) e \(\frac{\partial (x+y)}{\partial y} = 1\), a adição age como um roteador neutro: ela replica o gradiente recebido \(\bar{z}\) integralmente para ambas as entradas (\(\bar{x} = \bar{z}, \bar{y} = \bar{z}\)).
\[f(x) = \sqrt{x^2 + \exp(x^2)} + \cos(x^2 + \exp(x^2))\]
Decomposição em Variáveis:
O Grafo Computacional
Regra Geral em DAGs
\[\bar{x}_i := \frac{\partial f}{\partial x_i} = \sum_{x_j \in \text{Filhos}(x_i)} \bar{x}_j \, \frac{\partial x_j}{\partial x_i}\] Cada nó acumula a soma ponderada de todos os nós que ele alimenta diretamente!
Pergunta Aberta
Se um nó intermediário em um grafo de computação possui 3 arestas de saída (alimenta 3 variáveis subsequentes), por que a sua sensibilidade total acumulada é estritamente a soma das sensibilidades parciais que retornam de cada aresta, e o que aconteceria com o cálculo se uma biblioteca esquecesse de somar e simplesmente sobrescrevesse o valor do gradiente?
Propriedades dos Grafos de Autodiff
Julgue V ou F — a questão só conta se acertar os 4 itens:
+= por atribuição simples = preserva a correção do gradiente desde que as variáveis sejam processadas em ordem alfabética.Propriedades dos Grafos de Autodiff — Resposta
= sobrescreveria o sinal de erro de um dos caminhos, violando a regra da cadeia multivariada (que exige a soma de todos os caminhos incidentes).Voltando à pergunta: A regra da cadeia multivariada estabelece que a variação total na saída provocada por uma perturbação no nó é a soma das variações propagadas por cada caminho independente. Sobrescrever o gradiente ignoraria os efeitos de um dos ramos, gerando direções de descida matematicamente erradas e impedindo a convergência da rede.
Seja uma composição de \(K\) transformações multivariadas: \[\mathbf{x}_0 \xrightarrow{\mathbf{f}_1} \mathbf{x}_1 \xrightarrow{\mathbf{f}_2} \dots \xrightarrow{\mathbf{f}_K} \mathbf{x}_K\]
A Jacobiana total é o produto de matrizes: \[J = J_K \cdot J_{K-1} \cdots J_2 \cdot J_1\]
O Teorema da Associatividade
A multiplicação matricial é associativa: \((A B) C = A (B C)\).
Semente de entrada: \(\dot{x} = 1\). Regra direta: \(\dot{v}_i = \sum_{p \in \text{Pais}(v_i)} \frac{\partial v_i}{\partial p} \dot{p}\).
| Nó | Primal | Tangente (\(\dot{v}\)) |
|---|---|---|
| \(a = x^2\) | \(a = x^2\) | \(\dot{a} = 2x \cdot \dot{x} = 2x\) |
| \(b = \exp(a)\) | \(b = \exp(a)\) | \(\dot{b} = \exp(a) \cdot \dot{a} = 2x \exp(x^2)\) |
| \(c = a + b\) | \(c = a + b\) | \(\dot{c} = 1\cdot\dot{a} + 1\cdot\dot{b} = 2x(1 + \exp(x^2))\) |
| \(d = \sqrt{c}\) | \(d = \sqrt{c}\) | \(\dot{d} = \frac{1}{2\sqrt{c}} \dot{c}\) |
| \(e = \cos(c)\) | \(e = \cos(c)\) | \(\dot{e} = -\sin(c) \dot{c}\) |
| \(f = d + e\) | \(f = d + e\) | \(\dot{f} = \dot{d} + \dot{e} = (\frac{1}{2\sqrt{c}} - \sin(c))\dot{c} = \frac{\mathrm{d}f}{\mathrm{d}x}\) |
Dualidade Topológica e Memória
Teorema de Baur-Strassen / Speelpenning
Para qualquer função escalar \(f: \mathbb{R}^n \to \mathbb{R}\) computável em tempo \(C_{\text{eval}}\) (passagem direta): \[C_{\text{grad}} \le 5 \cdot C_{\text{eval}}\] independentemente do número de parâmetros \(n\).
Intuição Algébrica: Contagem de Operações por Nó
O custo total é a soma do Forward Pass (\(1 \cdot C_{\text{eval}}\)) com o Backward Pass (\(\le 4 \cdot C_{\text{eval}}\)).
Para uma multiplicação \(v_i = v_j \cdot v_k\): - Custo no forward: 1 operação (\(\times\)).
Atualizar os pais \(\bar{v}_j\) e \(\bar{v}_k\): - \(\bar{v}_j \mathrel{+}= \bar{v}_i \cdot v_k\) (1 mult + 1 soma = 2 ops) - \(\bar{v}_k \mathrel{+}= \bar{v}_i \cdot v_j\) (1 mult + 1 soma = 2 ops) - Custo no backward: \(2 + 2 = 4\) operações.
Total: \(C_{\text{forward}} + C_{\text{backward}} \le 1 + 4 = 5\)
\[C_{\text{grad}} \le C_{\text{eval}} + 4 \cdot C_{\text{eval}} = 5 \cdot C_{\text{eval}}\] Cada nó visitado no retorno faz no máximo 2 produtos e 2 somas para atualizar os erros de seus pais!
Síntese Unificadora
O algoritmo clássico de Backpropagation deduzido no Bloco 1 nada mais é do que o Modo Reverse de Diferenciação Automática aplicado à topologia específica de uma rede neural estruturada em camadas!
Pergunta Aberta
Imagine que você está projetando o sistema de controle de um braço robótico que recebe 3 ângulos de junta motora \(\boldsymbol{\theta} \in \mathbb{R}^3\) e calcula a trajetória espacial de 50 pontos da estrutura \(\mathbf{p} \in \mathbb{R}^{150}\). Você precisa da matriz Jacobiana completa \(\frac{\partial \mathbf{p}}{\partial \boldsymbol{\theta}} \in \mathbb{R}^{150 \times 3}\) a cada ciclo de controle de 1 milissegundo. Qual modo de autodiff você deve adotar e por quantas passagens pelo grafo?
Comparação entre os Modos de Autodiff
Julgue V ou F — a questão só conta se acertar os 4 itens:
Comparação entre os Modos de Autodiff — Resposta
Voltando à pergunta: Como \(d_{\text{in}} = 3\) e \(d_{\text{out}} = 150\), a dimensão de entrada é muito menor que a de saída (\(d_{\text{in}} \ll d_{\text{out}}\)). O Modo Forward é a escolha ideal, exigindo apenas 3 passagens pelo grafo (uma para cada junta), com consumo mínimo de memória e sem necessidade de armazenar fita de execução. O modo reverso exigiria 150 passagens!
A Jornada do Bloco 2 Concluída
O Próximo Desafio: Como treinar quando avaliar o grafo completo para todas as \(N\) amostras é lento demais?
Aula 10: Gradiente Descendente Estocástico (SGD) e Mini-Batching
UNICAMP — Instituto de Computação