2017-02-07 1 views
4

비선형 최적화 도구를 사용해야하는 TensorFlow의 최적화 문제가 심각합니다. 내부 텐서 플로 최적화 도구 (Gradient Descent, AdaGrad, Adam)는 scipy를 사용하는 것보다 상당히 나쁜 것처럼 보입니다. 같은 그래프의 외부 최적화 도구 (CG, BFGS).시끄러운 손실 함수를 사용하는 SciPy의 최적화

이 작업은 정상적으로 진행될 수 있지만 제작 실행을 위해 최적화를 위해 교육 데이터 세트의 minibatches를 사용해야합니다. 필자는 손실/그레디언트 함수가 호출 될 때마다이를 구현했으며, 데이터의 새로운 미니 바를 사용하여이를 계산합니다. (나는 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/opt/python/training/external_optimizer.py의 수정 된 버전을 사용하고 있습니다.) 실제로 이것은 손실 함수가 입력 매개 변수의 잡음이 많은 함수라는 것을 의미합니다. 반면

Warning: Desired error not necessarily achieved due to precision loss. 
    Current function value: 71.329124 
    Iterations: 2 
    Function evaluations: 28 
    Gradient evaluations: 16 

, 나는 전체 데이터 집합이 최적화를 실행하면 (:

Scipy는 단지 몇 반복에 scipy.minimize의 호출을 제한,이에 문제가과 같이있는 것 같다 이것은 현재 가능하지만 나중에는 가능하지 않음) scipy.minimize를 한 번 호출 할 때 약 0.1로 수렴됩니다 (종료하지 않고 약 1000 회 반복 수행).

누구에게이 문제가 발생 했습니까? 이 최적화 문제를 빠져 나올 때 scipy를 막을 수있는 수정 (쉽게 선호되지만 해킹도 가능)이 있습니까? min_iter 키워드와 같은 것이 완벽 할 수 있지만 구현되지 않았다는 것을 알고 있습니다.

나는 이것이 의미가 있기를 바랍니다. 감사!

편집 : 코드를 요청했지만, 전체 코드 라인의 수백 오래 그래서 짧은 예제를 만들 것입니다 :

... 
def minibatch_loss_function(model, inputs, outputs, batch_size=10): 
    minibatch_mask=random.choice(range(0, len(inputs), batch_size) 
    minib_inputs=inputs[minibatch_mask] 
    minib_outputs=outputs[minibatch_mask] 
    return loss(model, minib_inputs, minib_outputs), 
       gradients(model, minib_inputs, minib_outputs) 

... 

training_input, training_output = training_data(n_examples) 
scp.optimize.minimize(minibatch_loss_function, 
    args={'inputs': training_input, 'outputs': training_output) 
+0

옵티마이 저가 경고와 함께 종료되는 이유가 있습니다. 더 많은 반복을 계속하는 것은 모든 것을 망칠 것입니다 (더 나쁜 손실, 무한한 손실, 제약 조건 위반 ...). 저는 약간 이론적으로 무서워하고 당신이 정확히 무엇을하고 있는지에 대해 추론 할 코드는 없습니다. – sascha

+1

@ sascha 나는 그 경고와 함께 그만두는 이유는 손실의 진정한 평균이 여전히 감소하고있는 소음 변동 때문에 한 번의 반복에서 다음 반복까지의 손실 값이 증가하기 때문이라고 생각한다. 따라서 최적화가 작동 할 수도 있지만 조기에 종료됩니다. –

+0

이 알고리즘이 어떻게 적합하다고 생각하십니까? 아직 코드가 표시되지 않습니다. fmin 또는 fmin_powell과 같은 그라디언트가없는 알고리즘을 사용해보십시오. – sascha

답변

0

도움이 할 수있는 전처리 단계에서 계수 또는 변수를 정규화. 네가 했니? 오버플로, 언더 플로 및 수렴 실패는 일반적으로 수치 확장 문제의 증상입니다.

관련 문제