Ir para o conteúdo

Gradiente Descendente & Regularização

A solução em forma fechada do OLS é elegante, mas não escala para grandes quantidades de atributos, não existe para a maioria dos outros modelos e nada diz sobre controlar o sobreajuste. Esta aula acrescenta as duas ferramentas que fazem isso: o gradiente descendente — o motor de otimização por trás de quase todo o ML moderno — e a regularização — o freio padrão para a complexidade do modelo.

Gradiente descendente

Para minimizar uma perda diferenciável \(J(w)\), dê passos repetidos contra o gradiente (a direção de maior aumento):

\[ w^{(t+1)} = w^{(t)} - \eta \, \nabla_w J\big(w^{(t)}\big) \]

onde \(\eta\) é a taxa de aprendizado. Para a regressão linear com erro quadrático médio,

\[ J(w) = \frac{1}{n}\lVert y - Xw \rVert^2, \qquad \nabla_w J = -\frac{2}{n} X^\top (y - Xw), \]

uma tigela convexa com um único mínimo global — o gradiente descendente tem garantia de alcançá-lo para \(\eta\) pequeno o bastante.

A taxa de aprendizado

  • \(\eta\) pequeno demais → passos minúsculos, convergência dolorosamente lenta;
  • \(\eta\) grande demais → os passos ultrapassam o mínimo; a perda oscila ou diverge;
  • receita prática: experimente \(\eta \in \{10^{-3}, 10^{-2}, 10^{-1}\}\), monitore a curva de perda de treino — ela deve cair suavemente.

Sinta você mesmo — avance pela descida, depois defina \(\eta = 1.05\) e observe-a explodir:

Escalone seus atributos

Atributos não escalonados criam uma superfície de perda alongada, em forma de ravina: o gradiente aponta para o outro lado da ravina, não ao longo dela, e a convergência se arrasta. A padronização deixa a tigela redonda e o gradiente descendente rápido — a razão prática de o escalonamento importar para todos os modelos treinados por gradiente.

Batch, estocástico e mini-batch

Variante Gradiente calculado sobre Custo por passo Comportamento
Batch GD o conjunto de dados completo \(O(nd)\) descida exata e suave
GD estocástico (SGD) uma amostra aleatória \(O(d)\) ruidoso mas barato; escapa de armadilhas rasas
Mini-batch GD um lote de ~32–512 intermediário o padrão moderno (vetoriza bem)
from sklearn.linear_model import SGDRegressor
model = SGDRegressor(loss='squared_error', penalty='l2', alpha=1e-4,
                     learning_rate='invscaling', max_iter=1000)

O mesmo laço — com perdas diferentes — treina a regressão logística, as SVMs e as redes neurais. Aprenda-o uma vez, reutilize em todo lugar.

De retas a curvas: atributos polinomiais

A regressão linear é linear nos parâmetros, não necessariamente nas entradas. Expandir os atributos para potências, \(x \mapsto (x, x^2, \dots, x^p)\), ajusta polinômios com a mesma maquinaria do OLS:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures

model = make_pipeline(PolynomialFeatures(degree=3), LinearRegression())

Mas a flexibilidade corta dos dois lados:

Polinômio com subajuste, sobreajuste e regularização Ridge

O grau 1 subajusta — rígido demais para seguir o seno. O grau 15 sobreajusta — 16 parâmetros perseguem 25 pontos ruidosos, produzindo oscilações selvagens. O painel da direita mantém todos os 16 parâmetros mas adiciona uma penalidade Ridge: a curva relaxa de volta ao sinal. Isso é a regularização em ação.

Regularização

Em vez de restringir o número de parâmetros, penalize sua magnitude — adicione um termo de complexidade à perda:

Ridge (L2) — Tikhonov, 1943; Hoerl & Kennard, 1970

\[ J(w) = \lVert y - Xw \rVert^2 + \alpha \sum_{j=1}^{d} w_j^2 \]
  • encolhe todos os coeficientes suavemente em direção a zero (nunca exatamente zero);
  • distribui o peso entre atributos correlacionados — a cura padrão para a multicolinearidade;
  • a forma fechada ainda existe: \(\hat{w} = (X^\top X + \alpha I)^{-1} X^\top y\) — o \(\alpha I\) torna a matriz inversível mesmo com atributos colineares.

Lasso (L1) — Tibshirani, 1996

\[ J(w) = \lVert y - Xw \rVert^2 + \alpha \sum_{j=1}^{d} \lvert w_j \rvert \]
  • a penalidade de valor absoluto tem quinas em zero: as soluções pousam exatamente em zero para atributos fracos;
  • realiza seleção automática de atributos — os coeficientes não nulos que sobrevivem nomeiam os atributos que importam;
  • entre um grupo de atributos altamente correlacionados, tende a manter um arbitrariamente e zerar o resto.

O Elastic Net mistura ambas as penalidades (l1_ratio) — um padrão robusto quando os atributos são muitos e correlacionados.

from sklearn.linear_model import Ridge, Lasso, ElasticNet

Ridge(alpha=1.0)
Lasso(alpha=0.1)
ElasticNet(alpha=0.1, l1_ratio=0.5)

O botão α

O \(\alpha\) troca fidelidade aos dados por tamanho dos coeficientes:

  • \(\alpha \to 0\): OLS puro (sem freio);
  • \(\alpha \to \infty\): todos os coeficientes esmagados para ~0, o modelo prevê a média (freio total);
  • o \(\alpha\) certo não é conhecido de antemão — é escolhido por validação cruzada (RidgeCV, LassoCV ou uma busca em grade).

Escalone antes de regularizar — e não penalize o intercepto

A penalidade \(\sum w_j^2\) compara coeficientes entre atributos, o que só é justo se os atributos compartilharem uma escala: caso contrário, um atributo medido em quilômetros é penalizado de forma diferente do mesmo em metros. Padronize primeiro (em um Pipeline). Por convenção, o intercepto \(w_0\) é excluído da penalidade — o scikit-learn faz isso por você.

Material de aula

Notebook da aula (em português)

Notebook prático usado em sala — Aula 12 — Regressão Linear: abrir no Colab


Quiz