我在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)
答案 0 :(得分:0)
在预处理步骤中对系数或变量进行归一化可能会有所帮助。是你做的吗?溢出,下溢和收敛失败通常是数字缩放问题的症状。