Agendamentos de Taxa de Aprendizado

O que é um Cronograma de Taxa de Aprendizado?

Uma taxa de aprendizado (TA) controla o tamanho do passo das atualizações de parâmetros durante o treinamento com Descida do Gradiente e algoritmos relacionados. Um cronograma de taxa de aprendizado é uma regra para alterar esse tamanho de passo ao longo do tempo (por passo ou por época).

Mesmo com métodos adaptativos como Adam (ver Otimizadores), a taxa de aprendizado global ainda influencia fortemente:

  • Estabilidade (evitar divergência e picos na perda)
  • Velocidade (quão rapidamente você se aproxima de uma boa solução)
  • Generalização (quão bem o modelo final se sai em dados não vistos)
  • Eficiência de treinamento (especialmente em escala com tamanhos de lote grandes)

Cronogramas importam porque a dinâmica de treinamento não é estacionária: no início, o treinamento frequentemente se beneficia de passos exploratórios maiores, enquanto no final se beneficia de passos menores que refinam a solução.

Por que mudar a taxa de aprendizado ajuda (intuição + um pouco de teoria)

Curvatura local e tamanhos de passo seguros

Em otimização suave, uma diretriz comum de estabilidade para a descida do gradiente “pura” é que o tamanho do passo deve ser pequeno o suficiente em relação à curvatura (informalmente ligada a uma constante de Lipschitz do gradiente). Se a taxa de aprendizado for grande demais, as atualizações podem ultrapassar o ponto e oscilar ou divergir.

As paisagens de perda de redes neurais são não convexas e ruidosas, mas a mesma intuição se mantém: à medida que o treinamento progride, você frequentemente quer:

  • No início: passos maiores para progredir rapidamente e sair de regiões ruins
  • No fim: passos menores para evitar ficar “quicando” e para se acomodar em um bom vale

A estocasticidade muda ao longo do tempo

Com treinamento por minibatch, gradientes são estimativas ruidosas. A taxa de aprendizado “correta” interage com:

  • Tamanho do lote: lotes maiores reduzem o ruído do gradiente, frequentemente permitindo taxas de aprendizado maiores
  • Estado do otimizador: os momentos (médias móveis) do Adam são mal estimados bem no começo
  • Condicionamento do modelo: afetado por Inicialização e Normalização e pode mudar conforme recursos/ativações evoluem

É por isso que cronogramas — especialmente aquecimento (warmup) e decaimento (decay) — são comuns no aprendizado profundo moderno.

Ingredientes centrais: TA base, aquecimento, decaimento

A maioria dos cronogramas práticos pode ser descrita por:

  1. TA base (TA de pico): a TA máxima que você pretende usar (frequentemente após o aquecimento)
  2. Fase de aquecimento: aumentar gradualmente a TA de um valor pequeno até a TA base
  3. Fase de decaimento: reduzir a TA ao longo do restante do treinamento para refinar a convergência

O restante deste artigo foca em aquecimento, decaimento cosseno (cosine decay) e estratégias práticas para escolhê-los e implementá-los.

Aquecimento

O que é aquecimento?

Aquecimento aumenta a taxa de aprendizado a partir de um valor inicial pequeno até um valor-alvo ao longo de um certo número de passos/épocas.

Os aquecimentos mais comuns são:

  • Aquecimento linear: a TA aumenta linearmente com o passo
  • Aquecimento exponencial: a TA aumenta multiplicativamente (menos comum)

Uma fórmula típica de aquecimento linear ao longo de W passos:

[ \text{lr}(t)=\text{lr}{\text{start}} + (\text{lr}{\text{peak}}-\text{lr}_{\text{start}})\cdot \frac{t}{W}, \quad t \in [0,W] ]

Frequentemente (\text{lr}{\text{start}} = 0) ou uma pequena fração de (\text{lr}{\text{peak}}).

Por que o aquecimento funciona (razões práticas)

