Método de Gauss–Newton

Visão geral

O método de Gauss–Newton é uma técnica clássica de otimização de segunda ordem para resolver problemas de mínimos quadrados não lineares da forma

[ \min_{\theta \in \mathbb{R}^p}; F(\theta) ;=; \frac{1}{2},|r(\theta)|2^2 ;=; \frac{1}{2}\sum{i=1}^m r_i(\theta)^2, ]

onde (r(\theta)\in\mathbb{R}^m) é um vetor de resíduos (erros de predição). Ele funciona repetidamente:

  1. Linearizando os resíduos em torno dos parâmetros atuais usando uma aproximação de Taylor de primeira ordem.
  2. Resolvendo um subproblema de mínimos quadrados lineares para a atualização dos parâmetros.
  3. Atualizando os parâmetros e repetindo até a convergência.

Gauss–Newton é um método fundamental em computação científica e aparece frequentemente em áreas adjacentes à IA, como visão computacional (por exemplo, ajuste de feixe (bundle adjustment)), inferência probabilística (por exemplo, aproximações de Laplace (Laplace approximations)), robótica (otimização de grafo de poses) e identificação de sistemas.

Comparado à Descida do Gradiente, ele explora informações de curvatura de forma eficiente para objetivos de mínimos quadrados — muitas vezes convergindo em bem menos iterações quando o modelo é bem-comportado.

Por que mínimos quadrados é especial

Para um objetivo geral (f(\theta)), o método de Newton usa a Hessiana (\nabla^2 f(\theta)). Para mínimos quadrados,

[ F(\theta) = \frac{1}{2} r(\theta)^\top r(\theta), ]

a estrutura fornece:

  • Jacobiana (Jacobian) (J(\theta) = \frac{\partial r(\theta)}{\partial \theta} \in \mathbb{R}^{m \times p})
  • Gradiente [ \nabla F(\theta) = J(\theta)^\top r(\theta) ]
  • Hessiana [ \nabla^2 F(\theta) = J^\top J ;+; \sum_{i=1}^m r_i(\theta),\nabla^2 r_i(\theta) ]

A observação-chave: quando os resíduos são pequenos perto da solução (um caso comum em modelos de mínimos quadrados bem especificados), o segundo termo muitas vezes é pequeno; assim,

[ \nabla^2 F(\theta)\approx J^\top J. ]

Essa aproximação é exatamente o que Gauss–Newton utiliza.

Derivação: linearize os resíduos, resolva um passo de mínimos quadrados lineares

Em uma iteração (\theta_k), aproxime os resíduos pela expansão de Taylor de primeira ordem:

[ r(\theta_k + \delta) \approx r(\theta_k) + J(\theta_k),\delta. ]

Em seguida, aproxime o objetivo:

[ F(\theta_k + \delta) \approx \frac{1}{2}|r_k + J_k \delta|_2^2, ] onde (r_k = r(\theta_k)), (J_k = J(\theta_k)).

Gauss–Newton escolhe (\delta) para minimizar esse problema de mínimos quadrados lineares:

[ \delta_k = \arg\min_\delta |J_k \delta + r_k|_2^2. ]

As equações normais para isso são:

[ (J_k^\top J_k),\delta_k = -J_k^\top r_k. ]

Então atualize:

[ \theta_{k+1} = \theta_k + \delta_k. ]

Interpretando o passo

  • É o passo de Newton para a aproximação quadrática que usa a Hessiana aproximada (J^\top J).
  • É o melhor passo (no sentido de mínimos quadrados) que torna pequenos os resíduos linearizados.

Algoritmo (forma prática)

Um laço típico de Gauss–Newton:

  1. Calcule o vetor de resíduos (r_k) e a Jacobiana (J_k).
  2. Resolva (\min_\delta |J_k \delta + r_k|_2^2) usando um método estável (QR/SVD).
  3. Opcionalmente aplique uma busca de linha ou um mecanismo de salvaguarda por região de confiança.
  4. Atualize (\theta).

Pseudocode:

given initial θ
repeat:
    r ← r(θ)
    J ← jacobian of r at θ
    δ ← argminδ ||J δ + r||^2     (solve via QR/SVD; avoid forming JᵀJ if possible)
    θ ← θ + δ                     (or θ ← θ + α δ with line search)
until convergence

Resolvendo o subproblema: equações normais vs QR (e por que isso importa)

Você frequentemente verá o passo computado via equações normais:

[ (J^\top J)\delta = -J^\top r. ]

