具有噪声损失函数的SciPy优化

Joe*_*ner 5 python optimization scipy tensorflow

我在TensorFlow中有一个讨厌的优化问题,它需要一个非线性优化器来解决,内部张量流优化器(Gradient Descent,AdaGrad,Adam)似乎比使用scipy作为外部优化器(CG,BFGS)要差得多图形.

这没关系,但对于我想要的生产运行,我需要使用我的训练数据集的微型计算机进行优化.我已经在每次调用丢失/梯度函数时实现了这一点,使用新的数据小批量来计算它.(我使用的是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
Run Code Online (Sandbox Code Playgroud)

相反,如果我使用完整数据集运行此优化(现在可行但不是更晚),它将在scipy.minimize的一次调用中收敛到大约0.1(并且在不退出的情况下执行大约1000次迭代).

有谁遇到过这个问题?是否有一个修复(简单的首选,但hacky也可以)阻止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)
Run Code Online (Sandbox Code Playgroud)

Geo*_*son 0

在预处理步骤中标准化系数或变量可能会有所帮助。是你做的吗?上溢、下溢和收敛失败是数值缩放问题的常见症状。