본문 바로가기

컴퓨터공학

Pytorch loss nan 문제

반응형

학습도중 lossnan이라고 뜨는 일이 발생했다. Epoch50이상 돌아간 상태였다. 바로 nan loss가 발생하는 이유에 대해서 검색해보았다. 대충 서치했을 때 내가 얻을 수 있는 답변들은 다음과 같았다.

 

Numerical Exception

수학적으로 계산이 안되는 것. 0으로 나눈다거나 log(0)과 같은 +-무한대로 발산할 수 있는 것이 생기는 경우

 

Learning rate의 문제

Learning rate이 너무 클 경우, loss가 커지기 시작하면서 결국 발산한다.

 

Input data의 문제, gt 데이터의 문제

모두 유효한 값이어야 한다. Normalize도 해두기

 

이 외에도 오류가 발생하는 원인은 수도 없이 많겠지만.. ㅎ 일단 가장 먼저 내가 해볼 수 있는 것은 nan이 발생하였을 때 detect 해주는 코드를 삽입하였다. torch.autograd.set_detect_anomaly(True)를 메인함수 첫줄에 추가해주었다. 그러고 나서 학습을 돌려보니 다음과 같은 오류를 뱉어주었다.

 

Function 'AddmmBackward0' returned nan values in its 0th output

 

lr 을 낮추면 된다고 해서 한번 해봤는데 nan이 발생하는 epoch이 달라질 뿐 똑같았다. Adameps를 높여주거나 clipping 또한 시도하였으나 계속 오류가 떴다^^

 

그 다음으로는 pdb로 디버깅을 해보았다. 일단 model에서 아웃풋 뽑는거랑 loss 계산하는 부분에 다음과 같이 예외처리를 해주어 디버깅모드로 전환하였다. 그 결과 acos에서 오류가 발생하는 것 까지 알아냈고, 직접 텐서를 뽑아서 loss를 계산해줬는데도 nan이 안떠서 뭐가 문젠가 했더니 생각해보니 acos을 미분하면 분모에 1-x^2이 들어가서 x=1일 때 미분 계산이 안되는 것이었다.

 

            try:
                loss.backward()
            except Exception as err:
                pdb.set_trace()

 

그래서 1e-6으로 1 안되게끔 만들어주고 다시 돌렸더니 해결했다. 너무 삥삥 돌아온 것 같지만.. 해결!

반응형