繁体   English   中英

具有噪声损失功能的SciPy优化

[英]Optimization in SciPy with noisy loss function

我在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次迭代而不退出)。

有没有人遇到这个问题? 是否有一种修复程序(容易首选,但也很hack)也可以阻止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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM