Soluções — Aula 9: Funções Compostas, Redes Neurais e Diferenciação Automática
Otimização e Álgebra Linear para Machine Learning
Soluções das Questões de Verdadeiro/Falso
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.
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.
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.
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.
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.
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.
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)\)).
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).