De Onde Vêm os Picos de Gradiente
Um Mini-Lote Calmo & Um Chocante
A maioria dos mini-lotes produz gradientes com magnitudes razoáveis. A perda de entropia cruzada para um modelo que já se ajusta aproximadamente aos dados permanece em uma banda estreita; a retropropagação carrega esse sinal de volta como gradientes de tamanho similar.
Alguns mini-lotes não. Três fontes de picos de gradiente:
1. Exemplos atípicos. Uma única sequência com uma combinação de tokens extremamente rara produz uma perda muito distante da média & um gradiente muito distante da média.
2. Casos extremos numéricos. Um denominador softmax próximo de zero, um layernorm que produz NaN, um overflow FP16. Cada um pode produzir gradientes ordens de magnitude maiores que o típico.
3. Mudanças de distribuição. Alternar fontes de dados durante uma única execução de treinamento choca o modelo com uma nova distribuição. O bandit do ANDREA reshuffla os pesos das fontes a cada 7 a 42 passos. Cada troca é uma pequena mudança de distribuição.
ANDREA-120M v1: Cascata de Spikes
A v1 não tinha clipping de gradiente. Transições de fonte a cada 7 a 42 passos do bandit alimentavam o modelo com breves rajadas de repo-docs (estruturado em listas), depois gutenberg (prosa longa), depois hermes3-general (Q&A). Cada transição produzia spikes de gradiente: cada spike empurrava os pesos para atratores degenerados na escala de 120M.
Fato empírico chave. ANDREA-12M sobreviveu ao mesmo bandido sem clipping. Matrizes de peso menores permanecem robustas a choques de gradiente; um único lote ruim não pode empurrar 12M parâmetros para um atrator de fuga da maneira que pode empurrar 120M. O clipping importa mais à medida que o modelo escala.
Clipping de Norma L2 Global
Duas Escolhas: Por Tensor ou Global
Duas maneiras de limitar as magnitudes dos gradientes:
Clipping por tensor. Clip cada tensor de gradiente independentemente. O gradiente de embedding é clipado para sua própria norma; o gradiente de atenção é clipado para sua própria norma. Simples, mas distorce escalas relativas: um pequeno pico em um tensor (agora gradiente zero) é pareado com um gradiente enorme em outro (intocado).
Clipping de norma L2 global. Trate todos os gradientes como um grande vetor. Calcule a norma L2 total em todos os parâmetros. Se a norma exceder max_norm, escale todos os gradientes pelo mesmo fator. Preserva magnitudes relativas entre tensores.
A ANDREA usa global. Pascanu et al. (2013) demonstraram empiricamente que o clipping global supera o por-tensor para o treinamento de transformers.
A Matemática
Calcule a norma L2 global:
norm = sqrt(soma sobre todos os params de g_i^2)
Se norm <= max_norm, os gradientes passam inalterados. Se norm > max_norm, escale todos os gradientes por max_norm / norm:
g_i_clipped = g_i * (max_norm / norm)
Após a escala, a nova norm equals exatamente max_norm. ANDREA usa max_norm = 1.0.
Calculando um Fator de Escala
Por Que o Cálculo de Norma de Gradiente Precisa de Três Kernels
O Algoritmo Naivo Não Pode Rodar em uma GPU
Pseudocódigo para computação de norma L2 global:
total = 0
para cada parâmetro p:
para cada elemento g em p.grad:
total += g * g
norm = sqrt(total)
Em uma GPU, este loop ingênuo falha por dois motivos:
1. Acumulação sequencial. Um único acumulador total força cada thread a esperar por todas as outras threads, anulando o paralelismo da GPU.
2. Tensores heterogêneos. ANDREA-120M tem tensores de formas muito diferentes: embedding (8449 x 768), attention QKV (768 x 768), layernorm (768). Um kernel não pode iterar eficientemente todas as formas.
Pipeline de Três Kernels do ANDREA
Divida o trabalho em três CUDA kernels em microgpt_cuda.cu:
Kernel 1: k_grad_norm_partial. Para cada tensor de parâmetro, compute uma soma parcial de quadrados. Cada thread block reduz um chunk do tensor; os resultados são escritos em um pequeno buffer de scratch. Paralelismo: um block por chunk, centenas de blocks em todos os tensores.
Kernel 2: k_grad_norm_final. Reduz o buffer de rascunho a um único escalar. Toma sua raiz quadrada. Um kernel pequeno, executa em microssegundos.
Kernel 3: k_grad_scale. Se norm > max_norm, compute scale = max_norm / norm & multiplique cada elemento do gradiente por scale. Uma passada por todos os tensores de gradiente, paralelismo embaraçosamente paralelo.
A Ordem Importa: Pré-Adam
O pipeline de clipping executa ANTES que o AdamW atualize m, v ou qualquer parâmetro. Por quê?
Gradientes clipados alimentam as médias móveis exponenciais do AdamW. Se um pico fosse permitido fluir para m & v, ele corromperia essas médias em execução & retardaria a recuperação por muitos passos após o pico. O clipping pré-Adam mantém o efeito do pico confinado ao único passo ruim.
Por que Três Kernels, Não Um?
Como o No-Clipping Matou a v1
Transições de Fonte do Bandit a Cada 7 a 42 Passos
O bandit do ANDREA opera em fases. Cada fase dura 7, 14, 21, 28 ou 42 passos (escolhido aleatoriamente). Em cada limite de fase, os pesos das fontes mudam: talvez repo-docs salte de 0.1 para 0.6, gutenberg caia de 0.4 para 0.1, hermes3-general suba de 0.5 para 0.7.
Cada transição é um choque de distribuição para o modelo. A perda sobe brevemente. Os gradientes sobem junto: um modelo que estava minimizando a perda contra prosa com sabor gutenberg agora vê estruturas de lista com sabor repo-docs, & os gradientes carregam um sinal corretivo que pode ser 10x ou 100x a magnitude típica.
Modo de Falha da v1
Sem clipping, aqueles picos de gradiente de 10-100x fluíam para as médias m & v do AdamW. O suavização do AdamW significava que o efeito do pico persistia por muitos passos após o lote ruim real. Combinado com ausência de weight decay (Adam vanilla no v1), as atualizações de peso impulsionadas por picos se acumulavam ao longo de fases até que os pesos derivassem para um atrator degenerado: o logit de um token dominava o softmax, a saída amostrada era esse token, o contexto de treinamento continha esse token, o gradiente reforçava esse token. Travamento por repetição.
Estabilidade v2
v2 adicionou clipping com max_norm = 1.0, junto com AdamW & aquecimento de LR. O efeito do pico em m & v é limitado; os pesos não podem derivar mais rápido que lr max_norm = 0.0003 1.0 = 0.0003 por parâmetro por passo no pico. Transições de fase ainda produzem picos, mas esses picos são limitados antes de alcançarem o otimizador.
Resultado: v2 (após filtro de dados v2.5 & polimento v3) alcançou recall factual, coerência multi-parágrafo, & notas 9.5/10 externas em amostras de biologia & processamento de sinal.
O Acoplamento Capacidade-Frágilidade
Mesmo bandido. Mesmos dados. Mesmos hiperparâmetros exceto clipping. Por que 12M sobreviveu sem clipping enquanto 120M colapsou?
Dois fatores compostos:
1. Matrizes de peso maiores armazenam mais atratores. Uma projeção de atenção 768x768 tem 590K parâmetros; mesmo uma derivação pequena por parâmetro produz mudanças significativas no comportamento de atenção. Uma projeção de atenção 384x384 tem 147K parâmetros & permanece em um subespaço mais restrito.
2. Mais camadas significa mais interações multiplicativas. v3 tem 12 camadas transformer (vs 6 para 12M). Picos propagam através de 12 camadas de não-linearidades compostas; cada camada pode amplificar a derivação da camada anterior.
Fragilidade se acumula com capacidade. Clipping se torna obrigatório acima de algum limiar de escala; ANDREA coloca esse limiar em algum lugar entre 12M & 120M parâmetros.
Diagnóstico da Cascata v1
Onde Mais o Clipping se Aplica?
Atividades Adjacentes
Três irmãos ligam ao clipping:
- Atividade 10: AdamW. O clipping protege m e v do AdamW da contaminação por picos. Sem clipping, um lote ruim corrompe o estado do otimizador por 50+ passos.
- Atividade 11: Aquecimento de LR (LR warmup). O aquecimento amorteca lr; o clipping amortece g. Juntos: no passo 1, a atualização de parâmetro no pior caso é lr_after_warmup max_norm = 1.5e-7 1.0 = 1.5e-7, vs 0.0003 * 50 = 0.015 sem nenhuma proteção. Uma redução de 100.000x na magnitude da atualização inicial no pior caso.
- Atividade 14: Multi-armed bandits. A duração da fase de bandit (7 a 42 passos) é curta especificamente para impedir que uma única fonte domine; o clipping é o que torna essas transições frequentes seguras.
O clipping é a vitória de estabilidade mais barata no treinamento de transformers: 3 pequenos kernels CUDA, microssegundos por passo, impacto decisivo sobre se modelos de 120M+ convergem ou colapsam.