인공지능을 좋아하는 곧미남

Case of weight nans value during training 본문

인공지능 개발자의 기본 소양

Case of weight nans value during training

곧미남 2022. 2. 9. 12:44

안녕하세요. 오늘은 학습 시 weight가 nan 값이 출력되는 문제에 관해 알아보겠습니다.

 

저도 처음에 왜 그런지 정말 궁금해서 많이 찾아봤는데 역시 stack overflow에 잘 설명이 되어있었습니다.

 

오늘의 내용을 아래와 같습니다.

 

- INDEX -

1. Nan value 발생 현상 및 이유

 

2. Nan value 발생 시 대처 방법

 

3. 고찰


1. Nan value 발생 현상 및 이유

     1) Gradient blow up: Gradient의 값이 너무 커서 weight update 시 발산되어 weight가 Nan으로 됨.

 

     2) Bad learning rate policy and params: learning rate 자체가 inf나 nan이 될 경우.

 

     3) Faulty loss function: 신경망 내부 layer의 오류로 인한 loss function nan값이 출력될 경우.

 

     4) Faulty input: input data가 nan일 경우.

 

     5) Stride larger than kernel size in 'pooling layer': pooling layer에서 stride > kernel size 일 경우 출력 값이 nan.

 

     6) Instabillities in 'BatchNorm': BatchNorm Layer의 값이 불안정할때 nan 값 발생.


2. Nan value 발생 시 대처 방법

     1) Gradient blow up -> learning rate의 값이 너무 작아 발산하는 것으로 초기 learning rate의 값을 low하여 학습!

 

     2) Bad learning rate policy and params -> learning rate 관련 parameters 모두 재 검토해야함.

 

     3) Faulty loss function -> normalization되지 않은 data가 들어온 경우 발생할 수 있음. 디버그해서 확인해봐야함.

 

     4) Faulty input: input data debug

 

     5) Stride larger than kernel size in 'pooling layer': pooling layer check

 

     6) Instabillities in 'BatchNorm': BatchNorm Layer 디버그해서 출력값 확인해보고 


3. 고찰

우선, 내가 겪은 문제는 1번에서 설명한 Gradient blow up 때문에 발생했다. 해결 방법을 찾아보기 전에 input data의 value부터 신경망 layer의 weight 출력 value를 하나씩 디버그하면서 확인해본결과 Nan이 발생할때도 있었지만, 괜찮은 데이터도 있었다. 이 때문에 정확한 문제를 알 수 없어 많이 고생했다. 하지만, 곧 바로 알아본 결과 Gradient가 너무 커서 Nan이라는 변수를 출력한다. 즉, 학습 weight의 크기가 너무 크다는 소리다. 그래서 나는 learning rate의 값을 작게하여 Gradient가 좀 더 작은 값이 되도록 설정한 후 학습하니 원활히 진행되었다.

 

 

참고내용: https://stackoverflow.com/questions/33962226/common-causes-of-nans-during-training

Comments