2017-02-07 20 views
4

非線形最適化を必要とするTensorFlowの最適化問題がありますが、内部テンソルフローオプティマイザ(Gradient Descent、AdaGrad、Adam)はscipyを使用するよりもかなり悪いようです同じグラフの外部オプティマイザ(CG、BFGS)。ノイズの多い損失関数を使ったSciPyの最適化

これはうまくいくかもしれませんが、本番では私のトレーニングデータセットのミニバッチを使用して最適化する必要があります。私は、損失/勾配関数が呼び出されるたびにこれを実装しました。データの新しいミニバッチがそれを計算するために使用されます。 (私は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回繰り返します)。

誰でもこの問題が発生しましたか?これらの最適化問題から抜け落ちるのを止めるための修正プログラム(簡単に好まれますが、ハッキーもOK)はありますか? 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

@サシャ私は、その警告で終了する理由は、ある反復から次の反復への損失の価値が、損失の真の平均が依然として減少しているノイズ変動のために増加しているからです。したがって、最適化は機能しているかもしれませんが、早期に終了します。 –

+0

あなたはこれらのアルゴリズムがこれに適していると思いますか?まだコードは表示されていません。 fminやfmin_powellのような勾配のないアルゴリズムを試してみてください。 – sascha

答えて

0

は助けることができる前処理ステップで係数または変数を正規化します。あなたはそれをやりました?オーバーフロー、アンダーフロー、および収束の失敗は、通常、数値スケーリングの問題の症状です。

関連する問題