| MedInc | HouseAge | MedHouseVal | |
|---|---|---|---|
| 0 | 3.5987 | 31.0 | 3.405 |
| 1 | 1.4267 | 37.0 | 0.523 |
| 2 | 4.0455 | 33.0 | 1.972 |
| 3 | 3.5500 | 36.0 | 2.128 |
| 4 | 2.3393 | 19.0 | 1.182 |
Aula 6: Derivadas Parciais, Jacobiano e o Vetor Gradiente
Álgebra Linear e Otimização para Aprendizado de Máquina
1 Revisão e Introdução
1.1 Revisão Rápida: Onde a Aula 5 Parou
A Aula 5 respondeu como decompor qualquer matriz retangular: a Decomposição em Valores Singulares, \(X=U\Sigma V^T\), construída diretamente a partir do Teorema Espectral (Aula 4) aplicado a \(X^TX\) e \(XX^T\). A partir dela, o Teorema de Eckart-Young-Mirsky garantiu que truncar essa soma nos \(k\) primeiros termos produz a melhor aproximação possível de posto \(k\) (em norma espectral, e também de Frobenius, pela generalização de Mirsky); e a Decomposição Polar reorganizou os mesmos três fatores em \(X=QS\), uma parte que só gira (\(Q\)) e uma parte que só estica ao longo de direções ortogonais (\(S\)).
1.2 Um Corte Real: da Álgebra Linear ao Cálculo
Vale marcar essa transição com todas as letras, porque ela é genuína, não só uma mudança de assunto dentro do mesmo tipo de ferramenta: as cinco aulas anteriores construíram uma linguagem para representar e decompor dados estáticos — espaços vetoriais, sistemas lineares, projeções, autovalores, SVD. Em nenhum momento, até aqui, o curso precisou perguntar “como ajustar alguma coisa para reduzir um erro” — as Equações Normais (Aula 3) deram a resposta de uma vez só, via uma fórmula fechada, \(\hat{\mathbf{w}}=(X^TX)^{-1}X^T\mathbf{y}\), sem nenhum processo iterativo de tentativa e ajuste.
Mas olhe com atenção para como a Aula 3 chegou a essa fórmula: o argumento geométrico foi “a projeção ortogonal \(\hat{\mathbf{y}}\) minimiza a distância \(\|\mathbf{y}-X\mathbf{w}\|^2\) sobre todos os \(\mathbf{w}\)” — ou seja, encontrar o mínimo de uma função (a perda \(L(\mathbf{w})=\|\mathbf{y}-X\mathbf{w}\|^2\)) sobre o vetor de parâmetros \(\mathbf{w}\). Minimizar uma função de várias variáveis é, por definição, um problema de Cálculo: precisa de uma noção precisa do que significa “a função parar de diminuir” quando há mais de uma variável envolvida. A Aula 3 usou essa ideia (implicitamente, via um argumento geométrico de projeção) sem nunca defini-la formalmente. É exatamente essa lacuna que a Parte 2 do curso — “Cálculo da Otimização Diferenciável” — começa a fechar hoje.
1.3 Roteiro da Aula
A pergunta que fecha essa lacuna — “o que significa, formalmente, uma função de várias variáveis ‘parar de diminuir’, e como calcular isso na prática?” — se desdobra em quatro perguntas mais específicas:
- O que é uma derivada parcial, e por que ela sozinha não basta para descrever como uma função muda em qualquer direção?
- Como generalizar a derivada para um vetor-gradiente, e como calculá-lo por extenso para uma perda quadrática real?
- O que é a derivada direcional, e por que o gradiente aponta, comprovadamente, na direção de subida mais íngreme?
- Como generalizar o gradiente para uma função que devolve vários números ao mesmo tempo — o Jacobiano?
1.4 Problema Motivador
Volte ao problema-fio desta disciplina: prever MedHouseVal a partir de 4 atributos do California Housing, através de \(L(\boldsymbol{\beta})=\|X\boldsymbol{\beta}-\mathbf{y}\|^2\). A Aula 3 resolveu isso de uma vez, via \(X^TX\hat{\boldsymbol{\beta}}=
X^T\mathbf{y}\). Mas imagine um cenário ligeiramente diferente: um modelo com milhões de parâmetros (não \(4\)) — o caso típico de uma rede neural — onde resolver um sistema linear do tamanho de \(\boldsymbol{\beta}\) está fora de cogitação computacionalmente. Pense por um instante, sem fórmula nenhuma ainda: dado um \(\boldsymbol{\beta}\) qualquer (não necessariamente o ótimo), em que direção especificamente eu deveria mover \(\boldsymbol{\beta}\) para reduzir \(L(\boldsymbol{\beta})\) o mais rápido possível, usando só informação local (sem resolver sistema nenhum)?
Dica: pense no que o Cálculo de uma variável (ensino médio/cálculo 1) já ensina sobre encontrar mínimos, e o que muda quando há mais de uma variável.
- □ Com um único parâmetro, encontrar o mínimo de uma função suave se resume a igualar sua derivada a zero — mas “a derivada” de uma função de 4 variáveis não é um único número, o que já indica que o objeto matemático certo precisa ser diferente.
- □ Se \(L(\boldsymbol{\beta})\) dependesse de exatamente 2 parâmetros em vez de 4, o problema de encontrar a direção de maior redução deixaria de fazer sentido, porque só existiria uma única direção possível de se mover (aumentar ou diminuir).
- □ Numa rede neural com milhões de pesos, a mesma pergunta — “que direção reduz a perda mais rápido, usando só informação local?” — é exatamente o problema que o algoritmo de treinamento precisa resolver a cada passo.
- □ Como resolver as Equações Normais é sempre possível em qualquer escala de parâmetros (bastaria formar \(X^TX\) maior), isso implica que não há motivo prático para se preocupar com “direção de redução mais rápida” fora de exemplos de brinquedo.
2 Derivada Parcial
2.1 Variando uma Variável de Cada Vez
A ideia central da derivada parcial é simples de enunciar antes de qualquer fórmula: para entender como uma função de várias variáveis \(f(x_1,\dots,x_n)\) muda, fixe todas as variáveis exceto uma, e aplique a derivada de uma variável só (a mesma do Cálculo 1) àquela variável isolada. Formalmente (tradução livre, MathML, Def. 5.5, p. 146):
Note que cada derivada parcial \(\partial f/\partial x_i\) é, ela mesma, exatamente a derivada de uma variável (Cálculo 1) da função que se obtém “congelando” todas as outras variáveis em seus valores atuais — nenhuma ferramenta nova é necessária para calcular uma derivada parcial isoladamente, só disciplina de tratar as demais variáveis como constantes durante o cálculo.
2.2 Aplicando à Perda Quadrática: um Exemplo Concreto
Vamos aplicar essa definição diretamente ao problema-fio, numa versão simplificada com só \(2\) parâmetros para deixar a conta manejável à mão. Tome uma amostra pequena de \(5\) bairros do California Housing e só \(2\) atributos (MedInc, HouseAge):
A perda para essa amostra, com \(2\) parâmetros \(\boldsymbol{\beta}=(\beta_1,\beta_2)\), é \[ L(\beta_1,\beta_2) = \sum_{i=1}^5\big(\beta_1\,\texttt{MedInc}_i+ \beta_2\,\texttt{HouseAge}_i - \texttt{MedHouseVal}_i\big)^2 . \] Escolhendo o ponto \((\beta_1,\beta_2)=(0{,}5;\ 0{,}02)\), a Definição 5.5 diz que \(\partial L/\partial\beta_1\) é o limite de \([L(\beta_1+h,\beta_2)-L(\beta_1,\beta_2)]/h\) quando \(h\to 0\) — vamos calcular esse limite numericamente, aproximando-o com um \(h\) bem pequeno, e comparar com a derivada exata obtida expandindo o quadrado à mão.
L(0.5, 0.02) = 2.612078
dL/db1: limite numérico (h=0.0001) = 5.641952 | fórmula exata 2*sum(r*MedInc) = 5.637009
dL/db2: limite numérico (h=0.0001) = 95.547400 | fórmula exata 2*sum(r*HouseAge) = 95.039800
Os dois valores praticamente coincidem (diferença na quinta casa decimal, puro efeito do \(h\) finito usado para aproximar o limite) — confirmando que a Definição 5.5, aplicada literalmente, concorda com a derivada obtida por manipulação algébrica direta (expandir o quadrado e usar a regra da cadeia de uma variável, Cálculo 1): para \(r_i:= \beta_1\texttt{MedInc}_i+\beta_2\texttt{HouseAge}_i- \texttt{MedHouseVal}_i\), \[ \frac{\partial L}{\partial\beta_1} = 2\sum_{i=1}^5 r_i\, \texttt{MedInc}_i, \qquad \frac{\partial L}{\partial\beta_2} = 2\sum_{i=1}^5 r_i\,\texttt{HouseAge}_i . \] Note a estrutura: cada derivada parcial “isola” o efeito de um atributo, multiplicando o resíduo pela coluna correspondente — é exatamente essa estrutura, generalizada para \(n\) variáveis e escrita em notação matricial, que o Bloco 3 vai formalizar como o gradiente.
HouseAge removido do modelo), o que aconteceria com \(\partial L/\partial\beta_2\)?
Dica: pense em qual das duas variáveis literalmente deixaria de existir na função.
- □ Se a perda dependesse só de \(\beta_1\), a derivada parcial \(\partial L/\partial\beta_2\) deixaria de fazer sentido, porque \(\beta_2\) nem apareceria mais na expressão de \(L\).
- □ Se, no ponto \((\beta_1,\beta_2)=(0,0)\), o resíduo \(r_i\) fosse identicamente igual a
MedHouseVal\(_i\) (com sinal trocado) para todos os \(5\) bairros, isso não impediria calcular \(\partial L/\partial\beta_1\) nesse ponto normalmente. - □ Numa perda de regressão logística (classificação binária) com \(2\) parâmetros, o mesmo procedimento — fixar um parâmetro e derivar isoladamente o outro — se aplicaria sem nenhuma alteração conceitual.
- □ Como a derivada parcial usa a mesma fórmula da derivada de uma variável do Cálculo 1, isso implica que o valor de \(\partial L/\partial\beta_1\) nunca depende do valor de \(\beta_2\) no ponto onde é calculada.
3 O Gradiente como Vetor e as Regras de Derivação
3.1 Coletando as Derivadas Parciais num Vetor
A Definição 5.5, por completo (não só a parte usada no Bloco 2), não para nas derivadas parciais isoladas — ela as coleta num único objeto:
Aviso de convenção, explícito: o MathML define o gradiente como vetor-linha, não vetor-coluna — uma escolha deliberada, não universal (outros textos usam coluna). A justificativa (tradução livre, MathML, Remark, p. 147):
Vale registrar, para não causar confusão mais adiante: em vários lugares da literatura de aprendizado de máquina (e em parte da notação usada em cursos de otimização), o gradiente aparece como vetor-coluna — a Aula 8 (Gradiente Descendente) vai usar essa forma na atualização \(\mathbf{w}_{t+1}=\mathbf{w}_t-\gamma\nabla L(\mathbf{w}_t)\) (subtração de vetor-coluna de vetor-coluna). As duas convenções carregam exatamente a mesma informação (uma é a transposta da outra) — o que importa é nunca misturar as duas dentro do mesmo cálculo.
3.2 As Regras Básicas de Derivação
Para derivar o gradiente da perda quadrática por extenso, precisamos de três regras — as mesmas do Cálculo 1, generalizadas para derivadas parciais (tradução livre, MathML, §5.2.1, p. 147-148):
3.3 Desenvolvimento Principled: o Gradiente da Perda Quadrática
Vamos agora derivar o gradiente completo de \(L(\boldsymbol{\beta})=\|X\boldsymbol{\beta}-\mathbf{y}\|^2\), para os \(4\) parâmetros do problema-fio, deixando cada passo lógico visível — sem pular direto para a fórmula final.
Premissa. Defina o vetor resíduo \(\mathbf{r}(\boldsymbol{\beta}):= X\boldsymbol{\beta}-\mathbf{y}\in\mathbb{R}^N\) (função vetorial de \(\boldsymbol{\beta}\), com \(N=16\,640\)), de modo que \(L(\boldsymbol{ \beta})=\mathbf{r}(\boldsymbol{\beta})^T\mathbf{r}(\boldsymbol{\beta})= \sum_{i=1}^N r_i(\boldsymbol{\beta})^2\), onde \(r_i(\boldsymbol{\beta})=\sum_{k=1}^4 X_{ik}\beta_k-y_i\) (a \(i\)-ésima componente do resíduo, uma função afim de \(\boldsymbol{\beta}\)).
Passo 1 (regra da soma + regra da cadeia, aplicadas termo a termo). Para cada componente \(\beta_j\) do vetor de parâmetros, a regra da soma permite derivar \(L=\sum_ir_i^2\) termo a termo: \[ \frac{\partial L}{\partial\beta_j} = \sum_{i=1}^N \frac{\partial}{\partial\beta_j}\big(r_i(\boldsymbol{\beta})^2\big) . \] Cada termo \(r_i(\boldsymbol{\beta})^2\) é a composição \(h(r_i(\boldsymbol{\beta}))\) com \(h(t)=t^2\) — a regra da cadeia (agora aplicada com \(h'(t)=2t\), Cálculo 1) dá \[ \frac{\partial}{\partial\beta_j}\big(r_i(\boldsymbol{\beta})^2\big) = 2\,r_i(\boldsymbol{\beta})\cdot\frac{\partial r_i(\boldsymbol{\beta})} {\partial\beta_j} . \]
Passo 2 (derivando a parte afim). Como \(r_i(\boldsymbol{\beta})=\sum_{k=1}^4X_{ik}\beta_k-y_i\) é afim em \(\boldsymbol{\beta}\), \(\partial r_i/\partial\beta_j=X_{ij}\) diretamente (o único termo da soma que depende de \(\beta_j\) é \(X_{ij}\beta_j\), com derivada \(X_{ij}\); \(y_i\) é constante em relação a \(\boldsymbol{\beta}\)).
Passo 3 (montando o gradiente). Substituindo o Passo 2 no Passo 1, \[ \frac{\partial L}{\partial\beta_j} = \sum_{i=1}^N 2\,r_i (\boldsymbol{\beta})\,X_{ij} = 2\sum_{i=1}^N X_{ij}\,r_i(\boldsymbol{ \beta}) = 2\,(X^T\mathbf{r}(\boldsymbol{\beta}))_j , \] reconhecendo a soma \(\sum_iX_{ij}r_i\) como a \(j\)-ésima componente do produto \(X^T\mathbf{r}(\boldsymbol{\beta})\). Coletando as \(4\) componentes no vetor-linha da Definição 5.5, \[ \nabla_{\boldsymbol{\beta}}L = \big[2(X^T\mathbf{r})_1\ \ \cdots\ \ 2(X^T\mathbf{r})_4\big] = 2\,(X^T\mathbf{r}(\boldsymbol{\beta}))^T = 2\,\mathbf{r}(\boldsymbol{\beta})^TX = 2(X\boldsymbol{\beta}- \mathbf{y})^TX \in \mathbb{R}^{1\times 4} . \]
A ponte com a Aula 3. Igualar o gradiente a zero, \(\nabla_{\boldsymbol{\beta}}L=\mathbf{0}\), dá \(2(X\boldsymbol{\beta}-\mathbf{y})^TX=\mathbf{0}\); transpondo (um vetor-linha nulo transposto é um vetor-coluna nulo) e dividindo por \(2\), \(X^T(X\boldsymbol{\beta}-\mathbf{y})=\mathbf{0}\iff X^TX\boldsymbol{\beta}=X^T\mathbf{y}\) — exatamente as Equações Normais da Aula 3. A condição geométrica “resíduo ortogonal ao espaço-coluna” (Aula 3) e a condição analítica “gradiente da perda zero” (esta aula) são, agora, comprovadamente a mesma condição, vistas por duas portas diferentes.
3.4 Verificação Numérica no Problema-Fio
Vamos conferir a fórmula \(\nabla_{\boldsymbol{\beta}}L=2(X\boldsymbol{ \beta}-\mathbf{y})^TX\) calculando-a em \(\boldsymbol{\beta}_0=(0{,}4;\ 0{,}02;\ -0{,}15;\ 0{,}7)\) — um ponto qualquer, não o ótimo — e comparando com a derivada parcial por diferença finita central em cada uma das \(4\) coordenadas.
beta0 = [ 0.4 0.02 -0.15 0.7 ]
L(beta0) = 10862.179369274
gradiente (fórmula 2 X^T r, forma coluna): [-5846.1288 71951.8811 4014.1279 1643.7195]
gradiente (diferença finita central): [-5846.1288 71951.8811 4014.1279 1643.7195]
diferença máxima absoluta: 8.144434104906395e-08
As duas colunas de números coincidem até a quarta casa decimal — a diferença residual (\(<10^{-6}\) em valor absoluto) é só o erro de truncamento da diferença finita, não um erro na fórmula analítica. Note que a fórmula foi calculada na forma vetor-coluna (\(2X^T\mathbf{r}\)) neste chunk — a mesma informação do vetor-linha \(2\mathbf{r}^TX\) derivado acima, só transposta, já antecipando a convenção que a Aula 8 vai usar.
Dica: releia o Passo 1 e aponte, com precisão, qual regra deixa de valer.
- □ Trocar \(\sum_ir_i^2\) por \(\sum_i|r_i|\) quebraria o Passo 1 especificamente no ponto em que se usa a regra da cadeia com \(h(t)=t^2\), \(h'(t)=2t\) — porque \(h(t)=|t|\) não é diferenciável em \(t=0\).
- □ Se, em vez de \(4\) parâmetros, o modelo tivesse \(1000\) parâmetros, a mesma derivação dos Passos 1-3 se aplicaria, produzindo \(\nabla_{\boldsymbol{\beta}}L=2(X\boldsymbol{\beta}-\mathbf{y})^TX\) com \(X\in\mathbb{R}^{N\times1000}\).
- □ Numa camada de regressão com regularização Ridge (perda \(\|X\boldsymbol{\beta}-\mathbf{y}\|^2+\lambda\|\boldsymbol{\beta}\|^2\)), a mesma regra da soma do Passo 1 permite derivar o termo de regularização separadamente e somar ao gradiente já calculado.
- □ Como o Passo 2 usa que \(r_i(\boldsymbol{\beta})\) é afim em \(\boldsymbol{\beta}\), isso implica que a fórmula \(\nabla_{\boldsymbol{\beta}}L=2\mathbf{r}^TX\) só vale porque \(X\) é a matriz de design do California Housing especificamente, não para qualquer matriz \(X\) de mesmo formato.
4 Derivada Direcional e a Direção de Subida Mais Íngreme
4.1 O Que o Gradiente Ainda Não Responde
Cada derivada parcial \(\partial L/\partial\beta_j\) mede a taxa de variação de \(L\) ao longo de um eixo coordenado — o que acontece se \(\beta_1\) variar sozinho, mantendo os demais fixos. Mas nada obriga um ajuste de parâmetros a se mover só ao longo de um eixo: um passo de treinamento pode (e, em geral, vai) mudar todos os parâmetros ao mesmo tempo, numa direção arbitrária \(\mathbf{v}\in\mathbb{R}^4\). A pergunta do Problema Motivador — “em que direção mover \(\boldsymbol{\beta}\) para reduzir \(L\) mais rápido?” — não é uma pergunta sobre eixos coordenados; é uma pergunta sobre todas as direções possíveis simultaneamente. Isso pede um objeto novo: a derivada direcional.
Aviso de fonte: nenhuma das três fontes bibliográficas desta disciplina define formalmente derivada direcional no material já coberto por este curso — o termo não aparece no MathML; aparece em optml.pdf (Wright & Recht, §8.2), mas esse livro está reservado para Lições de otimização não-suave, mais adiante. A definição e a prova abaixo são, portanto, construção nossa, usando só ferramentas já disponíveis (regra da cadeia, Bloco 3; desigualdade de Cauchy-Schwarz, Aula 1).
4.2 Definindo a Derivada Direcional
Note que essa definição generaliza a derivada parcial: tomando \(\mathbf{v}=\mathbf{e}_j\) (o \(j\)-ésimo vetor da base canônica, norma \(1\)), \(D_{\mathbf{e}_j}f(\mathbf{x})=\partial f/\partial x_j\) exatamente — a derivada parcial é a derivada direcional numa direção particular (ao longo de um eixo).
Premissas. Para calcular \(D_{\mathbf{v}}f(\mathbf{x})\) em termos do gradiente, defina a função auxiliar de uma variável real \(g(h):=f(\mathbf{x}+h\mathbf{v})\) — note que \(D_{\mathbf{v}}f(\mathbf{x})=g'(0)\) diretamente pela definição acima (a mesma razão incremental).
Passo 1 (regra da cadeia). Escrevendo \(x_i(h):=x_i+hv_i\) (cada coordenada de \(\mathbf{x}+h\mathbf{v}\), afim em \(h\)), a regra da cadeia multivariada (a mesma lógica do Passo 1 do Bloco 3, agora com \(h\) no lugar de \(\beta_j\)) dá \[ g'(h) = \sum_{i=1}^n \frac{\partial f}{\partial x_i}\Big(\mathbf{x}+ h\mathbf{v}\Big)\cdot\frac{dx_i(h)}{dh} = \sum_{i=1}^n\frac{\partial f}{\partial x_i}\Big(\mathbf{x}+h\mathbf{v}\Big)\cdot v_i , \] usando \(dx_i(h)/dh=v_i\) (derivada de uma função afim em \(h\)).
Passo 2 (avaliando em \(h=0\)). Em \(h=0\), \[ D_{\mathbf{v}}f(\mathbf{x}) = g'(0) = \sum_{i=1}^n\frac{\partial f} {\partial x_i}(\mathbf{x})\,v_i = \nabla f(\mathbf{x})\,\mathbf{v} , \] reconhecendo a soma como o produto do vetor-linha \(\nabla f(\mathbf{x})\) (Bloco 3) pelo vetor-coluna \(\mathbf{v}\) — ou, equivalentemente, o produto interno entre \(\nabla f(\mathbf{x})^T\) e \(\mathbf{v}\) (Aula 1).
4.3 A Direção de Subida Mais Íngreme
Agora a pergunta central: entre todas as direções unitárias \(\mathbf{v}\), qual maximiza \(D_{\mathbf{v}}f(\mathbf{x})\) — isto é, dá a maior taxa de aumento de \(f\)? O MathML afirma a resposta sem provar (“a derivada de \(f\) aponta na direção de subida mais íngreme de \(f\)”, Def. 5.2, p. 141; reafirmado no Cap. 7, p. 227-228, sem demonstração em nenhum dos dois lugares). Provamos abaixo, usando a desigualdade de Cauchy-Schwarz (Aula 1).
Prova. Pelo Bloco anterior, \(D_{\mathbf{v}}f(\mathbf{x})=\nabla f(\mathbf{x})\mathbf{v}=\langle\nabla f(\mathbf{x})^T,\mathbf{v} \rangle\) (produto interno padrão, identificando o vetor-linha \(\nabla f(\mathbf{x})\) com sua transposta vetor-coluna). Pela desigualdade de Cauchy-Schwarz (Aula 1), \[ \big|\langle\nabla f(\mathbf{x})^T,\mathbf{v}\rangle\big| \le \|\nabla f(\mathbf{x})^T\|\,\|\mathbf{v}\| = \|\nabla f(\mathbf{x})\|\cdot 1 = \|\nabla f(\mathbf{x})\| , \] com igualdade se, e somente se, \(\mathbf{v}\) e \(\nabla f(\mathbf{x})^T\) forem paralelos (mesma direção, já que buscamos o máximo, não o mínimo, da derivada direcional — a direção oposta dá o mínimo). Como \(\|\mathbf{v}\|=1\), o único vetor unitário paralelo a \(\nabla f(\mathbf{x})^T\) e de mesmo sentido é \(\mathbf{v}^\star=\nabla f(\mathbf{x})^T/\|\nabla f(\mathbf{x})\|\). Substituindo, \[ D_{\mathbf{v}^\star}f(\mathbf{x}) = \Big\langle\nabla f(\mathbf{x})^T, \frac{\nabla f(\mathbf{x})^T}{\|\nabla f(\mathbf{x})\|}\Big\rangle = \frac{\|\nabla f(\mathbf{x})\|^2}{\|\nabla f(\mathbf{x})\|} = \|\nabla f(\mathbf{x})\| , \] que bate exatamente com a cota superior de Cauchy-Schwarz — logo \(\mathbf{v}^\star\) atinge o máximo, e o valor máximo é \(\|\nabla f(\mathbf{x})\|\). \(\blacksquare\)
Ou seja: o gradiente (transposto para vetor-coluna) é, a menos de normalização, a direção de subida mais íngreme — e sua norma é a taxa de aumento nessa direção ótima. A direção oposta, \(-\nabla f(\mathbf{x})^T/\|\nabla f(\mathbf{x})\|\), é, pela mesma conta, a direção de descida mais íngreme — exatamente o que a Aula 8 (Gradiente Descendente) vai usar para dar passos que diminuem a perda o mais rápido possível.
4.4 Verificação Numérica e Geométrica
Para visualizar, volte ao exemplo bivariado do Bloco 2 (amostra de \(5\) bairros, \(2\) parâmetros), no ponto \((\beta_1,\beta_2)=(0{,}5;\ 0{,}02)\). O gradiente ali é \(\nabla L\approx[5{,}637\ \ 95{,}040]\) (norma \(\approx 95{,}207\)). Vamos calcular \(D_{\mathbf{v}}L\) para vetores unitários \(\mathbf{v}\) ao longo de todos os ângulos possíveis, e confirmar que o máximo ocorre exatamente na direção do gradiente.
gradiente 2D em b0: [ 5.637 95.0398], norma = 95.2068
ângulo do gradiente: 86.61 graus
max(D_v) sobre a grade de ângulos: 95.2061 (em theta = 86.83 graus)
O painel direito confirma a Proposição numericamente: \(D_{\mathbf{v}}L\) varia como um cosseno em função do ângulo de \(\mathbf{v}\), atingindo seu valor máximo — igual a \(\|\nabla L\|\approx 95{,}207\) — exatamente no ângulo do gradiente (\(\approx 86{,}6°\)), e seu valor mínimo (mesma magnitude, sinal trocado) na direção oposta; essa conta não depende de nenhuma escolha de escala de desenho, é o cálculo exato de \(\nabla L\cdot\mathbf{v}\) para cada ângulo. O painel esquerdo situa essa direção no mapa de curvas de nível: o gradiente (seta azul, com comprimento ampliado para ficar visível) aponta para fora, no sentido de crescimento de \(L\), a partir do ponto \((\beta_1,\beta_2)=(0{,}5; \,0{,}02)\) (ponto vermelho). Aviso de leitura: como os eixos \(\beta_1\) e \(\beta_2\) têm faixas bem diferentes neste gráfico (para manter as curvas de nível legíveis), a seta não aparece visualmente perpendicular às curvas neste desenho especificamente — essa ortogonalidade (citada no Cap. 7 do MathML, “o gradiente aponta numa direção ortogonal às curvas de nível”) só fica visualmente exata com eixos de mesma escala; o fato matemático em si (provado na Proposição, via Cauchy-Schwarz) não depende de nenhuma escolha de desenho.
Dica: releia a hipótese exata da Proposição, com atenção ao que ela exige sobre \(\nabla f(\mathbf{x})\).
- □ Se \(\nabla f(\mathbf{x})=\mathbf{0}\), a Proposição simplesmente não se aplica (sua hipótese exige \(\nabla f(\mathbf{x})\ne\mathbf{0}\)) — não há nenhuma direção que aumente \(f\) a uma taxa positiva de primeira ordem nesse ponto.
- □ Se \(D_{\mathbf{v}}f(\mathbf{x})\) fosse a mesma para duas direções unitárias distintas \(\mathbf{v}_1\ne\mathbf{v}_2\), isso implicaria necessariamente que \(\nabla f(\mathbf{x})=\mathbf{0}\).
- □ Numa superfície de perda de uma rede neural com múltiplos mínimos locais, a mesma proposição garante que, em qualquer ponto com gradiente não-nulo, existe uma única direção de subida mais íngreme, independente de quantos mínimos locais existam na superfície inteira.
- □ Como a derivada direcional generaliza a derivada parcial (\(\mathbf{v}=\mathbf{e}_j\)), isso implica que o valor máximo de \(D_{\mathbf{v}}f(\mathbf{x})\) sobre todas as direções é sempre igual a alguma das derivadas parciais \(\partial f/\partial x_j\) individuais.
5 O Jacobiano: Generalizando para Funções Vetoriais
5.1 Quando a Função Devolve Vários Números de Uma Vez
O gradiente (Bloco 3) foi construído para funções \(f:\mathbb{R}^n\to \mathbb{R}\) — um número de entrada vetorial, um número de saída escalar. Mas nem toda função relevante desta disciplina é assim: o próprio resíduo, \(\mathbf{r}(\boldsymbol{\beta}):=X\boldsymbol{\beta}- \mathbf{y}\), usado como peça intermediária no Bloco 3, é uma função \(\mathbb{R}^4\to\mathbb{R}^{16\,640}\) — devolve um número por observação, não um único escalar. Precisamos generalizar o gradiente para dar conta desse caso.
Convenção de disposição (MathML, tradução nossa, Remark, p. 150-151): “Neste livro, usamos a disposição numerator layout da derivada, isto é, a derivada \(df/d\mathbf{x}\) de \(f\in\mathbb{R}^m\) em relação a \(\mathbf{x}\in\mathbb{R}^n\) é uma matriz \(m\times n\), em que os elementos de \(f\) definem as linhas e os elementos de \(\mathbf{x}\) definem as colunas […] Existe também a disposição denominator layout, que é a transposta da disposição numerator layout.” — a mesma cautela de convenção do Bloco 3 (linha vs. coluna) reaparece aqui, agora para matrizes.
5.2 O Jacobiano do Resíduo: \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\)
Aplicando a Definição 5.6 diretamente a \(\mathbf{r}(\boldsymbol{\beta})=X\boldsymbol{\beta}-\mathbf{y}\) (\(n=4\) parâmetros, \(m=16\,640\) observações): a \(i\)-ésima componente é \(r_i(\boldsymbol{\beta})=\sum_{k=1}^4X_{ik}\beta_k-y_i\) (a mesma função afim do Passo 2 do Bloco 3), logo \[ J_{\mathbf{r}}(i,j) = \frac{\partial r_i}{\partial\beta_j} = X_{ij} \qquad\Longrightarrow\qquad J_{\mathbf{r}}(\boldsymbol{\beta}) = X . \] O Jacobiano do resíduo é, literalmente, a matriz de design \(X\) — a mesma matriz usada desde a Aula 1 para representar o dataset. Isso não é coincidência: para qualquer função afim \(\mathbf{r}(\boldsymbol{\beta})=A\boldsymbol{\beta}+\mathbf{c}\), o Jacobiano é sempre a própria matriz \(A\), constante — o mesmo fato, dito de outro jeito, do Passo 2 do Bloco 3 (\(\partial r_i/\partial\beta_j= X_{ij}\), sem depender de \(\boldsymbol{\beta}\)).
5.3 A Regra da Cadeia com Jacobiano Recupera o Bloco 3
O MathML resolve exatamente este problema — perda de mínimos quadrados de um modelo linear — como exemplo do uso da regra da cadeia com Jacobiano (tradução livre e adaptação de notação, MathML, Exemplo 5.11, pp. 153-154; usam \(\mathbf{e}(\boldsymbol{\theta})=\mathbf{y}-\Phi \boldsymbol{\theta}\) e \(L(\mathbf{e})=\|\mathbf{e}\|^2\), com sinal oposto ao nosso \(\mathbf{r}=X\boldsymbol{\beta}-\mathbf{y}= -\mathbf{e}\)):
Precisamos de \(\nabla_{\mathbf{r}}g(\mathbf{r})\): derivando \(g(\mathbf{r})=\sum_ir_i^2\) em relação a cada \(r_i\) (a mesma regra da cadeia com \(h(t)=t^2\) do Passo 1, Bloco 3, agora aplicada diretamente às coordenadas de \(\mathbf{r}\), sem compô-las com \(\boldsymbol{\beta}\) ainda), \(\partial g/\partial r_i=2r_i\), logo \(\nabla_{\mathbf{r}}g(\mathbf{r})=2\mathbf{r}^T\in\mathbb{R}^{1\times 16\,640}\). Já sabemos, do Bloco 5, que \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\). Substituindo na regra da cadeia, \[ \nabla_{\boldsymbol{\beta}}L = (2\mathbf{r}^T)(X) = 2\mathbf{r}^TX = 2 (X\boldsymbol{\beta}-\mathbf{y})^TX , \] exatamente o resultado do Bloco 3 — agora obtido por uma rota diferente (compor gradiente-em-relação-ao-resíduo com o Jacobiano do resíduo), sem repetir a soma termo a termo do Passo 1-3. Essa é a vantagem prática da regra da cadeia com Jacobiano, citada pelo próprio MathML: “abordagens diretas [expandir tudo e derivar termo a termo] continuam práticas para funções simples […] mas se tornam impraticáveis para composições profundas de funções” (tradução livre, mesma seção) — o caso exato de uma rede neural com várias camadas compostas, tema da Aula 10 (Diferenciação Automática).
5.4 Verificando o Jacobiano do Resíduo Numericamente
Vamos confirmar \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\) verificando uma coluna do Jacobiano por diferença finita — a \(j\)-ésima coluna de \(J_{\mathbf{r}}\) é a derivada de todo o vetor \(\mathbf{r}\) em relação a \(\beta_j\) sozinho, que deve coincidir com a \(j\)-ésima coluna de \(X\).
coluna 0 (MedInc): erro máximo |J_numerico - X[:,0]| = 1.15e-10
coluna 1 (HouseAge): erro máximo |J_numerico - X[:,1]| = 1.34e-10
coluna 2 (AveRooms): erro máximo |J_numerico - X[:,2]| = 2.29e-10
coluna 3 (AveBedrms): erro máximo |J_numerico - X[:,3]| = 1.47e-10
erro máximo entre as 4 colunas: 2.29e-10
O erro máximo, em todas as \(4\) colunas, é da ordem de \(10^{-10}\) ou menor — puro erro de truncamento numérico da diferença finita, não uma discrepância real. A verificação confirma, na prática, que \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\) exatamente, para qualquer \(\boldsymbol{\beta}\) (o Jacobiano de uma função afim não depende do ponto onde é avaliado — outra forma de dizer que a segunda derivada de uma função afim é sempre zero).
MedHouseVal e um segundo alvo), como mudaria a forma do Jacobiano do novo resíduo?
Dica: pense em quantas linhas e colunas um Jacobiano \(m\times n\) tem, e o que muda quando \(m\) aumenta.
- □ Se o resíduo passasse a ter \(2\) saídas por observação (em vez de \(1\)), o Jacobiano do novo resíduo, para as mesmas \(4\) colunas de atributos e as mesmas \(16\,640\) observações, teria o dobro de linhas do Jacobiano atual.
- □ Se \(X\) tivesse \(1000\) atributos em vez de \(4\) (mantendo \(1\) única saída), o Jacobiano do resíduo \(J_{\mathbf{r}}(\boldsymbol{\beta})\) continuaria sendo uma matriz, agora com \(1000\) colunas em vez de \(4\).
- □ Numa rede neural com uma camada de saída de \(10\) neurônios (ex.: classificação em \(10\) classes), o Jacobiano dessa camada em relação aos parâmetros de entrada teria, na convenção numerator layout, uma linha para cada um dos \(10\) neurônios de saída.
- □ Como o gradiente é um caso particular do Jacobiano (quando \(m=1\)), isso implica que a fórmula de regra da cadeia \(\nabla_{\boldsymbol{ \beta}}L=\nabla_{\mathbf{r}}g\cdot J_{\mathbf{r}}(\boldsymbol{\beta})\) só vale porque \(L\) é uma perda quadrática especificamente, não para qualquer \(g\) diferenciável.
6 Verificação Numérica
6.1 Por Que Verificar Gradientes Numericamente é Prática Padrão
Todos os blocos anteriores já usaram diferença finita central, \(\big[f(\mathbf{x}+h\mathbf{e}_j)-f(\mathbf{x}-h\mathbf{e}_j)\big]/(2h)\), para conferir uma fórmula analítica — sem nunca discutir como escolher \(h\). Isso importa na prática: implementações de gradientes por extenso (Bloco 3) ou via regra da cadeia com Jacobiano (Bloco 5) são código, e código tem bugs — a competência esperada desta aula inclui verificar numericamente um gradiente/Jacobiano calculado à mão, não só calculá-lo.
6.2 O Compromisso na Escolha de \(h\)
Um \(h\) mal escolhido produz um “erro de verificação” que não é erro nenhum na fórmula analítica — só uma consequência de dois efeitos que competem entre si:
- \(h\) grande demais: a diferença finita central tem erro de truncamento da ordem \(O(h^2f'''(x))\) (expansão de Taylor de \(f\) em torno de \(x\), um resultado padrão de Cálculo Numérico, citado sem prova aqui) — quanto maior \(h\), pior essa aproximação.
- \(h\) pequeno demais: subtrair dois números de ponto flutuante muito próximos (\(f(x+h)\) e \(f(x-h)\), ambos quase iguais a \(f(x)\)) amplifica o erro de arredondamento da própria representação de ponto flutuante — esse erro cresce como \(O(\epsilon_{\text{máquina}}/h)\), quanto menor \(h\), pior.
A prática usual (minimizando a soma desses dois efeitos) recomenda \(h\sim\epsilon_{\text{máquina}}^{1/3}\approx 10^{-5}\)–\(10^{-6}\) para diferença finita central em ponto flutuante de precisão dupla — a mesma faixa já usada, sem justificar, em todos os chunks anteriores desta aula (\(h=10^{-4}\) ou \(10^{-5}\)).
Um caso especial que vale registrar, honestamente, em vez de simular um exemplo genérico: a perda \(L(\boldsymbol{\beta})=\|X\boldsymbol{ \beta}-\mathbf{y}\|^2\) do problema-fio é exatamente quadrática em \(\boldsymbol{\beta}\) — logo \(f'''(\boldsymbol{\beta})=0\) (a terceira derivada de um polinômio de grau \(2\) é identicamente zero) — e o erro de truncamento da diferença finita central é, para essa perda específica, exatamente zero, não apenas pequeno. O experimento abaixo mede o erro de verificação para vários valores de \(h\), e o resultado confirma exatamente essa previsão: só o efeito de arredondamento aparece, crescendo continuamente conforme \(h\to 0\), sem o formato de “U” que apareceria para uma função não-quadrática (onde os dois efeitos competem e há um ponto ótimo de \(h\) no meio).
h maior -> erro menor (só arredondamento, cresce conforme h diminui):
h=1.00e-02 erro=4.547e-11
h=1.22e-04 erro=5.828e-09
h=1.49e-06 erro=5.909e-07
h=1.82e-08 erro=2.451e-05
h=2.23e-10 erro=1.460e-03
h=2.72e-12 erro=1.528e-01
O gráfico confirma a previsão: o erro cresce monotonicamente conforme \(h\) diminui (eixo invertido, \(h\) maior à esquerda) — sem nenhum ponto de mínimo no meio, porque não há termo de truncamento competindo. Isso não significa “use o maior \(h\) possível” em geral: para uma função com terceira derivada não-nula (a imensa maioria das funções de perda de redes neurais, por exemplo), haveria também um custo em aumentar \(h\) demais — o formato de “U” reaparece. A faixa \(h\in[10^{-6},10^{-4}]\) usada nos Blocos 2-5 (região sombreada) fica numa zona seguramente pequena o bastante para não introduzir erro de arredondamento visível, mas grande o bastante para funcionar mesmo em funções não-quadráticas — a escolha prática recomendada quando não se sabe, de antemão, se a função é exatamente quadrática ou não.
7 Fechamento e Ponte para a Aula 7
Retomando as perguntas de abertura
- O que é uma derivada parcial, e por que ela sozinha não basta? \(\partial f/\partial x_j\) mede a taxa de variação de \(f\) mantendo as demais variáveis fixas — é a derivada de uma variável do Cálculo 1 aplicada a uma “fatia” da função. Sozinha, ela só descreve o comportamento ao longo de um eixo; um deslocamento em qualquer outra direção pede a derivada direcional (pergunta 3).
- Como generalizar para o vetor-gradiente, calculado por extenso? Coletando as \(n\) derivadas parciais no vetor-linha \(\nabla f= [\partial f/\partial x_1\ \cdots\ \partial f/\partial x_n]\) (Definição 5.5). Para \(L(\boldsymbol{\beta})=\|X\boldsymbol{\beta}- \mathbf{y}\|^2\), a derivação por extenso (regra da soma + regra da cadeia, termo a termo) deu \(\nabla_{\boldsymbol{\beta}}L=2 (X\boldsymbol{\beta}-\mathbf{y})^TX\) — cuja condição de anulamento é, exatamente, as Equações Normais da Aula 3.
- O que é a derivada direcional, e por que o gradiente é a subida mais íngreme? \(D_{\mathbf{v}}f(\mathbf{x})=\nabla f(\mathbf{x}) \mathbf{v}\) (regra da cadeia aplicada a \(g(h)=f(\mathbf{x}+ h\mathbf{v})\)); a desigualdade de Cauchy-Schwarz (Aula 1) prova que essa quantidade é maximizada exatamente quando \(\mathbf{v}\) aponta na direção do gradiente (normalizado), com valor máximo \(\|\nabla f(\mathbf{x})\|\).
- Como generalizar o gradiente para uma função vetorial? O Jacobiano (Definição 5.6) coleta todas as derivadas parciais de \(f:\mathbb{R}^n\to\mathbb{R}^m\) numa matriz \(m\times n\); o gradiente é o caso particular \(m=1\). O Jacobiano do resíduo, \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\), permitiu recuperar o mesmo gradiente do Bloco 3 por uma rota diferente (regra da cadeia com Jacobiano), a rota que escala para composições profundas de funções (redes neurais, Aula 10).
O Que Fica em Aberto
Toda a aula girou em torno de encontrar onde \(\nabla L=\mathbf{0}\) — a condição que recupera as Equações Normais. Mas vale ser preciso sobre o que essa condição garante e o que não garante: \(\nabla L(\mathbf{x}) =\mathbf{0}\) identifica um ponto crítico — um ponto onde nenhuma direção de primeira ordem aumenta ou diminui \(f\) (a própria Proposição do Bloco 4 deixou de se aplicar exatamente nesse caso, quando \(\|\nabla f(\mathbf{x})\|=0\)). Mas nada nesta aula garante que esse ponto crítico seja um mínimo — poderia ser um máximo, ou (em dimensão \(\ge 2\)) um ponto de sela, onde a função cresce em algumas direções e diminui em outras. Para a perda quadrática do problema-fio, o ponto crítico único é o mínimo global — mas essa garantia vem de uma propriedade adicional de \(X^TX\) (ser semidefinida positiva, Aula 4), não do gradiente sozinho. A ferramenta que decide, em geral, se um ponto crítico é mínimo, máximo ou sela — a segunda derivada em várias variáveis, a Hessiana — é o tema da Aula 7 (Convexidade e a Hessiana).