max_grad_norm 은 Gradient Clipping의 정도를 정한다.
만약 max_grad_norm = 0.3 이라면
역전파(backpropagation) 후 계산된 전체 gradient의 L2 norm을 구한다.
예)
일때,
scale factor = 0.3/1.5 = 0.2
가 되어 모든 gradient 값이 20% 크기로 줄어든다.
학습 중에 gradient가 갑자기 커지는 Gradient Explosion 현상을 방지하기 위해서
등에서 학습을 안정화하는 데 사용
| 값 | 특징 |
|---|---|
| 1.0 | 가장 흔함 |
| 0.5 | 조금 보수적 |
| 0.3 | 꽤 강한 clipping |
| 0.1 | 매우 강한 clipping |
너무 작게 설정 (예를 들어 0.01) 하면 대부분의 step에서 graident가 잘려버릴 수 있다.
그렇게 되면 결과적으로 학습 속도가 느려지고, loss 감소가 잘 되지 않으며 underfitting 가능성이 증가할 여지가 있다.
예를 들어 위의 예에서 모든 gradient가 20% 크기로 줄어들어 20%만 사용하게 된다.
만약 max_grad_norm 값이 0.01이라고 하면
scale factor = 0.01/1.5 = 0.00666....
모든 gradient가 0.6%의 크기만 사용되게 되므로 대부분의 gradient가 잘려나간 것이 된다.
if grad > 0.3:
grad = 0.3
위와 같이 할 수 있다고 생각할 수 있으나 이렇게 해버리는 경우에는 방향이 바뀌게 되기 때문에 Gradient Clipping은 방향은 유지하고 크기만 줄인다.(gradient norm이 0.3 을 초과할 때만 축소)
LoRA는 전체 파라미터를 업데이트 하는 것이 아니라, 작은 행렬만 학습하는 것이므로 gradient가 상대적으로 불안정하게 튈 수 있기 때문에 max_grad_norm을 설정한다.
0.3은 자주 사용되는 값으로 SFTTrainer, QLoRA, Axolotl, LLaMA-Factory 설정들에서 자주 볼 수 있다,