Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

NISSO

학습시 loss / val_loss가 비정상적으로 높을 때 본문

ML & DL

학습시 loss / val_loss가 비정상적으로 높을 때

oniss 2021. 10. 12. 11:06

학습을 시키다가 loss: 7548178870.4000   val_loss: 194597683200.0000 와 같이 비정상적으로 높은 loss 값이 나왔다.

1 이하여야 하는 loss가 2도 아니고 왜이렇게 높은 건지.. 결과는 또 정상적으로 잘 나왔다.

이전엔 loss가 nan값이 나오기도 했다.

아무튼 loss 정상화를 위해 시도해본 것들을 써보려 한다.

 

 

1. batch_size

batch_size를 높이라는 말이 있던데, 아쉽게도 OOM (Out Of Memory) 문제로 시도해보지 못했다.

 

2. optimizer의 learning rate

learning rate를 낮추니 loss값이 줄어들긴 한다. 종류에 따라서도 다르다.

* optimizer 종류와 parameter 참고 : https://keras.io/ko/optimizers/

 

2-1.

tf.keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)의 결과

lr=0.001 -> 0.0001 로 낮춰 loss가 제대로 나오나 했는데 값만 조금 낮아졌을 뿐 여전히 높다.

 

2-2.

tf.keras.optimizers.RMSprop(lr=0.0001, rho=0.9, epsilon=None, decay=0.0)

이번엔 Adam -> RMSprop 과 역시 lr=0.001 -> 0.0001 로 변경했지만 여전히 높다.

결과 차이는 없었다.

 

2-3.

 

tf.keras.optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, schedule_decay=0.004)

다음 시도는 Nadam. 네스테로프 Adam 옵티마이저인데,

Adam이 본질적으로는 모멘텀이 적용된 RMSprop인 것처럼, Nadam은 네스테로프 모멘텀이 적용된 RMSprop 이라고 한다.

역대급으로 높게 나와서 epoch 2번만에 그만뒀다.

lr=0.0002로 줄여봤지만 비슷하다.

 

2-4.

tf.keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0)

tf.keras.optimizers.Adagrad(lr=0.01, epsilon=None, decay=0.0)

결과는 같다.

 

optimizer를 바꾸든 parameter를 바꾸든 loss가 줄어들 것을 기대하며 바라보는데, 처음엔 그래도 2점대로 시작한다.

하지만 이마저도 좋아하기엔 이르다. epoch 하나를 끝내고 나면 바로 위의 값들처럼 높아져있기 때문.

 

결국 그나마 가장 작게 나왔던 lr=0.0001의 Adam을 적용하고 다음 단계를 진행했다.

 

 

3. layer 추가

layer를 한 층 추가했더니 낮아지긴 했다. 그래도 여전히 이상하다.

4개의 Convolution + MaxPooling layer에 똑같이 하나 더 추가해 5개 layer로 학습한 결과다.

 

4. loss, activation 변경

categorical -> binary

softmax -> sigmoid

유사 이미지 검색이므로 다중 분류 문제인데, 이진 분류로 바꿔보니 정상화되었다.

 

activation은 sigmoid로 두고 loss=MSE로 변경해보았다. ( loss = 'mean_squared_error' )

loss를 계산하는 방법만 바꿨는데 값이 확 줄었다.

결과도 더 잘 나왔다! 다른 게 문제가 아니라 loss 함수 자체가 문제였나보다.

* loss function 참고 : https://keras.io/ko/losses/

 

activation=softmax , loss=MSE로 돌린 결과 loss가 커졌지만 정상적으로 나왔다.

결과는 비슷하지만 sigmoid가 더 잘 나왔기 때문에 바로 위에 돌린 걸로 학습을 계속 진행했다.

 

최종 선택 모델은

loss = 'mean_squared_error'

activation = 'sigmoid'

4개의 Convolution + MaxPooling layer (5계층에서 다시 하나를 빼니 위의 결과처럼 loss도 낮고 결과도 잘 나왔다)

Comments