Exploding Gradient
기울기 폭발은 역전파 중 기울기가 기하급수적으로 커져 과도한 가중치 업데이트, 손실 급증, NaN 값을 유발하는 현상입니다. 원인, 징후, 해결 방법을 다룹니다.
기울기 폭발은 깊은 또는 순환 신경망을 거꾸로 통과하는 역전파 중 계산된 그래디언트가 지수적으로 커지는 학습 실패입니다. 그러면 경사 하강법이 모델 가중치에 엄청나게 큰 업데이트를 적용하고, 손실 함수가 급증하거나 NaN 또는 inf으로 바뀌면서 학습이 발산합니다. 이는 기울기 소실 문제와 정반대입니다. Pascanu, Mikolov, Bengio는 순환 신경망에서 두 문제를 분석하고 기울기 폭발에 대한 기울기 노름 클리핑을 제안했으며, 이는 오늘날 딥러닝 학습의 표준 안전장치입니다.
기울기가 폭발하는 이유#
연쇄 법칙에 따라 초기 레이어에 도달하는 그래디언트는 이후 각 레이어 또는 순환 네트워크의 각 타임스텝에서 나온 인자 하나씩을 곱한 값입니다. 이 인자들이 지속적으로 1보다 크면 깊이에 따라 곱이 지수적으로 증가합니다. 예를 들어 1.5를 30개 레이어에 걸쳐 반복하면 신호가 약 190,000배가 됩니다. 일반적인 원인으로는 부적절한 가중치 초기화, 너무 높은 학습률, 정규화되지 않은 입력, 순환 모델의 긴 시퀀스, FP16 값이 65,504를 초과하면 inf가 되는 혼합 정밀도 학습의 오버플로가 있습니다. 손실 곡선이 갑자기 급등하거나 NaN으로 바뀌고, 단계 간 기울기 노름 로그가 몇 자릿수씩 증가하며, 가중치가 NaN로 바뀌는 것이 징후입니다.
예방 및 완화#
대부분의 최신 학습 파이프라인은 이러한 방어 기법을 여러 개 결합합니다.
- 기울기 클리핑: 모든 그래디언트의 전역 L2 노름이 임계값을 초과하면 모든 그래디언트에 같은 계수를 곱해 크기를 줄입니다. 업데이트 방향은 유지하고 길이만 제한합니다.
- 배치 정규화: 배치 정규화와 레이어 정규화는 모든 레이어에서 활성값을 재조정하여 레이어 간 신호의 규모를 안정적으로 유지하고 손실 지형을 매끄럽게 합니다.
- 신중한 초기화: Xavier (Glorot) 초기화와 He 초기화는 레이어 간 활성값 분산이 거의 일정하도록 초기 가중치의 규모를 조정합니다.
- 잔차 연결: 스킵 연결은 각 블록을 우회하는 항등 경로를 그래디언트에 제공하므로, 역방향 신호가 하나의 긴 곱이 아니라 여러 경로의 합이 됩니다.
- 학습률 워밍업: 작은 학습률로 시작해 첫 단계들에 걸쳐 점진적으로 높이면 가중치와 옵티마이저 통계가 아직 안정되지 않은 초기의 큰 업데이트를 방지할 수 있습니다.
아래 코드 조각은 각 레이어가 입력을 1.5배 증폭하는 30개 레이어 스택을 만든 다음, 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}")클리핑 전 원시 그래디언트 노름은 9.90e+10이고, 클리핑 후에는 1.00이므로 원시 그래디언트의 크기와 관계없이 다음 옵티마이저 단계가 제한된 범위에 머뭅니다.
Ultralytics YOLO26 학습은 매 단계마다 이 안전장치를 실행합니다. 트레이너는 혼합 정밀도 그래디언트를 역스케일링하고 전역 노름을 10.0으로 클리핑하며, inf 또는 NaN 값이 남아 있는 업데이트는 그래디언트 스케일러가 건너뛰도록 합니다. 사용자 지정 트레이너로 한도를 변경할 수 있습니다. 예를 들어 RT-DETR의 한도를 0.1로 낮출 수 있습니다.
그래디언트 폭주와 소실#
두 문제 모두 역전파에서 레이어별 인자들이 곱해지는 동일한 과정에서 비롯됩니다. 인자가 1보다 크면 그래디언트가 폭발해 업데이트가 불안정해지고 수치 오버플로와 발산이 발생하며, 일반적인 해결 방법은 클리핑입니다. 인자가 1보다 작으면 그래디언트가 0에 가까워져 초기 레이어의 학습이 중단됩니다. 일반적인 해결 방법으로는 ReLU와 같은 비포화 활성화 함수, 잔차 연결, LSTM과 같은 게이트 순환 유닛이 있습니다. 정규화와 신중한 초기화는 두 문제를 모두 완화합니다.
실제 적용 사례#
대규모 언어 모델은 긴 텍스트 시퀀스를 대상으로 수십만 단계 동안 학습하며, 이 과정에서 갑작스러운 손실 급증은 잘 알려진 위험 요소입니다. 따라서 학습 레시피에 그래디언트 클리핑을 적용합니다. GPT-3는 Adam을 사용하고 전역 그래디언트 노름을 1.0으로 클리핑해 학습했습니다.
컴퓨터 비전 분야에서는 심층 객체 탐지 네트워크를 높은 학습률과 혼합 정밀도로 COCO 규모 데이터셋에서 학습하므로, 클리핑과 손실 스케일링을 통해 드물게 발생하는 극단적인 배치가 가중치를 손상하지 않도록 합니다. Transformer 기반 탐지기는 디코더의 교차 어텐션을 통과하는 그래디언트가 급증할 수 있어 더 민감합니다. 따라서 RT-DETR 및 DINO와 같은 DETR 계열 모델은 보통 최대 노름 0.1로 클리핑합니다.










