Vanishing Gradient
O problema do gradiente evanescente ocorre quando os gradientes diminuem camada a camada durante a retropropagação, fazendo com que as camadas iniciais deixem de aprender. Abrange causas e soluções.
O problema do desaparecimento do gradiente ocorre quando os gradientes que a retropropagação envia da perda em direção às primeiras camadas de uma rede neuronal profunda diminuem geometricamente à medida que aumenta a profundidade, pelo que as camadas iniciais recebem atualizações demasiado pequenas para aprenderem alguma coisa. Como o gradiente numa camada é o produto das derivadas locais de todas as camadas acima dela, uma rede em que cada camada multiplica o gradiente por um fator inferior a 1 pode reduzir o gradiente em várias ordens de grandeza entre a saída e a entrada. Sepp Hochreiter analisou o efeito na sua tese de 1991, e o problema continuou a dificultar o treino de redes neuronais feedforward profundas e redes neuronais recorrentes (RNNs) até surgirem melhores funções de ativação, esquemas de inicialização e arquiteturas.
Porque desaparecem os gradientes#
A retropropagação aplica a regra da cadeia, pelo que o gradiente que chega a uma camada é o gradiente a montante multiplicado pela matriz de pesos e pela derivada da função de ativação de cada camada posterior. A derivada da sigmoide nunca ultrapassa 0,25, o seu valor para uma entrada igual a 0, e tende a 0 quando a unidade satura com entradas muito positivas ou negativas. A derivada da tanh atinge o valor máximo de 1 e também tende a 0 quando satura. Assim, vinte camadas sigmoides multiplicam o gradiente, no máximo, por 0,25²⁰, um valor inferior a 10⁻¹², mesmo antes de contabilizar os pesos. A escala dos pesos é tão importante como a ativação: Glorot e Bengio atribuíram grande parte da dificuldade à inicialização e propuseram variâncias dos pesos ajustadas ao número de entradas e saídas de cada camada, para manter aproximadamente constantes as variâncias das ativações e dos gradientes ao longo das camadas.
É fácil medir o efeito comparando os tamanhos dos gradientes dos pesos na primeira e na última camada de uma rede sigmoide com 20 camadas, com e sem atalhos residuais:
import torch
torch.manual_seed(0)
x = torch.randn(64, 32)
# The same 20-layer sigmoid network, without and with residual shortcuts
for residual in (False, True):
layers = [torch.nn.Linear(32, 32) for _ in range(20)]
h = x
for layer in layers:
out = torch.sigmoid(layer(h))
h = h + out if residual else out
h.sum().backward()
# Compare the weight-gradient size at the last layer and the first layer
last, first = layers[-1].weight.grad.norm(), layers[0].weight.grad.norm()
print(f"residual={residual}: layer 20 gradient {last:.1e}, layer 1 gradient {first:.1e}")Sem atalhos, a norma do gradiente da última camada é 2.5e+02 e a da primeira camada é 4.2e-15, cerca de 17 ordens de grandeza menor, pelo que os pesos da primeira camada praticamente nunca mudam. Com atalhos residuais, o gradiente da primeira camada é 5.6e+01, cerca de 38 vezes menor do que o gradiente da última camada, 2.1e+03.
Gradientes evanescentes vs. explosivos#
Ambos os problemas resultam da mesma multiplicação repetida. Os gradientes que desaparecem fazem a aprendizagem parar silenciosamente: a perda continua a diminuir, impulsionada pelas últimas camadas, enquanto as primeiras camadas permanecem próximas da inicialização aleatória. Os gradientes explosivos crescem geometricamente, em vez disso, e manifestam-se de forma evidente através de picos na perda e de valores de NaN. A limitação do gradiente restringe a norma de um gradiente explosivo antes de cada atualização e não tem qualquer efeito num gradiente que já tenha desaparecido. O problema das ReLU inativas é uma falha relacionada em que a entrada de uma unidade ReLU permanece negativa, fazendo com que o respetivo gradiente seja exatamente 0 e a unidade deixe de aprender.
Como evitar o desaparecimento dos gradientes#
A solução mais usada é a conexão residual, o atalho de identidade no centro das redes residuais (ResNets). Um bloco residual produz x + F(x), então seu gradiente em relação a x é 1 mais a derivada de F, e o caminho de atalho transmite o gradiente anterior sem alterações.
Os atalhos residuais permitem treinar ResNets com mais de 100 camadas e estão presentes em quase todas as arquiteturas profundas modernas, desde os transformers ao YOLO26, cujos blocos C3k2 envolvem gargalos residuais e cujos blocos convolucionais padrão combinam normalização por lotes com ativações SiLU.
Outras soluções funcionam em conjunto com as ligações residuais:
- Funções de ativação não saturantes: A ReLU tem uma derivada exatamente igual a 1 para entradas positivas, e a Leaky ReLU e a SiLU também mantêm um gradiente diferente de zero para entradas negativas.
- Inicialização escalada: A inicialização Xavier (Glorot) é adequada para camadas tanh e sigmoides, e a inicialização He duplica a variância dos pesos para compensar o facto de a ReLU anular metade das entradas.
- Camadas de normalização: A normalização por lotes e a normalização por camadas mantêm as pré-ativações próximas de uma média de zero e de uma variância unitária, fora das regiões planas das funções de ativação saturantes.
- Arquiteturas recorrentes com portas: As redes de memória de longo e curto prazo (LSTM) e as unidades recorrentes com portas (GRUs) transportam o estado através de atualizações aditivas com portas, em vez de multiplicações repetidas, o que permitiu à LSTM original ultrapassar intervalos temporais superiores a 1.000 passos.