Isso é computacionalmente conveniente, mas pode ser numericamente frágil:

  • O número de condição piora: (\kappa(J^\top J) = \kappa(J)^2)
  • Se (J) é mal condicionado, as equações normais podem perder precisão significativa

Alternativas mais estáveis:

  • Fatoração QR (QR factorization): (J = Q R) (com (Q) ortonormal, (R) triangular superior) [ \delta = -R^{-1} Q^\top r ]
  • Decomposição em valores singulares (SVD, singular value decomposition): (J = U \Sigma V^\top), robusta para casos com posto deficiente e útil para detectar degenerescência
  • Cholesky em (J^\top J) pode ser aceitável se (J) for bem condicionado, mas QR geralmente é mais seguro.

Em problemas esparsos de grande escala (por exemplo, ajuste de feixe), solucionadores frequentemente usam formas semelhantes a equações normais porque a esparsidade pode ser explorada intensamente, mas combinam isso com amortecimento, reordenação e cuidados numéricos.

Quando Gauss–Newton funciona bem

Gauss–Newton tende a se destacar quando:

  • O problema é realmente (ou aproximadamente) uma soma de erros ao quadrado.
  • A função de resíduos é suave e não muito não linear na região explorada.
  • Você tem uma boa inicialização (método local).
  • A Jacobiana (J(\theta^*)) na solução tem posto completo nas colunas (parâmetros identificáveis).
  • Os resíduos no ótimo são pequenos (ou próximos de zero), tornando a aproximação da Hessiana precisa.

Na prática, muitos problemas de estimação “geométrica” (pose de câmera, structure-from-motion, registro) satisfazem essas condições após uma inicialização razoável, motivo pelo qual Gauss–Newton e suas variantes amortecidas são onipresentes nesses contextos.

Intuição de convergência e garantias (alto nível)

Gauss–Newton é um método local: o comportamento perto da solução importa.

  • Se a solução verdadeira tem resíduo zero (isto é, (r(\theta^*) = 0)) e (J(\theta^*)) tem posto completo, Gauss–Newton frequentemente alcança convergência quadrática (semelhante a Newton), porque o termo descartado na Hessiana se anula no ótimo.
  • Se os resíduos não são pequenos no ótimo, a convergência tipicamente é linear (ainda assim, muitas vezes rápida).
  • Se (J^\top J) é singular ou quase singular, os passos podem se tornar instáveis ou enormes, e a convergência pode falhar sem amortecimento/regiões de confiança.

Essa é uma das razões pelas quais muitos sistemas reais usam Levenberg–Marquardt (próxima seção), que estabiliza Gauss–Newton.

Relação com o método de Newton

O método de Newton para minimizar (F(\theta)) usa:

[ \nabla^2 F(\theta_k),\delta_k = -\nabla F(\theta_k). ]

Para mínimos quadrados, substituindo as expressões exatas obtemos:

[ \Big(J^\top J + \sum_i r_i \nabla^2 r_i\Big)\delta = -J^\top r. ]

Gauss–Newton descarta o termo de curvatura de segunda ordem dos resíduos:

[ (J^\top J)\delta = -J^\top r. ]

Assim, você pode pensar em Gauss–Newton como:

  • Um método de Newton aproximado especializado para mínimos quadrados
  • Um método que evita computar (\nabla^2 r_i) (segundas derivadas), que são caras e propensas a erros

Em termos de ML, isso está intimamente relacionado ao uso de uma aproximação semidefinida positiva (positive semidefinite, PSD) da Hessiana, que tende a produzir direções de descida mais estáveis do que informações de segunda ordem indefinidas.

Relação com Levenberg–Marquardt (LM)

O Levenberg–Marquardt (LM) é melhor entendido como um método Gauss–Newton amortecido:

[ (J^\top J + \lambda I),\delta = -J^\top r ]

(ou às vezes (J^\top J + \lambda \operatorname{diag}(J^\top J))).

  • Quando (\lambda \to 0): LM se aproxima de Gauss–Newton.
  • Quando (\lambda) é grande: (\delta \approx -\frac{1}{\lambda} J^\top r), o que se assemelha a um pequeno passo de Descida do Gradiente.

LM também é comumente interpretado como um método de região de confiança (trust-region) para o modelo de mínimos quadrados linearizado:

[ \min_\delta |J\delta + r|^2 \quad \text{s.t.}\quad |\delta|\le \Delta. ]

Essa interpretação importa na prática porque métodos de região de confiança tipicamente têm comportamento global mais robusto do que passos puros de Gauss–Newton.

