2017-05-19 15 views
1

큰 데이터 세트에서 간단한 다중 레이어 퍼셉트론 모델을 작성하려고하지만 손실 값이 nan이됩니다. 이상한 일은 : 첫 번째 훈련 단계 후에, 손실 값은 46이 아닙니다 (이상한 낮은 수치입니다. 로지스틱 회귀 모델을 실행하면 첫 번째 손실 값은 약 3600입니다). 그러나 그 직후 손실 값은 지속적으로 낮습니다. 필자는 tf.print를 사용해 디버깅을 시도했다.Tensorflow 신경망 손실 값 NaN

모델의 목표는 ~ 4500 개의 서로 다른 클래스를 예측하는 것이므로 분류 문제입니다. tf.print를 사용할 때, 첫 번째 훈련 단계 (또는 MLP를 통한 피드 포워드) 후에 마지막으로 완전히 연결된 레이어에서 나오는 예측이 옳은 것처럼 보입니다 (1에서 4500 사이의 모든 숫자가 변함). 그런 다음, 마지막으로 완전히 연결된 레이어의 출력이 모두 0 또는 다른 상수 (0 0 0 0 0)로 이동합니다. 내 모델에 대한 몇 가지 정보를

:

  • 3 계층 모델. 모든 완전히 연결된 레이어.

  • 이 CrossEntropyLoss를 사용하여 0.001의 속도를 학습 1000

  • 배치 크기는 (나는 또한 0.1와 0.01을 시도했지만 아무것도 변경되지 않습니다) (내가 log0 방지하기 위해 엡실론 값을 추가했다) 속도 붕괴 학습 AdamOptimizer

  • 를 사용

  • 0.95

  • 입니다

모델에 대한 정확한 코드는 다음과 같습니다 : (내가 TF 슬림 라이브러리를 사용하고 있습니다) 어떤 도움을 크게 감상 할 수

input_layer = slim.fully_connected(model_input, 5000, activation_fn=tf.nn.relu) 
hidden_layer = slim.fully_connected(input_layer, 5000, activation_fn=tf.nn.relu) 
output = slim.fully_connected(hidden_layer, vocab_size, activation_fn=tf.nn.relu) 
output = tf.Print(output, [tf.argmax(output, 1)], 'out = ', summarize = 20, first_n = 10) 
return {"predictions": output} 

! 정말 고맙습니다!

답변

1

두 (아마도 더) 이유 :

  1. 당신은 부적절하게 생략하거나 당신의 입력과 출력의 스케일링 기능을 적용했다. 결과적으로 Tensorflow에 대해 을 처리하기가 어려울 수 있습니다.
  2. 불연속 기능인 ReLu를 사용하면 문제가 발생할 수 있습니다. tanh 또는 sigmoid와 같은 다른 활성화 기능을 사용해보십시오.
+0

당신의 코멘트를 위해 순전히 고맙다! 마지막 레이어를 시그 모이 드로 변경하면 실제로 NaN 손실 오류가 수정되었습니다. 이제 손실 값은 처음에는 정상 (약 3600)이지만 재빨리 ~ 23 정도로 떨어졌습니다. 이는 매우 기괴합니다. 기능 확장에 대한 첫 번째 요령을 상세히 설명 할 수 있습니까? 고맙습니다! – dooder

+0

예. 2 가지 기능이 서로 다른 척도 (예 : 주택 가격 x1 : ~ 1e6 달러 및 면적 x2 : ~ 10-100m2)로 설정된 상황을 상상해보십시오. 크기를 조정하지 않으면 최적화 알고리즘이 "가장 가파른"(하이퍼) 서페이스로 되돌아와 다시 수렴 할 위험이 있습니다.이 서페이스는 수렴하지 않게 될 수도 있습니다 (따라서 NaN이 가능함). 주어진 예를 들어, (x1, x2) 표면이 그런 가파른 계곡을 가지고 있다고 상상할 수 있습니다. 이제, (xi <- (xi - mean (xi))/std (xi)) 피쳐 스케일링을 적용하면 비슷한 스케일로 모두 작동하게됩니다. 그 점을 보시겠습니까? – OZ13

