Soluções — Aula 9: Funções Compostas, Redes Neurais e Diferenciação Automática

Otimização e Álgebra Linear para Machine Learning

Autor

Marcos M. Raimundo — Instituto de Computação, UNICAMP

Data de Publicação

21 de outubro de 2026

Aula Exercícios

Dica

Este documento apresenta as soluções detalhadas e justificativas conceituais para todas as questões de Verdadeiro ou Falso da lista de exercícios da Aula 09. As questões discursivas não possuem gabarito publicado.


Soluções das Questões de Verdadeiro/Falso

NotaTeste 1 — Regra da Cadeia Multivariada e Layouts Matriciais
  • □ No denominator layout, a matriz Jacobiana de uma transformação \(\mathbf{f}: \mathbb{R}^n \to \mathbb{R}^m\) possui dimensão \(n \times m\), onde cada coluna \(j\) armazena o vetor-coluna do gradiente \(\nabla_{\mathbf{x}} f_j\).
  • □ Para uma função afim \(\mathbf{f}(\mathbf{x}) = A\mathbf{x} + \mathbf{b}\) com \(A \in \mathbb{R}^{m \times n}\), a matriz Jacobiana sob a convenção denominator layout é dada por \(J_{\mathbf{f}}(\mathbf{x}) = A\).
  • □ A regra da cadeia multivariada sob denominator layout estabelece que \(\nabla_{\mathbf{x}} (g \circ \mathbf{f}) = J_{\mathbf{f}}(\mathbf{x})\, \nabla_{\mathbf{u}} g\), garantindo compatibilidade dimensional entre a matriz \(n \times m\) e o gradiente-coluna \(m \times 1\).
  • □ Se adotássemos a convenção de gradiente como vetor-linha (numerator layout), a regra da cadeia exigiria que os gradientes fossem transpostos para viabilizar o produto matricial à esquerda.
Dica(Resposta) Teste 1 — Regra da Cadeia Multivariada e Layouts Matriciais
  • ✔ Verdadeiro — Por definição do denominator layout, se a variável independente \(\mathbf{x} \in \mathbb{R}^n\) dita as linhas e a função dependente \(\mathbf{f} \in \mathbb{R}^m\) dita as colunas, \(J_{\mathbf{f}}(\mathbf{x}) \in \mathbb{R}^{n \times m}\) tem como colunas os gradientes das componentes \(\nabla_{\mathbf{x}} f_j \in \mathbb{R}^n\).
  • ✗ Falso — Como \([J_{\mathbf{f}}]_{ij} = \frac{\partial f_j}{\partial x_i} = A_{ji}\), a Jacobiana é a transposta da matriz de pesos, \(J_{\mathbf{f}}(\mathbf{x}) = A^T \in \mathbb{R}^{n \times m}\).
  • ✔ Verdadeiro — A multiplicação de \(J_{\mathbf{f}} \in \mathbb{R}^{n \times m}\) pelo vetor-coluna \(\nabla_{\mathbf{u}} g \in \mathbb{R}^{m \times 1}\) resulta perfeitamente no vetor-coluna \(\nabla_{\mathbf{x}} h \in \mathbb{R}^{n \times 1}\).
  • ✗ Falso — No numerator layout, o gradiente já é definido nativamente como vetor-linha (\(1 \times m\) e \(1 \times n\)); a regra da cadeia é escrita diretamente como \(\nabla_{\mathbf{x}} (g \circ \mathbf{f}) = (\nabla_{\mathbf{u}} g) J_{\text{num}}\), sem necessidade de transposição.

