Autovalores (Eigenvalues) e Decomposição em Valores Singulares (SVD)

Por que autovalores e a decomposição em valores singulares importam em IA/AM

A inteligência artificial (artificial intelligence, AI) e o aprendizado de máquina (machine learning, ML) modernos estão cheios de mapas lineares (linear maps): vetores de incorporação (embeddings), projeções de atenção (attention projections), transformações de atributos (feature transforms), mínimos quadrados (least squares), Análise de Componentes Principais (Principal Component Analysis, PCA) e análises linearizadas (linearized analyses) de redes profundas (deep nets). Autovalores (eigenvalues) e a decomposição em valores singulares (Singular Value Decomposition, SVD) são as principais ferramentas para entender:

  • Geometria: como uma matriz estica/gira o espaço
  • Estabilidade e condicionamento (conditioning): se resolver sistemas ou otimizar é numericamente bem-comportado
  • Estrutura de baixo posto (low-rank structure): se dados/modelos podem ser comprimidos sem perder muito sinal
  • PCA e aprendizado de representações (representation learning): como encontrar direções de máxima variância

Se você quiser uma revisão dos objetos básicos (vetores, matrizes, formas/dimensões), veja Vetores, Matrizes, Tensores. Para armadilhas numéricas e questões de estabilidade, veja Álgebra Linear Numérica.

Autovalores e autovetores: a ideia central

Definição (matrizes quadradas)

Para uma matriz quadrada (A \in \mathbb{R}^{n \times n}), um autovetor (v \neq 0) e um autovalor (\lambda) satisfazem:

[ A v = \lambda v ]

Interpretação: aplicar (A) a (v) não muda sua direção — apenas o escala por (\lambda) (possivelmente invertendo a direção se (\lambda < 0)).

Intuição geométrica

Pense em (A) como uma transformação do espaço. A maioria dos vetores é rotacionada e esticada para uma nova direção. Autovetores são eixos especiais que permanecem alinhados consigo mesmos.

  • Se (|\lambda| > 1): vetores ao longo de (v) se expandem
  • Se (|\lambda| < 1): vetores ao longo de (v) se contraem
  • Se (\lambda = 0): vetores ao longo de (v) colapsam para zero (uma perda de dimensão)

Quando a decomposição em autovalores é especialmente conveniente (matrizes simétricas)

Muitas matrizes relevantes em ML são simétricas (por exemplo, matrizes de covariância, matrizes de Gram (Gram matrices), Hessianas (Hessians) perto de um mínimo). Se (A = A^\top), então:

  • Todos os autovalores são reais
  • Autovetores podem ser escolhidos ortonormais
  • Podemos escrever uma decomposição em autovalores (eigen-decomposition):

[ A = Q \Lambda Q^\top ]

onde (Q) é ortonormal (colunas são autovetores) e (\Lambda) é diagonal (autovalores).

Este é um dos motivos pelos quais matrizes simétricas são tão centrais na teoria de ML.

Decomposição em valores singulares: a “prima” mais geral (e mais útil) dos autovalores

Autovalores se aplicam apenas a matrizes quadradas. Mas em ML você usa o tempo todo matrizes retangulares: matrizes de dados (X \in \mathbb{R}^{n \times d}), matrizes de pesos em redes neurais, etc. A decomposição em valores singulares funciona para qualquer matriz.

Definição (qualquer matriz)

Para (A \in \mathbb{R}^{m \times n}), a decomposição em valores singulares é:

[ A = U \Sigma V^\top ]

  • (U \in \mathbb{R}^{m \times m}): vetores singulares à esquerda ortonormais
  • (V \in \mathbb{R}^{n \times n}): vetores singulares à direita ortonormais
  • (\Sigma \in \mathbb{R}^{m \times n}): diagonal (não negativa) com valores singulares (singular values) (\sigma_1 \ge \sigma_2 \ge \cdots \ge 0)

Intuição geométrica: “rotacionar → escalar → rotacionar”

A decomposição em valores singulares diz que todo mapa linear pode ser visto como:

  1. Rotacionar/refletir o espaço de entrada por (V^\top)
  2. Escalar ao longo de eixos ortogonais por (\Sigma)
  3. Rotacionar/refletir o espaço de saída por (U)

Valores singulares (\sigma_i) são os fatores de estiramento dos eixos. O maior valor singular é o estiramento máximo aplicado a qualquer vetor unitário.

Relação com autovalores

A decomposição em valores singulares está fortemente conectada a autovalores de duas matrizes simétricas:

[ A^\top A = V \Sigma^\top \Sigma V^\top \qquad AA^\top = U \Sigma \Sigma^\top U^\top ]

Logo:

  • Os vetores singulares à direita (V) são autovetores de (A^\top A)
  • Os vetores singulares à esquerda (U) são autovetores de (AA^\top)
  • Os valores singulares satisfazem (\sigma_i^2 = \lambda_i(A^\top A))

Isso é fundamental em PCA e para entender condicionamento.

Caso especial: simétrica semidefinida positiva (positive semidefinite, PSD)

Se (A) é simétrica PSD (como uma matriz de covariância), então a decomposição em autovalores e a decomposição em valores singulares essencialmente coincidem:

  • Autovalores são não negativos
  • Valores singulares são iguais aos autovalores (até a ordenação)
  • Autovetores coincidem com vetores singulares

PCA via decomposição em valores singulares: o caso de uso mais comum em ML

PCA encontra direções de máxima variância. Na prática, ela é calculada de forma mais robusta usando decomposição em valores singulares.

Considere uma matriz de dados (X \in \mathbb{R}^{n \times d}), onde linhas são amostras e colunas são atributos.

  1. Centralize os dados: (X_c = X - \text{mean}(X))
  2. Compute a decomposição em valores singulares:
    [ X_c = U \Sigma V^\top ]
  3. As direções principais (componentes principais (principal components)) são as colunas de (V).
  4. As coordenadas projetadas em baixa dimensão nos (k) principais componentes são: [ Z = X_c V_k ]

Como a variância explicada se relaciona com valores singulares

A covariância amostral é:

[ C = \frac{1}{n-1} X_c^\top X_c ]

Usando decomposição em valores singulares, (X_c^\top X_c = V \Sigma^\top \Sigma V^\top), então os autovalores da covariância são:

[ \lambda_i(C) = \frac{\sigma_i^2}{n-1} ]

Assim, a variância explicada por componente é proporcional a (\sigma_i^2).

Exemplo prático de PCA (NumPy)

import numpy as np

# X: shape (n_samples, n_features)
X = np.random.randn(1000, 50)

# Center
Xc = X - X.mean(axis=0, keepdims=True)

# SVD (economy form)
U, S, Vt = np.linalg.svd(Xc, full_matrices=False)

k = 10
V_k = Vt[:k].T            # top-k principal directions, shape (d, k)
Z = Xc @ V_k              # projected data, shape (n, k)

# Explained variance ratio
explained_var = (S**2) / (X.shape[0] - 1)
ratio = explained_var[:k] / explained_var.sum()

Por que a decomposição em valores singulares é preferida à decomposição em autovalores da covariância

Você poderia computar (C = X_c^\top X_c) e fazer uma decomposição em autovalores. Mas a decomposição em valores singulares tipicamente é:

  • Mais estável numericamente (especialmente quando (d) é grande ou os atributos são correlacionados)
  • Melhor quando (n \ll d) ou (d \ll n) (você pode escolher a forma mais eficiente)
  • Fornece diretamente os valores singulares, que são o “espectro de energia (energy spectrum)” dos dados

Para mais sobre isso, veja Álgebra Linear Numérica.

Condicionamento: quando problemas se tornam instáveis

Número de condição em termos de valores singulares

Muitos cálculos em ML envolvem resolver um sistema ou um problema de mínimos quadrados, por exemplo:

  • Regressão linear (linear regression): (\min_w |Xw - y|_2^2)
  • Equações normais (normal equations): (X^\top X w = X^\top y)

A quantidade-chave é o número de condição (condition number):

[ \kappa_2(A) = \frac{\sigma_{\max}(A)}{\sigma_{\min}(A)} ]

  • Se (\kappa) é pequeno (próximo de 1): o problema é bem condicionado.
  • Se (\kappa) é enorme: ruído minúsculo na entrada ou arredondamento de ponto flutuante pode causar grandes mudanças na saída.

Por que condicionamento importa na prática de ML

  • Sensibilidade de mínimos quadrados: se (X) tem colunas quase dependentes (multicolinearidade (multicollinearity)), (\sigma_{\min}(X)) é muito pequeno ⇒ (\kappa) grande ⇒ pesos instáveis.
  • Velocidade de otimização: para objetivos quadráticos, o espalhamento de autovalores da Hessiana governa a convergência da Descida do Gradiente. Um grande espalhamento (mal condicionamento) significa progresso lento em algumas direções, a menos que você use pré-condicionamento (preconditioning) ou métodos adaptativos (adaptive methods).

