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:
- TA base (TA de pico): a TA máxima que você pretende usar (frequentemente após o aquecimento)
- Fase de aquecimento: aumentar gradualmente a TA de um valor pequeno até a TA base
- 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)
Por que o decaimento cosseno é popular
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_mincomo 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,
stepdeve 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.