← 문제 목록/Global Gradient Clipping (여러 텐서) [medium]
문제 해설

Global Gradient Clipping (여러 텐서) [medium]

최적화 · medium

preview

Global Gradient Clipping [medium]

v1 clip_by_norm 은 단일 벡터. 실전 신경망은 수십 개 파라미터 텐서 (layer 1 W, layer 1 b, layer 2 W, …) 가 있고, 각기 다른 shape. PyTorch torch.nn.utils.clip_grad_norm_ 의 올바른 동작:

  1. Global norm 계산: g2=tigt,i2\|g\|_2 = \sqrt{\sum_{t} \sum_i g_{t,i}^2} 모든 텐서를 하나의 긴 벡터처럼 처리.
  2. g2c\|g\|_2 \le c → 그대로.
  3. g2>c\|g\|_2 > c → 각 텐서에 동일 스케일 c/g2c / \|g\|_2 적용.

왜 tensor 별 clip 이 아닌가

  • Tensor 별 clip 은 gradient 방향 을 바꿈 → 학습 불안정.
  • Global clip 은 전체 gradient 방향 유지, 크기만 조절.
  • 실제 구현 (PyTorch, JAX, TF) 이 모두 이 방식.

구현 팁

total_norm_sq = sum(np.sum(g**2) for g in grads)
total_norm = np.sqrt(total_norm_sq)
clip_coef = min(max_norm / (total_norm + eps), 1.0)
clipped = [g * clip_coef for g in grads]

과제

함수 clip_grad_list(grads, max_norm) 를 완성하세요.

  • grads: numpy 배열들의 리스트 (각기 다른 shape 가능).
  • 반환: (clipped_list, total_norm) — clipped 리스트 (같은 shape), 원본의 global norm (Python float).
  • Edge: 모든 텐서가 영이면 그대로 반환 (0 division 방지).

테스트 케이스

#이름검증
1반환 (list, float)
2각 텐서 shape 보존
3global norm ≤ max_norm → 원본 그대로
4global norm > max_norm → 전체 shape 스케일
5스케일 후 norm == max_norm (정확)
6영 텐서들 → NaN 없이 그대로
7한 텐서만 있을 때 v1 clip_by_norm 과 일치
코드 작성
Loading...
실행 결과

코드를 작성하고 Run 을 눌러보세요.