tensorflow에서 Loss 가 nan 발생한 경우 정리 (개인 생각)

2019. 9. 28. 22:54분석 Python/Tensorflow

728x90

여러 가지 경우의 수가 있지만 정리

1. 가중치 초기값을 selu이고, lecun uniform / lecun normal 줬을 때 

====> 더 좋다고 알려진 glorot uniform / glorot normal로 수정함.

---> 실제로 바꾸고 나서 효과를 본 것 같기도 함

2. Loss 부분에 tf.reduce_sum을 했을 때 문제 발생하는 것 같음. 

====> 그래서 tf.clip_by_value를 줘서 0 이상으로 주니 에러가 안 생김

3. tf.nn.loss 가 nan 발생하는 경우가 자주 있음

https://data-newbie.tistory.com/270

 

TensorFlow L2 Normalization 쉽게하기

https://stackoverflow.com/questions/38286717/tensorflow-regularization-with-l2-loss-how-to-apply-to-all-weights-not-just TensorFlow - regularization with L2 loss, how to apply to all weights, not ju..

data-newbie.tistory.com

위와 같은 방식으로 Loss를 주는데 0.001~0.0001까지 줬을 때 도중에 nan이 발생함 

====> 더 낮게 주거나, 아니면 max_norm을 주려고 하니 그런 현상이 덜 발생함. 

====> 하지만 숫자현 변수밖에 없는 데이터에 적용 중인데, 자주 발생함 

====> max norm과 l2를 줬는데도 동일한 현상 발생 

====> Spectral Norm을 주는 방식으로 하니, 그나마 괜찮은 듯

====> 해보다 보니 가장 쉬운 방법은 selu를 leaky_relu로 바꾸면 더 이상 발생하지 않음. selu 함수 자체에 있는 어떤 특징 때문에 nan을 유발하게 되는 듯. 주로 Bias에서 발생하는 것을 확인

 

3. tabular data에서 GAN을 사용할 때는 neural network를 사용할 경우 배치 사이즈는 좀 크게 하는 게 좋을 듯.

실제 데이터를 스케일링(-1,1) 하다 보면 0 중심으로 보내야 할 때가 있음 이렇게 했을 때 배치 사이즈를 작게 하다 보면 0인 값들만 나오게 됐을 때 Weight가 nan이 발생하는 경우가 자주 있음. 

(0,1)로 할 수 있지만 그러면 마지막에 표현할 수 있는 공간 자체가 작아지는 것 같아, 표현의 범위를 넓게 하고 싶어서 (-1,1) 주로 사용함.

>> 그냥 loss 중에서 나눠줬을 때 분모쪽에서 0이 발생해서 생기는 경우라고 추정됨

728x90