본문 바로가기
HRDI_AI/머신러닝_딥러닝 핵심 기술과 실무 중심 생성형 AI 프로젝트

3. grad_norm이란 무엇인가? 그리고 LR과 어떤 관계인가?

by Toddler_AD 2025. 11. 27.

이제 핵심 개념인 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에서의 계산 순서는:

  1. 현재 파라미터 θt와 배치 데이터를 사용해
    • forward → loss 계산
  2. loss에 대해 미분해서 gradient gt=∇θL(θt) 계산
  3. 이후에야 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 발생 여부를 “결과(종속 변수)”로 관찰
      하면서
      안정적인 학습 구간을 찾아가는 것입니다.