Regressão ridge como “encolhimento de valores singulares”

Regressão ridge (ridge regression) resolve:

[ \min_w |Xw - y|_2^2 + \lambda |w|_2^2 ]

Isso efetivamente evita a divisão por valores singulares muito pequenos ao resolver o problema, melhorando a estabilidade. Em termos de decomposição em valores singulares, os fatores de inversão viram:

  • Sem ridge (pseudo-inversa): dividir por (\sigma_i)
  • Com ridge: dividir por (\sigma_i^2 + \lambda) (menos explosivo quando (\sigma_i) é pequeno)

Esta é uma forma de ver por que regularização L2 (L2 regularization) ajuda; veja também Regularização.

Estrutura de baixo posto: compressão, remoção de ruído e generalização

Posto e posto efetivo

O posto (rank) é o número de valores singulares não nulos. Mas em ML, uma matriz pode ser aproximadamente de baixo posto se seus valores singulares decaem rapidamente:

  • Alguns poucos (\sigma_i) grandes: a maior parte do “sinal” está em um subespaço pequeno
  • Muitos (\sigma_i) pequenos: frequentemente ruído ou variação redundante

Isso aparece em:

  • Matrizes de dados (atributos correlacionados)
  • Matrizes de incorporação
  • Projeções de atenção
  • Matrizes usuário–item de filtragem colaborativa

Melhor aproximação de posto-\(k\) (teorema de Eckart–Young (Eckart–Young theorem))

Se (A = U \Sigma V^\top), defina a decomposição em valores singulares truncada:

[ A_k = U_k \Sigma_k V_k^\top ]

Então (A_k) é a melhor aproximação de posto-(k) de (A) na norma de Frobenius (Frobenius norm) (e também na norma espectral). “Melhor” significa que ela minimiza o erro de reconstrução entre todas as matrizes de posto-(k):

[ A_k = \arg\min_{\text{rank}(B)\le k} |A - B| ]

Esta é a base matemática para:

  • Reconstrução via PCA
  • Compressão de matrizes de pesos
  • Remoção de ruído ao descartar valores singulares pequenos

Exemplo prático: comprimir uma camada linear

Suponha que uma camada linear (linear layer) tenha matriz de pesos (W \in \mathbb{R}^{m \times n}). Se (W) é aproximadamente de baixo posto, podemos aproximar:

[ W \approx U_k \Sigma_k V_k^\top = (U_k \Sigma_k) V_k^\top ]

Isso substitui uma multiplicação grande de matriz por duas menores:

  • (x \mapsto x V_k)
  • depois (\mapsto (x V_k)(U_k \Sigma_k)^\top)

Essa ideia aparece em compressão de modelos (model compression) e em algumas técnicas de ajuste fino eficiente em parâmetros (parameter-efficient fine-tuning).

Decomposição em valores singulares e a pseudo-inversa: resolvendo mínimos quadrados de forma robusta

Quando (A) não é quadrada ou não é inversível, a pseudo-inversa de Moore–Penrose (Moore–Penrose pseudoinverse) (A^+) fornece a solução de mínimos quadrados de norma mínima.

Usando decomposição em valores singulares (A = U\Sigma V^\top):

[ A^+ = V \Sigma^+ U^\top ]

onde (\Sigma^+) substitui cada (\sigma_i) não nulo por (1/\sigma_i) (e mantém zeros como zeros).

Isso é amplamente usado em:

  • Regressão linear e ajuste
  • Cálculo de projeções
  • Identificação de sistemas (system identification) clássica

Na prática, bibliotecas computam isso de forma estável e podem aplicar um limiar a valores singulares muito pequenos para evitar amplificar ruído.

Normas espectrais e estabilidade em aprendizado profundo

Norma espectral = maior valor singular

A norma espectral (spectral norm) — a norma de operador (operator norm) induzida por (\ell_2) — é:

[ |A|2 = \sigma{\max}(A) ]

Isso importa porque ela controla a amplificação no pior caso:

[ |Ax|_2 \le |A|_2 |x|_2 ]

Em aprendizado profundo (deep learning), limitar normas espectrais ajuda a raciocinar sobre:

  • Constantes de Lipschitz (Lipschitz constants) (robustez, limites de generalização)
  • Explosão de ativações/gradientes (produtos de normas grandes)
  • Técnicas de normalização espectral (spectral normalization) para estabilizar redes adversariais generativas (Generative Adversarial Networks, GANs) e outros modelos

