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

时间:2017-02-07 12:52:54

标签: 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

相反,如果我使用完整数据集运行此优化(现在可行但不是更晚),它将在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)

1 个答案:

答案 0 :(得分:0)

在预处理步骤中对系数或变量进行归一化可能会有所帮助。是你做的吗?溢出,下溢和收敛失败通常是数字缩放问题的症状。