Se \(\frac{d^2l}{d\theta^2} > 0\) em um ponto estacionário \(\implies\) Mínimo Local.
Se \(\frac{d^2l}{d\theta^2} < 0\) em um ponto estacionário \(\implies\) Máximo Local.
Se \(\frac{d^2l}{d\theta^2} = 0 \implies\) Inconclusivo.
Encontrando Mínimos Analiticamente
Desafio: Resolver analiticamente \(\nabla f(\boldsymbol{\theta}) = \mathbf{0}\) é frequentemente impossível para modelos complexos de AM.
Encontrando Mínimos Analiticamente
Otimização Numérica:
A Necessidade de Iteração
Como geralmente não podemos resolver para o mínimo diretamente, usamos métodos iterativos.
Comece com uma estimativa inicial \(\boldsymbol{\theta}_0\).
Atualize repetidamente a estimativa para se mover em direção a valores mais baixos da função.
Ideia Chave: Use o gradiente para guiar as atualizações.
Otimização Contínua
Gradiente Descendente;
Gradiente Descendente com Momento;
Gradiente Descendente Estocástico;
Otimização com Restrições;
Multiplicadores de Lagrange;
Otimização
Gradiente Descendente
Queremos encontrar o mínimo de uma função \(f(\boldsymbol{\theta})\) onde \(\boldsymbol{\theta} \in \mathbb{R}^p\), ou seja, encontrar \[\min_{\boldsymbol{\theta} \in \mathbb{R}^p} f(\boldsymbol{\theta})\] onde \(f\) é diferenciável.
O gradiente descendente é um algoritmo de otimização de primeira ordem.
Para encontrar um mínimo local de uma função usando o gradiente descendente, damos passos proporcionais ao negativo do gradiente da função no ponto atual.
O gradiente \(\nabla f(\boldsymbol{\theta})\) aponta na direção de maior crescimento.
O gradiente negativo \(-\nabla f(\boldsymbol{\theta})\) aponta na direção de maior decrescimento.
Otimização
Gradiente Descendente
Algoritmo:
Comece em \(\boldsymbol{\theta}_0\).
mas, no caso geral, itere: \[
\boldsymbol{\theta}_{i+1} = \boldsymbol{\theta}_i - \gamma_i (\nabla f(\boldsymbol{\theta}_i))^\top
\]
\(\boldsymbol{\theta}_i\): Estimativa atual do parâmetro.
\(\nabla f(\boldsymbol{\theta}_i)\): Gradiente de \(f\) em \(\boldsymbol{\theta}_i\).
\(\gamma_i\): Tamanho do passo (ou taxa de aprendizado) na iteração \(i\). Geralmente \(\gamma_i = \gamma > 0\).
Se \(\gamma\) for pequeno o suficiente e \(\gamma_i (\nabla f(\boldsymbol{\theta}_i))^\top \geq 0\), \(f(\boldsymbol{\theta}_{i+1}) \le f(\boldsymbol{\theta}_i)\).
Otimização
Gradiente Descendente
Exemplo:
\[f(\theta) = \theta (\theta - 1)\]
Qual é o valor de \(\theta\) que minimiza esta função?
optimizier$zero_grad() ftheta <-f(theta) ftheta$backward() optimizier$step()points(theta, ftheta, col ="red")Sys.sleep(0.1)}# o passo é muito pequeno!# temos que mudar a "taxa de aprendizado"theta
\(\gamma\) Muito Pequeno: Convergência muito lenta. Muitos passos são necessários.
\(\gamma\) Muito Grande: Ultrapassa o mínimo, oscilações, divergência (o valor da função aumenta).
Efeito da taxa de aprendizado - https://www.jeremyjordan.me
O Tamanho do Passo (\(\gamma\))
Escolhendo o Tamanho do Passo
\(\gamma\) Fixo: Abordagem mais simples, requer ajuste.
\(\gamma\) Decrescente: Comece maior, diminua ao longo do tempo (ex: \(\gamma_i = \gamma_0 / (1+ki)\)). Comum em aprendizado profundo.
Métodos Adaptativos: Ajustam \(\gamma\) com base no progresso da otimização.
Heurística:
Se \(f(\boldsymbol{\theta}_{i+1}) > f(\boldsymbol{\theta}_i)\) (valor aumentou): Desfaça o passo, diminua \(\gamma\).
Se \(f(\boldsymbol{\theta}_{i+1}) < f(\boldsymbol{\theta}_i)\) (valor diminuiu): Talvez aumente \(\gamma\).
Existem métodos mais sofisticados (AdaGrad, RMSProp, Adam - além deste capítulo).
Busca em Linha: Encontre o \(\gamma_i\) ótimo em cada passo que minimiza \(f(\boldsymbol{\theta}_i - \gamma \nabla f(\boldsymbol{\theta}_i))\) ao longo da direção do gradiente. Pode ser custoso.
Gradiente Descendente com Momento
Gradiente Descendente com Momento
Ideia: Introduzir um termo de “velocidade” \(\Delta \boldsymbol{\theta}_i\) que acumula gradientes passados. A atualização depende do gradiente atual e da direção anterior.
Regras de Atualização:\[
\Delta \boldsymbol{\theta}_{i+1} = \alpha \Delta \boldsymbol{\theta}_i - \gamma (\nabla f(\boldsymbol{\theta}_i))^\top \quad (\text{Atualização da velocidade})
\]\[
\boldsymbol{\theta}_{i+1} = \boldsymbol{\theta}_i + \Delta \boldsymbol{\theta}_{i+1} \quad (\text{Atualização da posição})
\]
\(\alpha \in [0,1]\): Parâmetro de momento (ex: 0.9), fator de decaimento para a velocidade passada.
\(\Delta \boldsymbol{\theta}_i\): Mudança em \(\boldsymbol{\theta}\) do passo \(i-1\) para \(i\), ou seja, \[\Delta \boldsymbol{\theta}_i = \boldsymbol{\theta}_i - \boldsymbol{\theta}_{i-1} = \alpha \Delta \boldsymbol{\theta}_{i-1} - \gamma (\nabla f(\boldsymbol{\theta}_{i-1}))^\top\]
Um α mais alto dá mais importância ao passado, preservando mais da velocidade anterior nas atualizações.
Momento: Intuição
Como uma bola pesada rolando morro abaixo.
Acumula velocidade em direções consistentes de descida.
Faz a média dos componentes oscilantes do gradiente.
Ajuda a passar por pequenos mínimos locais ou regiões planas.
Momento vs GD - https://cs231n.github.io/neural-networks-3/
Custo Computacional
A função objetivo em AM é frequentemente uma soma sobre n pontos de dados: \[
\mathcal{L}(\boldsymbol{\theta}) = \frac{1}{n} \sum_{i=1}^n \mathcal{L}_i(\boldsymbol{\theta})\]
\(\mathcal{L}_i(\boldsymbol{\theta})\): Perda para o \(i\)-ésimo ponto de dados \((\boldsymbol{\theta}_i, y_i)\).
O gradiente também é uma soma: \[
\nabla \mathcal{L}(\boldsymbol{\theta}) = \frac{1}{n} \sum_{i=1}^n \nabla \mathcal{L}_i(\boldsymbol{\theta})
\]
Calcular o gradiente completo requer a iteração por todo o conjunto de dados a cada passo.
Impraticável para grandes conjuntos de dados (ex: milhões de imagens).
Gradiente Descendente Estocástico (SGD)
Gradiente Descendente Estocástico (SGD)
Ideia: Aproximar o gradiente completo usando apenas um ou um pequeno lote de pontos de dados a cada passo.
SGD de Ponto Único:
Escolha um ponto de dados aleatório \(i\) de \(\{1, \ldots, n\}\).
Atualize usando apenas o gradiente para aquele ponto: \[
\boldsymbol{\theta}_{i+1} = \boldsymbol{\theta}_i - \gamma_i (\nabla \mathcal{L}_i(\boldsymbol{\theta}_i))^\top
\]
SGD de Mini-lote (Mais Comum):
Escolha um mini-lote aleatório \(\mathcal{B}\) de tamanho \(B\) (ex: \(B=32, 64, \ldots\)) de \(\{1, \ldots, n\}\).
Atualize usando o gradiente médio sobre o mini-lote: \[
\boldsymbol{\theta}_{i+1} = \boldsymbol{\theta}_i - \gamma_i \left( \frac{1}{B} \sum_{i \in \mathcal{B}} \nabla \mathcal{L}_i(\boldsymbol{\theta}_i) \right)^\top
\]
SGD: Por Que Funciona?
Em média, o gradiente estocástico aponta na mesma direção do gradiente verdadeiro.
Atualizações muito mais rápidas: O custo por passo é proporcional a \(B\), não a \(n\).
Gradientes Ruidosos: O caminho percorrido é muito mais ruidoso do que o GD de lote completo.
Caminho do SGD vs GD - pulse/gradient-descent-gd-stochastic-sgd-vekil-bekmyradov-qvs4e/
SGD: Prós e Contras
Prós:
Computacionalmente eficiente: Escala para conjuntos de dados massivos.
Progresso inicial mais rápido: Pode fazer atualizações com mais frequência.
O ruído pode ajudar a escapar de mínimos locais: A aleatoriedade pode tirar os parâmetros de ótimos locais rasos.
Muitas vezes leva a uma melhor generalização (desempenho em dados não vistos), talvez porque encontre mínimos “mais planos”.
Contras:
Atualizações ruidosas: A convergência pode ser errática, pode não se estabilizar precisamente no mínimo. Requer ajuste cuidadoso do cronograma da taxa de aprendizado (diminuindo \(\gamma\)).
Maior variância nas atualizações dos parâmetros em comparação com o GD em lote. O tamanho do mini-lote \(B\) controla essa troca.
Conclusão
A otimização contínua fornece o motor para treinar muitos modelos de aprendizado de máquina.
O Gradiente Descendente e suas variantes estocásticas são as ferramentas principais, especialmente para problemas de grande escala.
An Introduction to Statistical Learning: with Applications in R, James, G., Witten, D., Hastie, T. and Tibshirani, R., Springer, 2013, link: https://www.statlearning.com/.
Mathematics for Machine Learning, Deisenroth, M. P., Faisal. A. F., Ong, C. S., Cambridge University Press, 2020, link: https://mml-book.com.
Referências
Complementares
An Introduction to Statistical Learning: with Applications in python, James, G., Witten, D., Hastie, T. and Tibshirani, R., Taylor, J., Springer, 2023, link: https://www.statlearning.com/.
Matrix Calculus (for Machine Learning and Beyond), Paige Bright, Alan Edelman, Steven G. Johnson, 2025, link: https://arxiv.org/abs/2501.14787.