Por que LM é comum em pipelines adjacentes à IA

  • Ajuste de feixe em SLAM/SfM: problemas grandes, esparsos e às vezes mal condicionados; LM fornece robustez e passos bem escalonados.
  • Aproximação de Laplace em modelos probabilísticos: frequentemente encontra-se um ponto MAP por otimização iterativa e, então, aproxima-se o posterior com uma Gaussiana usando curvatura. Uma aproximação do tipo Gauss–Newton (J^\top J) pode servir como substituto eficiente de curvatura quando a verossimilhança é (aproximadamente) de mínimos quadrados (por exemplo, ruído de observação Gaussiano) ou após linearização local.

Se você tiver um artigo dedicado, veja Algoritmo de Levenberg–Marquardt.

Exemplo prático: ajustando uma curva exponencial

Suponha que você observe dados ((x_i, y_i)) e modele

[ \hat{y}(x;\theta) = a,e^{b x} + c,\quad \theta=(a,b,c). ]

Defina resíduos (r_i(\theta)=\hat{y}(x_i;\theta)-y_i). Então Gauss–Newton atualiza iterativamente ((a,b,c)).

Abaixo está uma implementação mínima em NumPy usando uma resolução baseada em QR (estável):

import numpy as np

def model(x, theta):
    a, b, c = theta
    return a * np.exp(b * x) + c

def residuals(x, y, theta):
    return model(x, theta) - y

def jacobian(x, theta):
    a, b, c = theta
    e = np.exp(b * x)
    # r = a*e^{bx} + c - y
    # dr/da = e^{bx}
    # dr/db = a*x*e^{bx}
    # dr/dc = 1
    J = np.column_stack([e, a * x * e, np.ones_like(x)])
    return J

def gauss_newton(x, y, theta0, max_iter=20, tol=1e-8):
    theta = theta0.astype(float).copy()
    for k in range(max_iter):
        r = residuals(x, y, theta)
        J = jacobian(x, theta)

        # Solve min ||J δ + r|| via QR: J = Q R
        Q, R = np.linalg.qr(J, mode="reduced")
        delta = -np.linalg.solve(R, Q.T @ r)

        theta_new = theta + delta
        if np.linalg.norm(delta) <= tol * (1.0 + np.linalg.norm(theta)):
            theta = theta_new
            break
        theta = theta_new
    return theta

# Example usage
x = np.linspace(0, 1, 50)
true_theta = np.array([2.0, -3.0, 0.5])
y = model(x, true_theta) + 0.05 * np.random.randn(len(x))

theta_hat = gauss_newton(x, y, theta0=np.array([1.0, -1.0, 0.0]))
print(theta_hat)

Notas:

  • Uma inicialização razoável importa: modelos altamente não lineares podem ter muitas regiões locais ruins.
  • Se a atualização for agressiva demais, você tipicamente adicionaria amortecimento (LM) ou uma busca de linha (line search).

Mínimos quadrados ponderados e perdas robustas (comuns na prática)

Muitos problemas reais usam resíduos ponderados:

[ \min_\theta \frac{1}{2}|W^{1/2} r(\theta)|^2 ]

onde (W) é diagonal (confiança por observação) ou mais geral (ruído correlacionado). O passo de Gauss–Newton torna-se:

[ (J^\top W J)\delta = -J^\top W r. ]

Em visão/robótica, também é comum usar perdas robustas (robust losses) (Huber, Cauchy) para reduzir a influência de outliers. Uma abordagem comum é mínimos quadrados iterativamente reponderados (IRLS, iteratively reweighted least squares), em que a perda robusta induz pesos que mudam a cada iteração, e cada iteração resolve um passo ponderado de Gauss–Newton/LM.

Aplicações em sistemas adjacentes a IA e ML

Ajuste de feixe e SLAM (otimização de grafo de poses)

No ajuste de feixe, os parâmetros incluem poses de câmera e pontos 3D; os resíduos são erros de reprojeção. A Jacobiana é esparsa e estruturada. Solucionadores práticos:

  • Usam Gauss–Newton/LM com álgebra linear esparsa
  • Frequentemente resolvem equações normais com truques de complemento de Schur (Schur complement) para eliminar variáveis de pontos de forma eficiente
  • Dependem fortemente de amortecimento e de uma boa inicialização para evitar divergência

Essa é uma grande razão pela qual Gauss–Newton é “o otimizador padrão” em visão geométrica.

Aproximação de Laplace e aproximações de curvatura

