| 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 |
Álgebra Linear e Otimização para Aprendizado de Máquina
2026-09-13
5 aulas construíram uma linguagem para dados estáticos — nunca precisaram perguntar “como ajustar algo para reduzir um erro”.
Mas as Equações Normais (Aula 3) vieram de “a projeção minimiza \(\|\mathbf{y}-X\mathbf{w}\|^2\)” — minimizar uma função é, por definição, Cálculo.
A Aula 3 usou essa ideia (via geometria) sem defini-la. Parte 2 do curso (“Cálculo da Otimização Diferenciável”) fecha essa lacuna, a partir de hoje.
1. O que é derivada parcial, e por que sozinha não basta para qualquer direção?
2. Como generalizar para o vetor-gradiente, calculado por extenso numa perda quadrática real?
3. O que é derivada direcional, e por que o gradiente é a direção de subida mais íngreme?
4. Como generalizar para uma função vetorial — o Jacobiano?
\(L(\boldsymbol{\beta})=\|X\boldsymbol{\beta}-\mathbf{y}\|^2\) (California Housing). Aula 3 resolveu de uma vez (\(X^TX\hat{\boldsymbol{\beta}}=X^T\mathbf{y}\)) — mas imagine milhões de parâmetros (rede neural): resolver o sistema está fora de cogitação.
Dado \(\boldsymbol{\beta}\) qualquer: em que direção mover \(\boldsymbol{\beta}\) para reduzir \(L\) mais rápido, usando só informação local?
Com 1 parâmetro já sabemos achar o mínimo. Com 4, o quê muda?
Dica: o que o Cálculo 1 ensina sobre mínimos, e o que precisa mudar com mais de uma variável?
O que muda de 1 para 4 parâmetros — Resposta
Voltando à pergunta: o objeto que falta é o gradiente — um vetor, não um número — construído a partir de derivadas parciais, tema do Bloco 2.
Ideia central: para entender como \(f(x_1,\dots,x_n)\) muda, fixe todas as variáveis exceto uma, e aplique a derivada de uma variável (Cálculo 1) só àquela.
Definição (Derivada Parcial — MathML Def. 5.5)
\(\dfrac{\partial f}{\partial x_i} = \lim_{h\to 0} \dfrac{f(x_1,\dots,x_i+h,\dots,x_n)-f(\mathbf{x})}{h}\) — as demais variáveis ficam fixas.
Cada \(\partial f/\partial x_i\) é a derivada de uma variável do Cálculo 1, aplicada à função com as demais variáveis “congeladas” — nenhuma ferramenta nova para calcular uma parcial isolada.
Versão simplificada com \(2\) parâmetros, \(5\) bairros, \(2\) atributos (MedInc, HouseAge), para a conta caber à mão.
| 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 |
\(L(\beta_1,\beta_2)=\sum_i(\beta_1\texttt{MedInc}_i+ \beta_2\texttt{HouseAge}_i-\texttt{MedHouseVal}_i)^2\).
Em \((\beta_1,\beta_2)=(0{,}5;\,0{,}02)\): aproximar \(\partial L \partial\beta_1\) pelo limite com \(h\) pequeno, comparar com a derivada exata.
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
Muito parecido com derivada por manipulação algébrica direta:
\(\partial L/\partial\beta_1=2\sum_i r_i\texttt{MedInc}_i\)
\(\partial L/\partial\beta_2=2\sum_i r_i\texttt{HouseAge}_i\) onde (\(r_i=\beta_1\texttt{MedInc}_i+\beta_2\texttt{HouseAge}_i- \texttt{MedHouseVal}_i\))
Se a perda dependesse só de \(\beta_1\), o que ocorre com \(\partial L/\partial\beta_2\)?
Dica: qual das duas variáveis deixaria de existir na função?
MedHouseVal\(_i\) (sinal trocado) para todos os \(5\) bairros em \((\beta_1,\beta_2)=(0,0)\), isso impediria calcular \(\partial L/\partial\beta_1\) nesse ponto.Derivada parcial: o que muda e o que não muda — Resposta
Voltando à pergunta: “fixar as demais variáveis” é uma operação na definição (qual variável varia), não uma afirmação de que as demais variáveis não influenciam o valor numérico da derivada — elas influenciam, através do ponto onde a derivada é avaliada. O Bloco 3 generaliza isso para todas as \(4\) variáveis de uma vez.
Definição (Gradiente — MathML Def. 5.5, completa)
\(\nabla_{\mathbf{x}}f=\dfrac{df}{d\mathbf{x}}=\begin{bmatrix} \dfrac{\partial f}{\partial x_1} \\ \vdots \\ \dfrac{\partial f}{\partial x_n} \end{bmatrix}\in \mathbb{R}^{n\times 1}\) — vetor-coluna, chamado gradiente (= Jacobiano, caso escalar).
Observação (convenção coluna)
Optamos pela convenção de vetor-coluna, que é a mais comum na literatura de aprendizado de máquina e otimização. Isso facilita a consistência com a notação de atualização de pesos \(\mathbf{w}_{t+1}=\mathbf{w}_t-\gamma\nabla L(\mathbf{w}_t)\) que veremos adiante.
Regras de derivação (MathML §5.2.1)
💡 Resumo de Regras de Derivação
| Operação | Derivada Parcial (\(\partial/\partial x_i\)) | Gradiente (\(\nabla\)) |
|---|---|---|
| Soma | \(\partial(f+g)/\partial x_i = \partial f/\partial x_i + \partial g/\partial x_i\) | \(\nabla(f+g) = \nabla f + \nabla g\) |
| Produto | \(\partial(fg)/\partial x_i = f \partial g/\partial x_i + g \partial f/\partial x_i\) | \(\nabla(fg) = f\nabla g + g\nabla f\) |
| Cadeia | \(\partial(g \circ f)/\partial x_i = \dots\) | \(\nabla(f \circ g) = \mathbf{J}_g^T \nabla f\) |
Passo 1 (soma + cadeia): \(\partial L/\partial\beta_j=\sum_i \partial(r_i^2)/\partial\beta_j=\sum_i2r_i\cdot\partial r_i/ \partial\beta_j\).
Passo 2 (parte afim): \(\partial r_i/\partial\beta_j=X_{ij}\) diretamente.
Passo 3 (montagem): \(\partial L/\partial\beta_j=2\sum_iX_{ij}r_i= 2(X^T\mathbf{r})_j\Rightarrow\nabla_{\boldsymbol{\beta}}L= 2\mathbf{r}^TX=2(X\boldsymbol{\beta}-\mathbf{y})^TX\).
Resultado
\(\nabla_{\boldsymbol{\beta}}\|X\boldsymbol{\beta}-\mathbf{y}\|^2= 2(X\boldsymbol{\beta}-\mathbf{y})^TX\).
Ponte com a Aula 3: \(\nabla L=\mathbf{0}\iff X^T(X\boldsymbol{ \beta}-\mathbf{y})=\mathbf{0}\iff X^TX\boldsymbol{\beta}=X^T\mathbf{y}\) — exatamente as Equações Normais. “Resíduo ortogonal” (Aula 3) e “gradiente zero” (hoje) são a mesma condição, duas portas diferentes.
Trocar o quadrado por \(L_1\) (\(\sum_i|r_i|\)): a derivação continua igual?
Dica: releia o Passo 1 — qual regra deixa de valer, exatamente?
Trocar quadrado por \(L_1\) — Resposta
Voltando à pergunta: não, a substituição por \(L_1\) quebra precisamente a regra da cadeia do Passo 1 — \(|t|\) tem um “bico” em \(t=0\), sem derivada aí. Otimizar perdas assim (não-suaves) exige uma ferramenta diferente (subgradientes), fora do escopo desta aula — reservado para a Aula 15.
Ideia: Qual a “inclinação” de \(f\) se nos movermos a partir de \(\mathbf{x}\) na direção \(\mathbf{v}\)?
O Truque: Reduzir para 1 variável. Defina \(g(h) = f(\mathbf{x} + h\mathbf{v})\). A derivada direcional é simplesmente \(g'(0)\).
A Matemática (Regra da Cadeia): \(g'(h) = \sum_{i=1}^n \underbrace{\frac{\partial f}{\partial x_i}(\mathbf{x} + h\mathbf{v})}_{\text{sensibilidade}} \cdot \underbrace{\frac{dx_i}{dh}}_{v_i} = \sum_{i=1}^n \frac{\partial f}{\partial x_i}(\mathbf{x} + h\mathbf{v}) v_i\)
Importante
Resultado: \(D_{\mathbf{v}}f(\mathbf{x}) = \nabla f(\mathbf{x}) \cdot \mathbf{v}\) (Produto interno entre o gradiente e a direção).
Generalização: Se \(\mathbf{v} = \mathbf{e}_j\) (eixo \(j\)), recuperamos a derivada parcial \(\partial f / \partial x_j\).
Proposição
\(\nabla f(\mathbf{x})\ne\mathbf{0}\): entre todo \(\mathbf{v}\) unitário, \(D_{\mathbf{v}}f(\mathbf{x})\) é máxima em \(\mathbf{v}^\star=\nabla f(\mathbf{x})^T/\|\nabla f(\mathbf{x})\|\), valor máximo \(\|\nabla f(\mathbf{x})\|\).
Prova: \(D_{\mathbf{v}}f=\langle\nabla f(\mathbf{x})^T,\mathbf{v} \rangle\). Cauchy-Schwarz: \(|\langle\nabla f^T,\mathbf{v}\rangle|\le \|\nabla f\|\cdot1\), igualdade sse \(\mathbf{v}\parallel\nabla f^T\) (mesmo sentido, para o máximo).
\(\mathbf{v}^\star=\nabla f^T/\|\nabla f\|\Rightarrow D_{\mathbf{v}^\star}f=\|\nabla f\|^2/\|\nabla f\|=\|\nabla f\|\) — bate com a cota, logo é o máximo. \(\blacksquare\)
Gradiente (transposto) = direção de subida mais íngreme, normalizado; sua norma = taxa de aumento ótima. \(-\nabla f^T/\|\nabla f\|\) = descida mais íngreme (Aula 8, Gradiente Descendente).
Exemplo do Bloco 2, em \((\beta_1,\beta_2)=(0{,}5;\,0{,}02)\): \(\nabla L \approx[5{,}637\ \ 95{,}040]\) (norma \(\approx95{,}207\)). Calcular \(D_{\mathbf{v}}L\) para todos os ângulos, confirmar máximo 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)
Painel direito: \(D_{\mathbf{v}}L\) varia como cosseno, máximo \(=\|\nabla L\|\approx95{,}207\) exatamente no ângulo do gradiente (\(\approx86{,}6°\)); mínimo (mesma magnitude, sinal oposto) na direção oposta.
Painel esquerdo: gradiente (seta ampliada) aponta para fora, sentido de crescimento. Eixos em escalas diferentes \(\Rightarrow\) ortogonalidade às curvas não fica visualmente exata aqui (é exata em eixos de mesma escala — o fato matemático não depende do desenho).
\(\nabla f(\mathbf{x})=\mathbf{0}\): o que a Proposição diz sobre a direção de subida?
Dica: releia a hipótese exata da Proposição.
Gradiente nulo e direção de subida — Resposta
Voltando à pergunta: num ponto de gradiente nulo, a Proposição simplesmente não se aplica — não existe direção de subida garantida de primeira ordem. Esse é, precisamente, o critério de ponto crítico que abre a Aula 7 (convexidade e a Hessiana).
Gradiente (Bloco 3): \(f:\mathbb{R}^n\to\mathbb{R}\). Mas \(\mathbf{r}(\boldsymbol{\beta}):=X\boldsymbol{\beta}-\mathbf{y}\) (Bloco 3) é \(\mathbb{R}^4\to\mathbb{R}^{16\,640}\) — um número por observação.
Definição (Jacobiano — MathML Def. 5.6)
\(f:\mathbb{R}^n\to\mathbb{R}^m\Rightarrow J=\nabla_{\mathbf{x}}f\in \mathbb{R}^{n\times m}\), \(J(j,i)=\partial f_i/\partial x_j\). Caso \(m=1\): \(J\) = vetor-coluna = o gradiente já definido.
Convenção (Denominator Layout): colunas = gradientes de \(f_i\), linhas = variáveis \(\mathbf{x}\).
Passo 1: Derivada de uma componente \(r_i(\boldsymbol{\beta}) = \sum_k X_{ik}\beta_k - y_i \implies \frac{\partial r_i}{\partial \beta_j} = X_{ij}\)
Passo 2: Montando a matriz (Denominator Layout) \(J_{\mathbf{r}}\) coleta as parciais \(\partial r_i / \partial \beta_j\) nas posições \((j, i)\): \(J_{\mathbf{r}} = \begin{bmatrix} \partial r_1/\partial \beta_1 & \dots & \partial r_m/\partial \beta_1 \\ \vdots & \ddots & \vdots \\ \partial r_1/\partial \beta_n & \dots & \partial r_m/\partial \beta_n \end{bmatrix} = X^T\)
Conclusão: O Jacobiano do resíduo é a transposta da matriz de design.
Nota
Propriedade: Para qualquer função afim \(\mathbf{r} = A\boldsymbol{\beta} + \mathbf{c}\), o Jacobiano é constante: \(J_{\mathbf{r}} = A^T\).
MathML resolve exatamente este problema (mínimos quadrados de modelo linear) como exemplo de regra da cadeia com Jacobiano (Exemplo 5.11, tradução/adaptação nossa; usam \(\mathbf{e}=\mathbf{y}-\Phi \boldsymbol{\theta}=-\mathbf{r}\)).
Regra da cadeia com Jacobiano (MathML Exemplo 5.11)
\(L(\boldsymbol{\beta})=g(\mathbf{r}(\boldsymbol{\beta}))\), \(g(\mathbf{r})=\mathbf{r}^T\mathbf{r}\Rightarrow\nabla_{\boldsymbol{ \beta}}L=\nabla_{\mathbf{r}}g\cdot J_{\mathbf{r}}(\boldsymbol{\beta})\).
\(\nabla_{\mathbf{r}}g(\mathbf{r})=2\mathbf{r}^T\) (mesma regra do Passo 1, Bloco 3); \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\) (Bloco 5).
\(\nabla_{\boldsymbol{\beta}}L=(2\mathbf{r}^T)(X)=2(X\boldsymbol{\beta}- \mathbf{y})^TX\) — idêntico ao Bloco 3, por rota diferente (sem repetir a soma termo a termo).
Vantagem citada pelo MathML: a rota direta (expandir tudo) “continua prática para funções simples, mas fica impraticável para composições profundas” — o caso de redes neurais com várias camadas (Aula 10, Diferenciação Automática).
Confirmar \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\): a \(j\)-ésima coluna de \(J_{\mathbf{r}}\) (diferença finita) 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
Erro máximo \(\sim10^{-10}\) (puro truncamento) nas \(4\) colunas — confirma \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\) exatamente, para qualquer \(\boldsymbol{\beta}\) (Jacobiano de função afim não depende do ponto).
Modelo com 2 saídas: como muda a forma do Jacobiano do resíduo?
Dica: quantas linhas/colunas tem um Jacobiano \(m\times n\), e o que muda quando \(m\) aumenta?
Jacobiano com múltiplas saídas — Resposta
Voltando à pergunta: o Jacobiano generaliza exatamente nessa direção — mais saídas, mais linhas; mais parâmetros, mais colunas — sem exigir nenhuma mudança na definição, só na contagem de \(m\) e \(n\).
Blocos anteriores já usaram diferença finita central sem discutir como escolher \(h\). Implementações de gradiente/Jacobiano são código — têm bugs. Competência desta aula: verificar numericamente, não só calcular.
Prática usual: \(h\sim\epsilon_{\text{máquina}}^{1/3}\approx 10^{-5}\)–\(10^{-6}\) (faixa já usada, sem justificar, nos chunks anteriores).
Caso especial honesto: \(L(\boldsymbol{\beta})\) é exatamente quadrática \(\Rightarrow f'''=0\Rightarrow\) erro de truncamento zero para esta perda — só arredondamento aparece, sem o “U” clássico.
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
Erro cresce monotonicamente conforme \(h\to0\) (sem “U”, sem truncamento). Para função com \(f'''\ne0\) (a maioria das perdas de redes neurais), o “U” reaparece — \(h\) grande demais também tem custo.
Faixa \(h\in[10^{-6},10^{-4}]\) (Blocos 2-5, sombreada): pequena o bastante para não expor arredondamento, grande o bastante para funcionar mesmo em funções não-quadráticas — escolha prática segura por padrão.
1. \(\partial f/\partial x_j\): taxa de variação num eixo só — sozinha não cobre outras direções (derivada direcional, pergunta 3).
2. Gradiente = vetor-linha das parciais (Def. 5.5). Para \(L=\|X\boldsymbol{\beta}-\mathbf{y}\|^2\): \(\nabla_{\boldsymbol{\beta}}L =2(X\boldsymbol{\beta}-\mathbf{y})^TX\) — anulamento = Equações Normais.
3. \(D_{\mathbf{v}}f=\nabla f\cdot\mathbf{v}\); Cauchy-Schwarz (Aula 1) prova máximo em \(\mathbf{v}=\) gradiente normalizado, valor \(\|\nabla f\|\).
4. Jacobiano (Def. 5.6): matriz \(m\times n\), gradiente = caso \(m=1\). \(J_{\mathbf{r}}(\boldsymbol{\beta})=X\) recupera o Bloco 3 via regra da cadeia — rota que escala para redes neurais (Aula 10).
\(\nabla L=\mathbf{0}\) identifica ponto crítico — nenhuma direção de primeira ordem aumenta/diminui \(f\) ali (a Proposição do Bloco 4 deixa de se aplicar exatamente nesse caso).
Mas ponto crítico não é, automaticamente, mínimo — pode ser máximo ou sela. Para \(L(\boldsymbol{\beta})=\|X\boldsymbol{\beta}- \mathbf{y}\|^2\), funciona porque \(X^TX\) é PSD (Aula 4) — garantia extra, não do gradiente sozinho.
O que decide mínimo/máximo/sela, em geral: a segunda derivada em várias variáveis, a Hessiana — Aula 7 (Convexidade e a Hessiana).
UNICAMP — Instituto de Computação