이제 핵심 개념인 grad_norm 자체를 조금 자세히 풀어봅시다.
3-1. grad_norm의 정의
파라미터 전체를 θ 라고 하고,
loss를 L(θ) 라고 할 때,
- 각 파라미터에 대한 gradient는 ∇θL
- 이걸 벡터로 보면:

L2 norm(유클리드 노름)

HuggingFace Trainer가 하는 일을 Python 느낌으로 쓰면:
total_sq_norm = 0.0
for p in model.parameters():
if p.grad is None:
continue
param_norm = p.grad.data.norm(2) # 이 텐서의 L2 norm (스칼라)
total_sq_norm += param_norm.item() ** 2
grad_norm = total_sq_norm ** 0.5
즉,
모든 파라미터 gradient를 다 펼쳐서(concat)
하나의 초대형 벡터라고 생각하고 L2 norm을 계산한 값이
바로 grad_norm입니다.
3-2. 직관적으로 보면, grad_norm은 “얼마나 세게” 움직이려 하는가
SGD 형태의 업데이트를 생각해보면:

- η : learning rate
- gt: 현재 step에서의 gradient

즉:
- grad_norm이 크다
→ 지금 loss landscape가 가파른 곳이거나
어떤 이유로 gradient가 크게 튀는 구간
→ 같은 learning rate라면 파라미터가 크게 움직이려는 상태 - grad_norm이 작다
→ 상대적으로 평탄한 지형 혹은 학습 후반부 수렴 단계
→ 업데이트 스텝 크기도 작아짐
그래서 grad_norm을 모니터링하면:
- gradient가 폭발하는지(exploding)
- 너무 작아져서 학습이 멈추는지(vanishing)
를 한눈에 파악할 수 있습니다.
3-3. Learning Rate(LR)와의 관계
여기서 중요한 질문이 하나 나옵니다.
“grad_norm과 learning rate는 어떤 관계인가?
왜 ‘독립적인’ 두 축처럼 보는가?”
한 step 안에서의 관점과
시간에 따른 학습 과정 관점을 나눠서 보는 게 좋습니다.
(1) 한 step 안에서는: grad_norm은 LR과 “수학적으로 독립”
각 training step에서의 계산 순서는:
- 현재 파라미터 θt와 배치 데이터를 사용해
- forward → loss 계산
- loss에 대해 미분해서 gradient gt=∇θL(θt) 계산
- 이후에야 learning rate η 를 곱해 업데이트 수행
여기서 핵심:
- gradient gt와 grad_norm 자체는
learning rate η에 의존하지 않습니다. - 즉, 같은 θt, 같은 데이터라면
LR을 1e-3, 5e-4, 1e-4로 바꿔도
그 step에서의 gradient와 grad_norm 값은 똑같이 나옵니다.
이런 의미에서:
“grad_norm은 그 순간의 모델 파라미터와 데이터에 의해 결정되는 값이고,
learning rate는 나중에 곱해지는 외부 스케일링 파라미터”라서
수식 상으로는 서로 ‘독립 변수’라고 말할 수 있습니다.
(2) 여러 step을 지나는 과정에서는: LR이 grad_norm의 “미래”에 영향을 줌
하지만 학습은 한 step으로 끝나지 않고 반복됩니다.
- learning rate가 크면:
- 한 번의 업데이트에서 θ가 크게 이동
- 그 다음 step에서 보는 지형(loss surface)가 급격히 바뀌어
→ 새로운 gradient gt+1의 크기(grad_norm)도 영향을 받습니다.
- learning rate가 너무 크면:
- 계속해서 가파른 방향으로 튀어나가면서
- 특정 레이어의 값이 비정상적으로 커지고
→ 결국 gradient도 폭발 → grad_norm이 커지다가 NaN
그래서 시간 축을 길게 보면:
- LR을 바꾸면 → 파라미터 궤적이 달라지고
- 그 결과 → 몇 step 뒤의 grad_norm 분포도 달라집니다.
하지만 여전히 한 순간의 계산(flow) 에서는:
- “gradient를 구할 때 LR은 관여하지 않는다”
- “LR은 ‘그라디언트를 구한 후’ 파라미터 업데이트에서만 쓰인다”
라는 점이 중요합니다.
수학적으로는 grad_norm이 LR과 분리된 독립 지표이고,
실전에서는 우리가 LR을 조정(독립 변수)하면서
그 결과로 나타나는 grad_norm의 변화를 관찰(종속 변수)한다.
(3) grad_norm과 LR을 함께 보는 이유: step 크기
앞의 식을 다시 보면:

- 실제로 파라미터가 “얼마나 멀리 이동하는지”는
- LR (η)
- grad_norm (‖g_t‖)
두 값의 곱으로 결정됩니다.
그래서:
- 학습이 불안정할 때:
- LR이 너무 큰 건 아닌지
- grad_norm이 이상하게 큰 구간이 있는지
- max_grad_norm(gradient clipping)을 써서 상한을 제한할지
- 를 함께 보는 것이 중요합니다.
3-4. 마무리 요약
- grad_norm과 LR의 관계
- grad_norm은 모든 파라미터에 대한 gradient의 L2 norm으로,
현재 step에서 loss landscape가 얼마나 가파른지,
모델이 얼마나 “세게” 움직이려 하는지를 보여주는 지표입니다. - gradient를 계산할 때는 learning rate가 전혀 관여하지 않기 때문에,
한 step 기준으로는 grad_norm은 LR과 수학적으로 독립적인 값입니다. - 하지만 여러 step을 거쳐 가면서 LR이 파라미터 궤적을 바꾸고,
그 결과로 미래의 grad_norm 패턴도 영향을 받게 됩니다. - 결국, 우리는 LR을 “조절하는 변수(독립 변수)”로 두고,
그 결과로 나타나는 grad_norm, loss, NaN 발생 여부를 “결과(종속 변수)”로 관찰하면서
안정적인 학습 구간을 찾아가는 것입니다.
- grad_norm은 모든 파라미터에 대한 gradient의 L2 norm으로,
'HRDI_AI > 머신러닝_딥러닝 핵심 기술과 실무 중심 생성형 AI 프로젝트' 카테고리의 다른 글
| AdamW란 무엇인가, 왜 쓰는가, 수식/직관/실전 세팅까지 (0) | 2025.11.27 |
|---|---|
| 1. Trainer 하이퍼파라미터 정리 (0) | 2025.11.27 |
| 2. fp32 vs fp16 – 왜 fp32에서 grad_norm이 더 안정적으로 보였을까? (0) | 2025.11.27 |
| Midterm Report (0) | 2025.11.26 |
| Transformer vs T5(Text-to-Text Transfer Transformer) 어떻게 다른가? (0) | 2025.11.26 |