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:
- Rotacionar/refletir o espaço de entrada por (V^\top)
- Escalar ao longo de eixos ortogonais por (\Sigma)
- 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.
- Centralize os dados: (X_c = X - \text{mean}(X))
- Compute a decomposição em valores singulares:
[ X_c = U \Sigma V^\top ] - As direções principais (componentes principais (principal components)) são as colunas de (V).
- 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.