2017-02-07 27 views
4

我在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) 
+0

是有原因的优化与该警告狭路相逢。强制继续进行更多的迭代将会破坏一切(更糟糕的损失,无限的损失,突破的限制......)。我有点害怕理论上的问题,并且没有看到任何代码来推断你正在做什么。 – sascha

+1

@sascha我认为它是与警告戒烟的原因是因为从一个迭代到下一个损失的价值是由于噪声波动,其中损失的真实平均仍有减小增加。因此,虽然优化可能正在工作,但它正在过早退出。 –

+0

什么让你觉得这些算法适合这个?而且还没有显示代码。尝试使用无梯度算法,如fmin或fmin_powell。 – sascha

回答

0

规范化的系数或变量在预处理步骤可能会有帮助。是你做的吗?溢出,下溢和收敛失败通常是数值缩放问题的症状。