Aula Soluções
O gabarito comentado das questões de Verdadeiro/Falso está em soluções.qmd. Encontrou um erro numa questão? Corrija diretamente neste arquivo e abra um pull request.
Contexto e notação
Nesta lista, consideramos funções multivariadas suaves \(f: \mathbb{R}^d \to \mathbb{R}\), campos vetoriais \(\mathbf{f}: \mathbb{R}^n \to \mathbb{R}^m\), e suas composições sob a convenção de vetor-coluna para gradientes e denominator layout para Jacobianas:
- Vetor Gradiente: \(\nabla_{\mathbf{x}} f \in \mathbb{R}^{d \times 1}\) é um vetor-coluna com componentes \((\frac{\partial f}{\partial x_1}, \dots, \frac{\partial f}{\partial x_d})^T\).
- Matriz Jacobiana (Denominator Layout): Para \(\mathbf{f}: \mathbb{R}^n \to \mathbb{R}^m\), \(J_{\mathbf{f}}(\mathbf{x}) \in \mathbb{R}^{n \times m}\) possui as derivadas parciais nas colunas (\([J_{\mathbf{f}}]_{ij} = \frac{\partial f_j}{\partial x_i}\)). O gradiente da composição escalar \(h(\mathbf{x}) = g(\mathbf{f}(\mathbf{x}))\) com \(g: \mathbb{R}^m \to \mathbb{R}\) é: \[\nabla_{\mathbf{x}} h = J_{\mathbf{f}}(\mathbf{x})\, \nabla_{\mathbf{u}} g \in \mathbb{R}^{n \times 1}\]
- Perceptron Multicamadas (MLP): Camada \(l \in \{1, \dots, L\}\): \[\mathbf{z}^{(l)} = W^{(l)}\mathbf{a}^{(l-1)} + \mathbf{b}^{(l)} \in \mathbb{R}^{d_l}, \quad \mathbf{a}^{(l)} = \sigma(\mathbf{z}^{(l)}) \in \mathbb{R}^{d_l}\] onde \(\mathbf{a}^{(0)} = \mathbf{x} \in \mathbb{R}^{d_0}\), \(W^{(l)} \in \mathbb{R}^{d_l \times d_{l-1}}\) e \(\mathbf{b}^{(l)} \in \mathbb{R}^{d_l}\).
- Sensibilidade Pré-Sináptica e Retropropagação: \(\boldsymbol{\delta}^{(l)} := \nabla_{\mathbf{z}^{(l)}}\mathcal{L} \in \mathbb{R}^{d_l}\). A recorrência retrógrada obedece: \[\boldsymbol{\delta}^{(l)} = \big((W^{(l+1)})^T \boldsymbol{\delta}^{(l+1)}\big) \odot \sigma'(\mathbf{z}^{(l)})\] com gradientes dos parâmetros dados por: \[\nabla_{W^{(l)}}\mathcal{L} = \boldsymbol{\delta}^{(l)}(\mathbf{a}^{(l-1)})^T \in \mathbb{R}^{d_l \times d_{l-1}}, \quad \nabla_{\mathbf{b}^{(l)}}\mathcal{L} = \boldsymbol{\delta}^{(l)} \in \mathbb{R}^{d_l}\]
- Grafos de Computação (DAGs): Programas expressos como grafos acíclicos de operações atômicas \(v_i = \phi_i(v_{\text{Pa}(i)})\).
- Modo Forward (Tangente): \(\dot{v}_i = \frac{\partial v_i}{\partial x_k} = \sum_{j \in \text{Pa}(i)} \frac{\partial \phi_i}{\partial v_j} \dot{v}_j\), com custo temporal \(\mathcal{O}(d_{\text{in}} \cdot C_{\text{eval}})\).
- Modo Reverse (Adjunto): \(\bar{v}_i = \frac{\partial \mathcal{L}}{\partial v_i} = \sum_{k \in \text{Ch}(i)} \bar{v}_k \frac{\partial \phi_k}{\partial v_i}\), com custo temporal \(\mathcal{O}(d_{\text{out}} \cdot C_{\text{eval}})\).
- Catálogo de Regras Primitivas Pré-Programadas: A autodiff baseia-se em derivadas locais analíticas tabeladas para operações atômicas (ex: adição \(z=x+y \implies \frac{\partial z}{\partial x}=1, \frac{\partial z}{\partial y}=1\), multiplicação \(z=xy \implies \frac{\partial z}{\partial x}=y, \frac{\partial z}{\partial y}=x\)). O modo reverso retém ativações na memória (\(\mathcal{O}(L)\)), enquanto o modo forward descarta variáveis intermediárias imediatamente (\(\mathcal{O}(1)\)).
Questões discursivas
- Retropropagação em Arquiteturas com Conexões Residuais (ResNets). Considere um bloco residual onde a ativação da camada \(l+1\) incorpora a ativação anterior sem transformação de pesos: \[\mathbf{z}^{(l+1)} = W^{(l+1)} \mathbf{a}^{(l)} + \mathbf{b}^{(l+1)}, \quad \mathbf{a}^{(l+1)} = \sigma(\mathbf{z}^{(l+1)}) + \mathbf{a}^{(l)}\] onde \(\mathbf{a}^{(l)}, \mathbf{a}^{(l+1)} \in \mathbb{R}^d\) e \(W^{(l+1)} \in \mathbb{R}^{d \times d}\). Suponha conhecido o vetor de sensibilidade \(\boldsymbol{\delta}^{(l+1)} = \nabla_{\mathbf{z}^{(l+1)}} \mathcal{L}\) e a sensibilidade de saída \(\mathbf{s}^{(l+1)} := \nabla_{\mathbf{a}^{(l+1)}} \mathcal{L}\).
- Utilizando a regra da cadeia multivariada, deduza a expressão analítica do vetor de sensibilidade \(\mathbf{s}^{(l)} := \nabla_{\mathbf{a}^{(l)}} \mathcal{L}\) recebido pela camada \(l\).
- Mostre que o gradiente transmitido contém um termo aditivo identidade independente de \(W^{(l+1)}\), explicando por que essa estrutura impede o desvanecimento do gradiente (vanishing gradient) mesmo quando a rede possui centenas de camadas.
- Análise Comparativa de Complexidade: Modo Forward vs. Modo Reverse. Considere duas arquiteturas comuns de Aprendizado de Máquina:
- Cenário A (Classificador em Larga Escala): Mapeia um documento ou imagem \(\mathbf{x} \in \mathbb{R}^{100.000}\) para uma perda escalar de entropia cruzada \(\mathcal{L} \in \mathbb{R}\).
- Cenário B (Decodificador de Autoencoder / Gerador de Imagem): Mapeia um código latente \(\mathbf{z} \in \mathbb{R}^{16}\) para uma imagem sintetizada de alta resolução \(\hat{\mathbf{y}} \in \mathbb{R}^{1024 \times 1024 \times 3} \approx \mathbb{R}^{3.145.728}\), e deseja-se calcular a matriz Jacobiana completa \(J = \frac{\partial \hat{\mathbf{y}}}{\partial \mathbf{z}}\) para análise de controlabilidade latente. Para cada cenário:
- Determine o número de passagens completas pelo grafo necessárias para obter a derivada total no modo forward e no modo reverse.
- Com base no Teorema de Baur-Strassen e na dimensão dos espaços, indique qual dos dois modos de autodiff é computacionalmente ótimo em cada caso e quantifique a razão aproximada de ganho de velocidade.
- Cancelamento Subtrativo e Estabilidade Numérica de Diferenças Finitas. Seja \(f(x) = \sin(x)\) avaliada em precisão dupla IEEE 754 (\(\epsilon_{\text{mach}} \approx 2{,}22 \times 10^{-16}\)). O erro total de aproximação da derivada via diferença progressiva \(D_h f(x) = \frac{f(x+h) - f(x)}{h}\) pode ser modelado por: \[E(h) = \frac{M_2}{2} h + \frac{2 \epsilon_{\text{mach}}}{h}\] onde \(M_2 = \max |f''(x)| = 1\).
- Encontre o tamanho de passo ótimo \(h^\star\) que minimiza o erro total \(E(h)\) e determine a ordem de grandeza do erro mínimo alcançável \(E(h^\star)\).
- Explique por que, mesmo utilizando o passo ótimo \(h^\star\), a diferenciação numérica é incapaz de atingir a precisão exata da Diferenciação Automática.
Questões de Verdadeiro/Falso
- □ 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.
- □ 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.
- □ 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.
- □ 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.
- □ 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.
- □ 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}}\)).
- □ 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.
- □ 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.