O aquecimento é particularmente útil quando:

  • Usando Adam/AdamW: estimativas iniciais dos momentos são enviesadas e instáveis; o aquecimento reduz a chance de passos grandes e danosos.
  • Treinando Transformers: o aquecimento é amplamente usado em modelos de Arquitetura Transformer; camadas iniciais e atenção podem ser sensíveis a grandes atualizações.
  • Treinamento com lote grande: escalar a TA com o tamanho do lote pode tornar os passos iniciais agressivos demais sem aquecimento.
  • Precisão mista: escalonamento de gradientes e particularidades numéricas podem amplificar a instabilidade inicial.

O aquecimento não é “gratuito” — ele desacelera um pouco o progresso inicial —, mas frequentemente previne instabilidade catastrófica e melhora o desempenho final.

Quanto deve durar o aquecimento?

Heurísticas comuns (escolha uma e ajuste levemente):

  • Passos fixos: por exemplo, 500–10.000 passos dependendo do tamanho do conjunto de dados/modelo
  • Fração do treinamento: por exemplo, 1%–10% do total de passos
  • Mais curto para modelos/conjuntos pequenos, mais longo para pré-treinamento em grande escala

Para muitas configurações modernas:

  • Ajuste fino: aquecimento ~ 0–2% (às vezes nenhum)
  • Pré-treinamento de modelos grandes: aquecimento ~ 1–5% é comum

Armadilhas do aquecimento

  • Aquecimento medido em épocas vs passos: se o tamanho do dataloader mudar ou você usar acumulação de gradiente, aquecimento por passos é mais robusto.
  • Acumulação de gradiente: o aquecimento normalmente deve ser baseado em passos de atualização do otimizador, não em micro-lotes.
  • Treinamento distribuído: o tamanho global do lote muda a dinâmica de treinamento; um aquecimento ajustado para uma única GPU pode não se transferir.

Decaimento cosseno (recozimento cosseno)

O que é decaimento cosseno?

Após o aquecimento, o decaimento cosseno reduz a TA suavemente seguindo uma curva cosseno, de um máximo até um mínimo:

[ \text{lr}(t) = \text{lr}{\min} + \frac{1}{2}(\text{lr}{\max} - \text{lr}_{\min}) \left(1 + \cos\left(\pi \cdot \frac{t}{T}\right)\right) ]

Onde:

  • (t) é o passo dentro da fase de decaimento
  • (T) é o número total de passos de decaimento
  • (\text{lr}_{\max}) é tipicamente a TA de pico após o aquecimento
  • (\text{lr}_{\min}) é a TA final (frequentemente pequena, talvez 0 ou um piso como 1e-6)

O decaimento cosseno tende a funcionar bem porque ele:

  • Evita quedas abruptas (ao contrário de cronogramas em degraus)
  • Decai lentamente no início, mantendo a TA alta enquanto você ainda obtém grandes ganhos
  • Decai de forma mais agressiva depois, permitindo convergência fina
  • É um padrão forte para muitas tarefas (visão, linguagem, aprendizado auto-supervisionado)

Na prática, o decaimento cosseno frequentemente é combinado com aquecimento e AdamW, formando uma receita moderna de treinamento amplamente usada.

Cosseno com reinícios

Uma variante é o recozimento cosseno com reinícios quentes (SGDR), em que a TA retorna periodicamente a um valor mais alto. Isso pode ajudar na exploração e às vezes melhora resultados, mas também adiciona complexidade e pode interagir de forma estranha com parada antecipada e checkpointing baseado em validação.

Para a maioria dos treinamentos de execução única (especialmente pré-treinamento em grande escala), um decaimento cosseno sem reinícios é a linha de base forte mais simples.

Outros cronogramas comuns (para contexto)

Mesmo que seu foco seja aquecimento + cosseno, ajuda reconhecer alternativas:

  • TA constante: surpreendentemente forte quando bem ajustada; frequentemente combinada com parada antecipada.
  • Decaimento em degraus: reduzir a TA por um fator (por exemplo, ×0,1) em épocas fixas; clássico no treinamento de CNNs.
  • Decaimento exponencial: multiplicar a TA por uma constante a cada época/passo.
  • Decaimento polinomial: comum em segmentação; decai como ((1 - t/T)^p).
  • Política de um ciclo (one-cycle policy): a TA aumenta e depois diminui (frequentemente com momentum variando inversamente). Funciona bem em muitos cenários supervisionados.

O decaimento cosseno é frequentemente escolhido porque é suave, simples e confiável entre domínios.

