我在TensorFlow一個討厭的優化問題,這需要一個非線性優化來解決,內部tensorflow優化(梯度下降,AdaGrad,亞當)似乎做比使用SciPy的作爲顯著惡化外部優化器(CG,BFGS)的同一圖表。優化SciPy的與嘈雜的損失函數
這將是罰款,但對於生產運行我想做的事情,我需要用我的訓練數據集的minibatches優化。每次調用丟失/梯度函數時,我都會執行此操作,並使用新的小批量數據來計算它。 (我正在使用https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/opt/python/training/external_optimizer.py的修改版本)實際上,這意味着損失函數是輸入參數的嘈雜函數。
SciPy的似乎是有這個問題,限制scipy.minimize的任何電話只有幾個迭代,就像這樣:
Warning: Desired error not necessarily achieved due to precision loss.
Current function value: 71.329124
Iterations: 2
Function evaluations: 28
Gradient evaluations: 16
相反,如果我運行此優化與完整數據集(現在可行但不遲),它將在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)
是有原因的優化與該警告狹路相逢。強制繼續進行更多的迭代將會破壞一切(更糟糕的損失,無限的損失,突破的限制......)。我有點害怕理論上的問題,並且沒有看到任何代碼來推斷你正在做什麼。 – sascha
@sascha我認爲它是與警告戒菸的原因是因爲從一個迭代到下一個損失的價值是由於噪聲波動,其中損失的真實平均仍有減小增加。因此,雖然優化可能正在工作,但它正在過早退出。 –
什麼讓你覺得這些算法適合這個?而且還沒有顯示代碼。嘗試使用無梯度算法,如fmin或fmin_powell。 – sascha