NotaTeste 2 — Retropropagação de Sensibilidade e Saturação
  • □ O vetor de sensibilidade pré-sináptica é definido formalmente como \(\boldsymbol{\delta}^{(l)} = \nabla_{\mathbf{z}^{(l)}} \mathcal{L}\), representando a taxa de variação da perda em relação à combinação linear antes da aplicação da ativação não-linear.
  • □ A equação de retropropagação \(\boldsymbol{\delta}^{(l)} = \big((W^{(l+1)})^T \boldsymbol{\delta}^{(l+1)}\big) \odot \sigma'(\mathbf{z}^{(l)})\) utiliza a matriz transposta \((W^{(l+1)})^T\) porque ela atua como o operador adjunto que transporta o sinal de erro de \(\mathbb{R}^{d_{l+1}}\) de volta para \(\mathbb{R}^{d_l}\).
  • □ Caso todos os neurônios da camada oculta operem na região linear da função logística (\(z \approx 0\)), temos \(\sigma'(0) = 0{,}25\), o que amplifica exponencialmente o gradiente em direção às camadas iniciais.
  • □ A função de ativação ReLU (\(\text{ReLU}(z) = \max(0, z)\)) possui derivada constante igual a 1 para qualquer \(z > 0\), eliminando a atenuação multiplicativa de sensibilidade nas unidades ativas durante a passagem reversa.
Dica(Resposta) Teste 2 — Retropropagação de Sensibilidade e Saturação
  • ✔ Verdadeiro — Esta é a definição canônica da variável adjunta intermediária na literatura de redes neurais, desacoplando a derivada linear da derivada da ativação.
  • ✔ Verdadeiro — Como \(W^{(l+1)}: \mathbb{R}^{d_l} \to \mathbb{R}^{d_{l+1}}\), o operador que mapeia os gradientes de volta ao espaço dual de partida é o operador adjunto linear, representado matricialmente por \((W^{(l+1)})^T\).
  • ✗ Falso — Um fator \(0{,}25 < 1\) atenua exponencialmente o sinal de erro ao longo das camadas (em 4 camadas, o sinal é reduzido por \((0{,}25)^4 = 1/256\)), provocando desvanecimento de gradiente (vanishing gradient), e não amplificação.
  • ✔ Verdadeiro — Para \(z > 0\), \(\frac{d}{dz}\text{ReLU}(z) = 1\). Ao multiplicar via Hadamard por 1, o vetor de sensibilidade retropropagado não sofre atenuação provocada pela ativação.

NotaTeste 3 — Gradientes dos Pesos e Produtos Diádicos
  • □ O gradiente da perda em relação à matriz de pesos de uma camada densa para um único exemplo de treino é dado por \(\nabla_{W^{(l)}}\mathcal{L} = \boldsymbol{\delta}^{(l)}(\mathbf{a}^{(l-1)})^T\).
  • □ Como \(\boldsymbol{\delta}^{(l)} \in \mathbb{R}^{d_l}\) e \(\mathbf{a}^{(l-1)} \in \mathbb{R}^{d_{l-1}}\) são vetores, a matriz de gradiente \(\nabla_{W^{(l)}}\mathcal{L}\) resultante de uma única amostra possui posto algébrico no máximo igual a 1.
  • □ Para um lote de \(B\) amostras independentes, a matriz de gradiente acumulada \(\frac{1}{B} \sum_{i=1}^B \boldsymbol{\delta}^{(l)}_i (\mathbf{a}^{(l-1)}_i)^T\) pode atingir posto estritamente maior que 1, limitado por \(\min(d_l, d_{l-1}, B)\).
  • □ O gradiente do vetor de viés \(\nabla_{\mathbf{b}^{(l)}}\mathcal{L}\) é proporcional ao produto da sensibilidade \(\boldsymbol{\delta}^{(l)}\) pela média dos pesos da camada anterior.
Dica(Resposta) Teste 3 — Gradientes dos Pesos e Produtos Diádicos
  • ✔ Verdadeiro — Pela regra da cadeia escalar, \(\frac{\partial \mathcal{L}}{\partial W_{jk}} = \frac{\partial \mathcal{L}}{\partial z_j} \frac{\partial z_j}{\partial W_{jk}} = \delta_j a_k\), o que corresponde exatamente à entrada \((j, k)\) do produto externo \(\boldsymbol{\delta} \mathbf{a}^T\).
  • ✔ Verdadeiro — Toda matriz gerada pelo produto externo de dois vetores não-nulos possui posto exatamente 1 (\(\text{rk}(\mathbf{u}\mathbf{v}^T) = 1\)).
  • ✔ Verdadeiro — A soma de \(B\) matrizes de posto 1 pode gerar uma matriz com posto de até \(B\), com teto imposto pelas dimensões da própria matriz (\(\min(d_l, d_{l-1})\)).
  • ✗ Falso — Como \(\frac{\partial z_j}{\partial b_j} = 1\), temos diretamente \(\nabla_{\mathbf{b}^{(l)}}\mathcal{L} = \boldsymbol{\delta}^{(l)}\), sem nenhuma dependência das ativações ou dos pesos anteriores.

NotaTeste 4 — Paradigmas de Diferenciação e Instabilidade Numérica
  • □ O método de diferenças finitas progressivas aproxima derivadas com erro assintótico de truncamento \(\mathcal{O}(h^2)\), enquanto a diferença central atinge \(\mathcal{O}(h^3)\).
  • □ Ao reduzir o tamanho do passo \(h\) abaixo de \(\sqrt{\epsilon_{\text{mach}}} \approx 10^{-8}\) em aritmética de precisão dupla, o erro total das diferenças finitas aumenta devido ao fenômeno do cancelamento subtrativo catastrófico.
  • □ A diferenciação simbólica aplicada a funções com profundos aninhamentos sofre do problema de expression swell, onde o tamanho da árvore sintática cresce exponencialmente devido à replicação de termos da regra do produto.
  • □ Ao contrário de diferenças finitas, a Diferenciação Automática não introduz erros de truncamento numérico nem sofre de inchaço exponencial, calculando derivadas exatas em precisão de máquina.
Dica(Resposta) Teste 4 — Paradigmas de Diferenciação e Instabilidade Numérica
  • ✗ Falso — A diferença progressiva possui erro de truncamento de primeira ordem \(\mathcal{O}(h)\), e a diferença central atinge segunda ordem \(\mathcal{O}(h^2)\).
  • ✔ Verdadeiro — Para \(h < \sqrt{\epsilon_{\text{mach}}}\), os valores de \(f(x+h)\) e \(f(x)\) tornam-se quase idênticos em ponto flutuante, e a subtração descarta os dígitos mais significativos, erro que é amplificado pela divisão por \(h\).
  • ✔ Verdadeiro — Como \((uv)' = u'v + uv'\), a diferenciação simbólica duplica recursivamente as subárvores de expressões a cada camada de aninhamento.
  • ✔ Verdadeiro — A autodiff avalia numericamente derivadas analíticas exatas a cada operação atômica, eliminando erros de truncamento e evitando a retenção de árvores simbólicas gigantescas.

NotaTeste 5 — Grafos de Computação (DAGs) e Execução
  • □ Em um Grafo Acíclico Direcionado que modela a execução de um programa, os nós representam operações elementares ou variáveis e as arestas direcionadas representam dependências de fluxo de dados.
  • □ A ordenação topológica dos nós em um DAG de computação é estritamente única, não existindo mais de uma sequência válida de avaliação para um mesmo grafo.
  • □ No algoritmo de backpropagation em DAGs, a ordenação topológica inversa garante que um nó intermediário só acumule seu gradiente total após todos os seus nós consumidores (filhos) terem executado suas respectivas passagens reversas.
  • □ Quando uma variável intermediária é consumida por duas operações distintas no grafo, seu gradiente total na passagem reversa deve ser obtido pela média aritmética dos gradientes provenientes de cada caminho.
Dica(Resposta) Teste 5 — Grafos de Computação (DAGs) e Execução
  • ✔ Verdadeiro — É a definição formal de um grafo computacional, onde a topologia dita a ordem de execução e transmissão de derivadas.
  • ✗ Falso — Em qualquer DAG que possua nós em ramos independentes e paralelos, existem múltiplas ordenações topológicas equivalentes que satisfazem as restrições de precedência.
  • ✔ Verdadeiro — O percurso em ordem topológica inversa assegura que toda a contribuição de sensibilidade a jusante já tenha chegado ao nó antes que ele distribua seu eco para montante.
  • ✗ Falso — Pela regra da cadeia multivariada para variáveis repetidas, as contribuições devem ser somadas (\(\bar{v}_i = \sum_{k \in \text{Ch}(i)} \bar{v}_k \frac{\partial \phi_k}{\partial v_i}\)), e não calculadas pela média.

NotaTeste 6 — Modo Forward vs. Modo Reverse e Baur-Strassen
  • □ O modo forward de autodiff rastreia perturbações direcionais \(\dot{v}_i = \frac{\partial v_i}{\partial x_k}\) propagando-as simultaneamente à execução da passagem direta do programa.
  • □ Para calcular a matriz Jacobiana de um mapeamento \(\mathbf{f}: \mathbb{R}^n \to \mathbb{R}^m\), o modo forward requer \(n\) avaliações do grafo, enquanto o modo reverso requer \(m\) avaliações do grafo.
  • □ O Teorema de Baur-Strassen estabelece que o tempo necessário para calcular o gradiente completo de qualquer função escalar \(f: \mathbb{R}^n \to \mathbb{R}\) no modo reverso é no máximo cerca de 5 vezes o tempo de uma única avaliação direta de \(f\), qualquer que seja o valor de \(n\).
  • □ O modo reverso de autodiff é assintoticamente mais eficiente que o modo forward em problemas onde o número de parâmetros de entrada é substancialmente menor que a dimensão das saídas (\(d_{\text{in}} \ll d_{\text{out}}\)).
Dica(Resposta) Teste 6 — Modo Forward vs. Modo Reverse e Baur-Strassen
  • ✔ Verdadeiro — O modo forward calcula as variáveis tangentes \(\dot{v}_i\) em sincronia perfeita com a passagem direta, sem necessidade de armazenar um grafo para retroação posterior.
  • ✔ Verdadeiro — O modo forward projeta perturbações da entrada (\(n\) colunas da Jacobiana), enquanto o modo reverso projeta gradientes das saídas (\(m\) linhas da Jacobiana).
  • ✔ Verdadeiro — Este é o enunciado fundamental de Baur-Strassen (1983), demonstrando que o custo temporal do gradiente no modo reverso é invariante à dimensão de entrada \(n\).
  • ✗ Falso — Quando \(d_{\text{in}} \ll d_{\text{out}}\), o modo forward é ordens de grandeza mais eficiente, pois exige apenas \(d_{\text{in}}\) passagens pelo grafo contra \(d_{\text{out}}\) passagens do modo reverso.

NotaTeste 7 — Catálogo de Regras Primitivas e Trade-off de Memória
  • □ O motor de autodiff utiliza um catálogo fechado de regras analíticas locais pré-programadas para cada operação atômica, evitando deduzir derivadas em tempo de execução.
  • □ A regra da adição \(z = x + y\) atua no backward pass como um roteador neutro de fluxo, replicando integralmente o gradiente recebido para ambas as entradas (\(\bar{x} = \bar{z}\) e \(\bar{y} = \bar{z}\)).
  • □ Na regra da multiplicação \(z = x \cdot y\), o gradiente que retorna para a entrada \(x\) independe do valor numérico assumido por \(y\) durante a passagem direta.
  • □ Enquanto o modo forward mantém consumo de memória constante \(\mathcal{O}(1)\) em relação à profundidade ao descartar valores logo após o uso, o modo reverso exige \(\mathcal{O}(L)\) para reter ativações necessárias ao cálculo das derivadas locais.
Dica(Resposta) Teste 7 — Catálogo de Regras Primitivas e Trade-off de Memória
  • ✔ Verdadeiro — O framework de autodiff não deduz cálculo simbolicamente para cada programa; ele mapeia cada operação elementar (adição, produto, exp, etc.) para funções com derivadas locais analíticas fixas e pré-programadas.
  • ✔ Verdadeiro — Como \(\frac{\partial (x+y)}{\partial x} = 1\) e \(\frac{\partial (x+y)}{\partial y} = 1\), pela regra da cadeia temos \(\bar{x} = \bar{z} \cdot 1 = \bar{z}\) e \(\bar{y} = \bar{z} \cdot 1 = \bar{z}\), distribuindo o sinal de erro intacto para ambos os operandos.
  • ✗ Falso — Pela regra do produto, \(\frac{\partial (xy)}{\partial x} = y\), de modo que \(\bar{x} = y \cdot \bar{z}\). O gradiente recebido por \(x\) depende linearmente do valor numérico de \(y\) armazenado durante a passagem direta.
  • ✔ Verdadeiro — O modo forward descarta valores intermediários logo após alimentar o próximo nó (\(\mathcal{O}(1)\) na profundidade), enquanto o modo reverso precisa congelar a fita de ativações intermediárias na VRAM para alimentar as derivadas locais na volta (\(\mathcal{O}(L)\)).

NotaTeste 8 — Transferência em ML: Grafos com Múltiplas Entradas e Saídas
  • □ Em uma rede siamesa para verificação facial, onde dois ramos idênticos processam duas imagens distintas e compartilham a mesma matriz de pesos \(W\), o gradiente final em relação a \(W\) é a soma dos gradientes gerados por cada ramo individual.
  • □ Em um modelo multi-tarefa com uma perda combinada \(\mathcal{L}_{\text{total}} = \mathcal{L}_1 + \lambda \mathcal{L}_2\), uma única passagem reversa disparada a partir de \(\mathcal{L}_{\text{total}}\) é suficiente para calcular o gradiente de todos os parâmetros compartilhados.
  • □ Se uma conexão residual for adicionada a uma camada densa na forma \(\mathbf{y} = \sigma(W\mathbf{x}) + \mathbf{x}\), o gradiente em relação à entrada \(\nabla_{\mathbf{x}}\mathcal{L}\) não depende da matriz \(W\), dependendo apenas do gradiente externo.
  • □ Em arquiteturas com controle de fluxo condicional (como if x > 0: y = a * x else: y = b * x), a autodiff constrói o grafo dinamicamente em tempo de execução, diferenciando perfeitamente o ramo executado sem computar o ramo inativo.
Dica(Resposta) Teste 8 — Transferência em ML: Grafos com Múltiplas Entradas e Saídas
  • ✔ Verdadeiro — Como o nó de parâmetro \(W\) possui arestas para os dois ramos, a regra da cadeia multivariada garante que \(\bar{W} = \bar{W}_{\text{ramo 1}} + \bar{W}_{\text{ramo 2}}\).
  • ✔ Verdadeiro — Como \(\mathcal{L}_{\text{total}}\) é um escalar único, o Teorema de Baur-Strassen se aplica diretamente: uma única passagem reversa acumula as contribuições de ambas as tarefas para todos os pesos.
  • ✗ Falso — Pela regra da cadeia, \(\nabla_{\mathbf{x}}\mathcal{L} = J_{\sigma(W\mathbf{x})}^T \bar{\mathbf{y}} + I \bar{\mathbf{y}} = W^T(\bar{\mathbf{y}} \odot \sigma') + \bar{\mathbf{y}}\). O gradiente depende explicitamente de \(W\), mas possui um termo aditivo identidade \(\bar{\mathbf{y}}\) que previne o desvanecimento do gradiente.
  • ✔ Verdadeiro — Em motores de autodiff dinâmica (como PyTorch e o nosso mini-autodiff Value), o grafo de computação é construído dinamicamente traçando as operações que foram de fato executadas (define-by-run).