Estratégias práticas de cronograma (o que usar e quando)

Estratégia A: Aquecimento + decaimento cosseno (padrão moderno)

Use quando: treinando Transformers, modelos de visão, ou a maioria das redes profundas com AdamW; especialmente bom para treinamento em grande escala.

Padrão típico:

  • Aquecimento: 1–5% dos passos (linear)
  • Decaimento: cosseno até um pequeno piso
  • Opcional: definir lr_min como 0 ou ~1e-6 dependendo da escala

Este é um “padrão seguro” comum no aprendizado profundo contemporâneo.

Estratégia B: Decaimento em degraus (linha de base clássica supervisionada)

Use quando: treinando CNNs com SGD + momentum; ao reproduzir linhas de base mais antigas.

Exemplo:

  • TA inicial = 0,1
  • Reduzir ×0,1 nas épocas 30, 60, 90 (para 100 épocas)

Isso ainda pode ser competitivo, mas tende a exigir mais ajuste específico da tarefa.

Estratégia C: TA constante + parada antecipada (simples e frequentemente eficaz)

Use quando: ajuste fino, conjuntos de dados pequenos, iteração rápida.

Uma TA constante pode ser excelente se:

  • A TA for ajustada cuidadosamente
  • Você monitora métricas de validação e para cedo
  • Você se apoia em Regularização e boas aumentações

Estratégia D: Reduzir ao atingir platô (guiada por validação)

Use quando: você não sabe a duração do treinamento com antecedência ou a validação é a prioridade.

Desvantagem: introduz um laço de realimentação com métricas de validação ruidosas e é menos comum em pré-treinamento em grande escala, onde cronogramas baseados em passos são preferidos.

Escolhendo a taxa de aprendizado de pico

Um cronograma não salva uma TA de pico absurdamente errada. Boas maneiras de selecioná-la:

  • Regra prática a partir de receitas conhecidas: por exemplo, TA de pico do AdamW em torno de 1e-4 a 5e-4 para muitas configurações de ajuste fino com Transformer (altamente dependente de tarefa/modelo).
  • Teste de faixa de TA (LR range test) (LR finder): aumentar a TA exponencialmente em uma execução curta e escolher a maior TA antes de a perda explodir.
  • Heurísticas de escalonamento por tamanho do lote:
    • Para SGD, a regra de escalonamento linear é comum: TA ∝ tamanho do lote (dentro de limites).
    • Para Adam/AdamW, o escalonamento é menos previsível; muitos profissionais ainda escalam um pouco com o tamanho do lote, mas ajustam.

Considere também Problemas de Gradiente: se gradientes explodem, a TA de pico pode precisar ser reduzida ou você pode precisar de clipping de gradiente.

Exemplos de implementação

PyTorch: aquecimento linear + decaimento cosseno (por passo)

import math
import torch

optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)

total_steps = 100_000
warmup_steps = 2_000
lr_peak = 1e-3
lr_min = 1e-5

def lr_at_step(step):
    if step < warmup_steps:
        return lr_peak * (step + 1) / warmup_steps
    # cosine decay
    t = step - warmup_steps
    T = total_steps - warmup_steps
    cosine = 0.5 * (1 + math.cos(math.pi * t / T))
    return lr_min + (lr_peak - lr_min) * cosine

for step, batch in enumerate(train_loader):
    lr = lr_at_step(step)
    for pg in optimizer.param_groups:
        pg["lr"] = lr

    loss = training_step(batch)
    loss.backward()
    torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)  # optional
    optimizer.step()
    optimizer.zero_grad()

Notas:

  • Este cronograma é baseado em passos, o que geralmente é preferível para loops de treinamento modernos.
  • Se você usar acumulação de gradiente, step deve contar passos do otimizador, não micro-passos.

Agendadores embutidos do PyTorch (LambdaLR)

from torch.optim.lr_scheduler import LambdaLR
import math

optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3)

total_steps = 100_000
warmup_steps = 2_000
lr_min_ratio = 1e-2  # lr_min = lr_peak * lr_min_ratio