Em inferência Bayesiana, a aproximação de Laplace aproxima um posterior ao redor de um modo (\theta^*) usando uma Gaussiana com covariância (\Sigma \approx H^{-1}), onde (H) é a Hessiana do log posterior negativo.

Se o seu log-verossimilhança negativo é (aproximadamente) uma soma de resíduos ao quadrado — por exemplo, ruído de observação Gaussiano — então a aproximação de Gauss–Newton (H \approx J^\top J) pode ser usada:

  • para otimizar em direção ao modo (Gauss–Newton/LM),
  • e para aproximar a curvatura perto do ótimo.

Isso conecta Gauss–Newton a ideias práticas aproximadas de segunda ordem usadas em ML (aproximações eficientes de curvatura que são PSD e exploram estrutura).

Treinamento e métodos de segunda ordem em ML

Embora o aprendizado profundo mainstream dependa fortemente de variantes de SGD (Otimização Estocástica), matrizes de curvatura do tipo Gauss–Newton aparecem em:

  • Matrizes “Gauss–Newton generalizadas” para certas perdas e arquiteturas de rede
  • Aproximações inspiradas em gradiente natural
  • Regimes de lote grande (large-batch) ou fine-tuning, onde informação de segunda ordem pode ajudar

Em redes neurais, calcular Jacobianas de forma eficiente frequentemente depende de diferenciação automática e retropropagação; veja Retropropagação.

Considerações numéricas e de estabilidade (o que quebra e o que fazer)

1) Deficiência de posto e mau condicionamento

Se (J) tiver posto deficiente, então (J^\top J) é singular e o passo de Gauss–Newton pode ser indefinido ou instável.

Mitigações:

  • Use SVD ou um QR revelador de posto para computar um passo de norma mínima
  • Adicione amortecimento: LM ((J^\top J + \lambda I))
  • Reparametrize para remover graus de liberdade não identificáveis

2) Aceitação do passo e globalização

Gauss–Newton puro pode passar do ponto quando está longe da solução, porque a linearização é imprecisa.

Salvaguardas comuns:

  • Busca de linha em (\alpha): (\theta \leftarrow \theta + \alpha\delta)
  • Região de confiança (LM é uma escolha padrão)
  • Monitorar a redução do objetivo; aumentar o amortecimento se o passo falhar

3) Escalonamento

Parâmetros e resíduos podem ter escalas muito diferentes, prejudicando o condicionamento.

Práticas comuns:

  • Escalonar parâmetros (trabalhar em unidades normalizadas)
  • Usar amortecimento diagonal baseado em (\operatorname{diag}(J^\top J))
  • Escalonar resíduos pelos desvios padrão do ruído de medição (estatisticamente fundamentado)

4) Não forme \(J^\top J\) a menos que seja necessário

Formar (J^\top J) explicitamente pode:

  • perder a estrutura de esparsidade (dependendo da representação)
  • elevar ao quadrado o número de condição
  • amplificar erros numéricos

Prefira resolver (\min|J\delta + r|) com QR/SVD quando viável, especialmente para problemas densos ou de tamanho moderado.

Intuição: por que a aproximação da Hessiana frequentemente é “boa o suficiente”

O termo descartado na Hessiana,

[ \sum_i r_i(\theta),\nabla^2 r_i(\theta), ]

é escalonado pelos valores dos resíduos (r_i(\theta)). Assim, à medida que o algoritmo se aproxima de uma solução com resíduos pequenos:

  • o termo naturalmente diminui,
  • (J^\top J) torna-se um modelo de curvatura muito preciso,
  • os passos tornam-se semelhantes aos de Newton, permitindo convergência local rápida.

Essa “aproximação que se autoaperfeiçoa” é uma grande razão pela qual Gauss–Newton é tão eficaz na prática quando o modelo ajusta bem os dados.

Resumo: quando escolher Gauss–Newton

Gauss–Newton é uma forte opção padrão quando:

  • Seu objetivo é naturalmente de mínimos quadrados (ou pode ser formulado como tal).
  • Você consegue computar Jacobianas de forma confiável (analíticas ou via autodiff).
  • Você tem uma inicialização decente e quer convergência mais rápida do que métodos de primeira ordem.
  • Você se importa com aproximações de curvatura PSD estáveis.

Se você precisar de mais robustez (comum), use Levenberg–Marquardt, que é essencialmente Gauss–Newton com comportamento de região de confiança/amortecimento.

Artigos de base relacionados: Descida do Gradiente, Otimização Convexa, Otimização Estocástica e Otimização com Restrições.