Exploding Gradient
Gradientes explosivos crescem exponencialmente durante a retropropagação, causando atualizações enormes dos pesos, picos na função de perda e valores NaN. Abrange causas, sinais e soluções.
Um gradiente explosivo é uma falha de treino em que os gradientes calculados por retropropagação crescem exponencialmente à medida que percorrem para trás uma rede neural profunda ou recorrente. A descida do gradiente aplica então atualizações enormes aos pesos do modelo, a função de perda dispara ou transforma-se em NaN ou inf, e o treino diverge. É o oposto do problema do gradiente evanescente. Pascanu, Mikolov e Bengio analisaram ambos os problemas nas redes neurais recorrentes e propuseram o recorte da norma do gradiente para lidar com gradientes explosivos, uma proteção que continua a ser padrão no treino de aprendizagem profunda.
Porque é que os gradientes explodem#
Pela regra da cadeia, o gradiente que chega a uma camada inicial é o produto de um fator por cada camada posterior ou, numa rede recorrente, por cada passo temporal. Quando esses fatores são sistematicamente superiores a 1, o produto cresce exponencialmente com a profundidade: um fator de 1.5 repetido ao longo de 30 camadas multiplica o sinal por cerca de 190,000. Entre as causas comuns estão uma inicialização inadequada dos pesos, uma taxa de aprendizagem demasiado elevada, entradas não normalizadas, sequências longas em modelos recorrentes e overflow no treino de precisão mista, em que os valores FP16 superiores a 65,504 se tornam inf. Os sinais são uma curva de perda que dá um salto repentino ou passa a NaN, registos da norma do gradiente que aumentam várias ordens de grandeza entre passos e pesos que se tornam NaN.
Prevenção e mitigação#
A maioria dos pipelines de treino modernos combina várias destas proteções.
- Recorte de gradientes: Quando a norma L2 global de todos os gradientes ultrapassa um limite, cada gradiente é reduzido pelo mesmo fator. A atualização mantém a direção e apenas o seu comprimento é limitado.
- Normalização por lotes: A normalização por lotes e a normalização por camada reescalam as ativações em cada camada, mantendo os sinais numa escala estável entre camadas e suavizando a superfície da função de perda.
- Inicialização cuidadosa: A inicialização Xavier (Glorot) e He escala os pesos iniciais para que a variância das ativações permaneça aproximadamente constante entre camadas.
- Ligações residuais: As ligações de salto proporcionam aos gradientes um percurso de identidade que contorna cada bloco, pelo que o sinal retropropagado é uma soma de percursos e não um único produto longo.
- Aquecimento da taxa de aprendizagem: Começar com uma taxa de aprendizagem baixa e aumentá-la gradualmente nos primeiros passos evita atualizações iniciais enormes enquanto os pesos e as estatísticas do otimizador ainda estão instáveis.
O excerto abaixo cria uma pilha de 30 camadas em que cada camada amplifica a entrada 1.5x e, em seguida, recorta o gradiente resultante com o PyTorch:
import torch
from torch import nn
torch.manual_seed(0)
# 30 stacked linear layers, each initialized to amplify its input by 1.5x
layers = [nn.Linear(64, 64, bias=False) for _ in range(30)]
for layer in layers:
nn.init.orthogonal_(layer.weight, gain=1.5)
model = nn.Sequential(*layers)
loss = model(torch.randn(8, 64)).pow(2).mean()
loss.backward()
# clip_grad_norm_ rescales all gradients in place and returns their norm before clipping
norm_before = nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
norm_after = nn.utils.get_total_norm([p.grad for p in model.parameters()])
print(f"Gradient norm before clipping: {norm_before:.2e}, after: {norm_after:.2f}")A norma bruta do gradiente é 9.90e+10 e, depois do recorte, é 1.00; assim, o passo seguinte do otimizador permanece limitado, independentemente da magnitude do gradiente bruto.
O treino do Ultralytics YOLO26 aplica esta proteção em cada passo: o treinador repõe a escala dos gradientes de precisão mista, recorta a respetiva norma global para 10.0 e permite que o escalonador de gradientes ignore qualquer atualização que ainda contenha valores inf ou NaN. Um treinador personalizado pode alterar o limite, por exemplo, reduzi-lo para 0.1 no RT-DETR.
Gradientes explosivos vs. gradientes evanescentes#
Ambos os problemas resultam do mesmo produto de fatores por camada na retropropagação. Fatores superiores a 1 fazem os gradientes explodir, causando atualizações instáveis, overflow numérico e divergência; a solução habitual é o recorte. Fatores inferiores a 1 fazem os gradientes diminuir até quase zero, impedindo a aprendizagem das camadas iniciais; as soluções habituais incluem ativações não saturáveis, como ReLU, ligações residuais e unidades recorrentes com portas, como as LSTMs. A normalização e uma inicialização cuidadosa ajudam a resolver ambos os problemas.
Aplicações no mundo real#
Os grandes modelos de linguagem são treinados ao longo de centenas de milhares de passos com sequências de texto longas, nas quais os picos repentinos da função de perda são um risco conhecido; por isso, as receitas de treino incluem o recorte de gradientes: o GPT-3 foi treinado com Adam e com a norma global do gradiente limitada a 1.0.
Na visão computacional, as redes profundas de deteção de objetos são treinadas com conjuntos de dados à escala do COCO, taxas de aprendizagem elevadas e precisão mista; por isso, o recorte e o escalonamento da perda impedem que um lote extremo e raro corrompa os pesos. Os detetores baseados em Transformer são mais sensíveis porque os gradientes que passam pela atenção cruzada do descodificador podem ter picos, pelo que modelos da família DETR, como RT-DETR e DINO, costumam usar um limite máximo da norma de 0.1.