def lr_lambda(step):
    if step < warmup_steps:
        return (step + 1) / warmup_steps
    t = step - warmup_steps
    T = total_steps - warmup_steps
    cosine = 0.5 * (1 + math.cos(math.pi * t / T))
    return lr_min_ratio + (1 - lr_min_ratio) * cosine

scheduler = LambdaLR(optimizer, lr_lambda=lr_lambda)

for step, batch in enumerate(train_loader):
    loss = training_step(batch)
    loss.backward()
    optimizer.step()
    scheduler.step()
    optimizer.zero_grad()

Aquecimento ao estilo Transformers + raiz quadrada inversa (histórico)

O artigo original do Transformer usou um cronograma aproximadamente como:

[ \text{lr}(t) \propto d_{\text{model}}^{-0.5} \cdot \min(t^{-0.5}, t\cdot \text{warmup}^{-1.5}) ]

Isso é menos comum hoje do que aquecimento + decaimento cosseno, mas você ainda verá em algumas bases de código por compatibilidade e reprodutibilidade.

Dicas práticas e depuração

1) Agende em relação à variável de “tempo” correta

  • Prefira passos do otimizador como unidade de tempo.
  • Se você mudar tamanho do lote, número de workers ou tamanho do conjunto de dados, cronogramas baseados em épocas podem mudar sem intenção.

2) Acompanhe a TA nos logs

Sempre registre:

  • TA atual
  • Perda
  • Norma do gradiente (opcional, mas útil)
  • Métrica de validação

Picos na perda frequentemente se correlacionam com transições de TA (fim do aquecimento, reinícios, quedas em degraus).

3) Aquecimento não substitui corrigir instabilidade

Se o treinamento divergir:

  • Reduza a TA de pico
  • Adicione clipping de gradiente
  • Verifique Inicialização e Normalização
  • Inspecione configurações de escalonamento de perda / precisão mista
  • Verifique o pipeline de dados (lotes ruins podem parecer problemas de TA)

4) Considere a interação com weight decay (AdamW)

Com AdamW, weight decay é desacoplado dos gradientes, mas a regularização efetiva ainda depende da TA e da duração do treinamento. Uma cauda muito longa com TA baixa pode mudar o efeito líquido de weight decay. Veja Regularização para um contexto mais amplo.

5) Ajuste fino vs pré-treinamento

  • Ajuste fino: execuções mais curtas; você frequentemente quer TA de pico menor, aquecimento mais curto e às vezes um decaimento mais rápido.
  • Pré-treinamento: execuções longas; aquecimento é mais importante; decaimento cosseno é um padrão forte.

Exemplo trabalhado: escolhendo um cronograma para ajuste fino de um Transformer

Suponha que você esteja fazendo ajuste fino de um codificador Transformer em uma tarefa de classificação por 3 épocas, 10k passos no total.

Um ponto de partida razoável:

  • Otimizador: AdamW
  • TA de pico: 2e-5 a 5e-5 (típico para muitos ajustes finos em PLN; varia com o tamanho do modelo)
  • Aquecimento: 500 passos (~5%)
  • Decaimento: cosseno até 10% do pico (ou até 0)

Por quê:

  • O aquecimento reduz a instabilidade inicial conforme a cabeça do classificador e as normalizações de camada se adaptam.
  • O decaimento cosseno ajuda a evitar atualizações excessivas no fim do treinamento, melhorando a estabilidade na validação.

Se você observar subajuste (a perda de treino quase não diminui), aumente a TA de pico ou reduza a agressividade do decaimento. Se você observar picos de perda cedo, aumente o aquecimento ou reduza a TA de pico.

Resumo: padrões recomendados

Para muitos projetos modernos de aprendizado profundo, um padrão forte é:

  • Cronograma baseado em passos
  • Aquecimento linear (1–5% do total de passos)
  • Decaimento cosseno até um pequeno piso (0 ou algo como 1e-6)
  • Ajuste TA de pico primeiro; depois ajuste levemente a duração do aquecimento

Cronogramas de taxa de aprendizado ficam na interseção entre teoria de otimização e engenharia de treinamento. Eles são um dos controles de maior alavancagem que você pode ajustar — especialmente junto com sua escolha de Otimizadores e atenção à estabilidade de treinamento via Problemas de Gradiente, Retropropagação e Inicialização e Normalização.