Iteração de potência para estimar o maior valor singular

Para matrizes grandes, você pode não querer uma decomposição em valores singulares completa. Uma aproximação comum é a iteração de potência (power iteration) em (A^\top A):

import numpy as np

def spectral_norm_estimate(A, iters=20):
    n = A.shape[1]
    v = np.random.randn(n)
    v /= np.linalg.norm(v)
    for _ in range(iters):
        v = A.T @ (A @ v)
        v /= np.linalg.norm(v)
    # Rayleigh quotient gives estimate of largest eigenvalue of A^T A
    sigma2 = v @ (A.T @ (A @ v))
    return np.sqrt(sigma2)

Isso fornece uma estimativa de (\sigma_{\max}(A)) sem computar a decomposição completa.

Autovalores em otimização: curvatura e tamanhos de passo

Embora a decomposição em valores singulares domine tarefas práticas com dados, autovalores aparecem com força na teoria de otimização.

Autovalores da Hessiana e curvatura

Para uma perda duas vezes diferenciável (L(w)), a Hessiana (H = \nabla^2 L(w)) descreve a curvatura. Perto de um mínimo de uma aproximação quadrática:

  • Autovalores grandes: direções íngremes (precisam de passos menores)
  • Autovalores pequenos: direções planas (o progresso é lento)
  • Autovalores negativos: direções de descida (pontos de sela / máximos)

Essa intuição se conecta diretamente ao motivo pelo qual:

  • A Descida do Gradiente “pura” pode ser lenta em vales mal condicionados
  • Pré-condicionamento e métodos de segunda ordem podem ajudar (quando viável)

Um exemplo quadrático simples

Para (f(w) = \frac{1}{2} w^\top H w) com (H \succ 0), a descida do gradiente converge apenas se:

[ 0 < \eta < \frac{2}{\lambda_{\max}(H)} ]

Assim, o maior autovalor limita a taxa de aprendizado (learning rate) máxima estável.

Computando decomposição em valores singulares e autovalores na prática

Complexidade e aproximações em larga escala

Uma decomposição em valores singulares completa é cara para matrizes grandes. Em cenários de ML em larga escala, estratégias comuns incluem:

  • Decomposição em valores singulares truncada (truncated SVD): computa apenas os (k) maiores valores/vetores singulares (útil para PCA e aproximação de baixo posto)
  • Decomposição em valores singulares randomizada (randomized SVD): método aproximado rápido com forte desempenho prático
  • Métodos de Lanczos/Arnoldi (Lanczos/Arnoldi methods): métodos iterativos para autovalores/valores singulares extremos

Se você está trabalhando em escala, a “matemática” e a “numérica” diferem de formas importantes; veja Álgebra Linear Numérica.

Recomendações práticas

  • Prefira solucionadores de mínimos quadrados baseados em decomposição em valores singulares (ou baseados em decomposição QR (QR decomposition)) em vez de equações normais (X^\top X) quando o condicionamento for uma preocupação.
  • Para PCA em dados esparsos de alta dimensionalidade (por exemplo, bag-of-words), use decomposição em valores singulares truncada/randomizada em vez de formar matrizes densas de covariância.
  • Ao interpretar resultados, observe o decaimento dos valores singulares:
    • Queda acentuada ⇒ forte estrutura de baixo posto
    • Decaimento lento ⇒ alta dimensionalidade intrínseca ou muito ruído

Resumo: modelos mentais para manter

  • Autovalores: direções especiais preservadas por uma matriz quadrada; cruciais para matrizes simétricas (covariâncias, Hessianas).
  • Decomposição em valores singulares: decomposição universal para qualquer matriz; “rotacionar → escalar → rotacionar”; valores singulares quantificam estiramento, energia e condicionamento.
  • PCA: tipicamente computada via decomposição em valores singulares dos dados centralizados; componentes principais são vetores singulares à direita; variância explicada vem de (\sigma_i^2).
  • Condicionamento: (\kappa = \sigma_{\max}/\sigma_{\min}) governa sensibilidade e dificuldade de otimização.
  • Aproximação de baixo posto: a decomposição em valores singulares truncada fornece a melhor aproximação de posto-(k); fundamental para compressão e remoção de ruído.

Autovalores e decomposição em valores singulares não são apenas álgebra linear abstrata — eles são a espinha dorsal de como diagnosticamos, estabilizamos e comprimimos sistemas reais de ML.