+0

오케이, 다른 단위의 기능을 비교하는 방법입니다. 나는 당신이 "스케일을 조정하지 않을 때, 당신의 최적화 기능이 가장 가파른 하이퍼 서피스로 되돌아오고 요새로 되돌아 올 위험이 있습니다."라는 것을 이해했는지 확신 할 수 없습니다. 왜 그것이 앞뒤로 튀어 오를까요? – dooder

0

몇 가지 이유로 인해 교육 과정이 분기되고 가중치에 무한 값이있어 NaN 손실이 발생할 수 있습니다. 그 이유는 여러 가지 일 수 있으므로 훈련 매개 변수를 변경해보십시오 (테스트를 위해 더 작은 배치 사용).

또한 분류 자에서 마지막 출력에 relu를 사용하는 것이 일반적인 방법이 아닙니다. 시그 모이 드를 사용해보십시오. 그것이 작동하지 않는 이유

+0

도움을 주셔서 감사합니다. 마지막 레이어를 시그 모이 드로 변경하면 실제로 NaN 손실 오류가 수정되었습니다. 그럼에도 불구하고, 모든 상상 된 클래스들은 여전히 ​​일부 상수에 대해 여전히 [0 0 0 0 0 0 0] 또는 [5 5 5 5 5]입니다. 궁금한 점이 있다면, 귀하의 교육 과정이 분기 된시기를 어떻게 알 수 있습니까? 나는 나의 손실 가치가 가끔 올라간다는 것을 알았다 – dooder

0

Relu는 Neural Networks의 상위 경계에 모자를 쓰지 않기 때문에 구현에 따라 더 잘 분해 될 수 있습니다.

모든 활성화 기능을 tanh 또는 sigmoid로 전환 해보세요. Relu는 일반적으로 cnns에서의 컨볼 루션에 사용됩니다.

우리가 당신의 엡실론 값에 어떻게 영향을 미치는지 알지 못하기 때문에 크로스 엔트로피로 인한 디콘 버깅이 있는지를 판단하기가 어렵습니다. 잔류 물을 사용하면 훨씬 간단하지만 여전히 효과적입니다.

또한 5000-5000-4500 신경망은 거대합니다. 그럴 가능성이 큰 네트워크는 실제로 필요합니다.

+0

댓글을 주셔서 감사합니다! 정품 인증 기능을 변경하겠습니다. 뉴런 수에 관해서는, ~ 4500 출력 클래스가 있기 때문에 나는 5000을 가졌다. 따라서 제 믿음에 근거하여 출력 클래스 수보다 많은 뉴런이 있어야합니다. 또는 나는 무엇인가 놓치고 있냐? 감사! – dooder

+0

숨겨진 레이어 노드 수를 numb_inputs와 numb_outputs 사이에 두는 것이 좋습니다. 표준 피드 포워드 모델을 사용하는 MNIST 데이터 세트의 일화 적 포인트로서 단지 8 개의 숨겨진 노드를 사용하여 91 %의 정확도를 얻을 수있었습니다. (784 입력, 8 숨겨진 노드, 10 출력)하지만 약 280 개의 숨겨진 노드가있는 네트워크를 만들 때까지 97 % 정확도를 초과 할 수 없었습니다. 하지만 연결 수가 기하 급수적으로 늘어나므로 선형 적으로 필요한 노드 수가 적지 않다고 생각합니다. IE numb_weights layer_n * layer_n + 1. – Jjoseph

+0

알렉스 그레이브스 (Alex Graves)가 생각한 연구 보고서가 있었습니까? 그것은 뉴런의 수를 늘리는 것이 훈련에 도움이되지만 일단 수렴되면 일반적으로 훈련 된 숫자 노드의 많은 부분 만 필요로한다는 것을 의미합니다. 지금은 소스를 기억하지 못하지만 할 수있을 때 내가 그것을 파헤 치고 링크 할 수 있는지 알게 될 것입니다. 정확도가 너무 낮 으면 네트워크를 800으로 작게 만들고 노드를 늘리십시오. 너의 그물은 여전히 ​​수렴하지 않니? – Jjoseph