[英]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.