2017-02-07 11 views
4

У меня есть неприятная проблема оптимизации в TensorFlow, которая требует решения нелинейного оптимизатора, внутренние оптимизаторы тензора потока (Gradient Descent, AdaGrad, Adam), похоже, значительно хуже, чем использование scipy как внешний оптимизатор (CG, BFGS) того же графика.Оптимизация в SciPy с функцией шумовой потери

Это было бы хорошо, но для серийного производства я хочу, чтобы мне нужно было использовать мини-отсеки моего набора учебных материалов для оптимизации. Я реализовал это каждый раз, когда вызывается функция потери/градиента, для ее вычисления используется новая мини-запись данных. (Я использую модифицированную версию 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 

В отличие от этого, если я запускаю эту оптимизацию с полным набором данных (что возможно сейчас, но не позже), он будет сходиться к 0,1 в течение одного вызова scipy.minimize (и делать около 1000 итераций без выхода).

Неужели кто-нибудь столкнулся с этой проблемой? Есть ли исправление (легко предпочтительнее, но хакки тоже ОК), чтобы остановить scipy от выхода из этих проблем оптимизации? Что-то вроде ключевого слова min_iter было бы идеально, но насколько мне известно, это не реализовано.

Я надеюсь, что это имело смысл. Благодаря!

EDIT: Я просил кода, но полный код несколько сотен строк долго, так что я сделаю короткий пример:

... 
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

Существует причина, по которой оптимизатор уходит с этим предупреждением. Принуждение к продолжению большего количества итераций просто сломает все (худшие потери, бесконечные потери, предел ограничений ...). Я немного боюсь теории и не вижу никакого кода, чтобы рассуждать о том, что вы делаете в точности. – sascha

+1

@sascha Я думаю, что причина, по которой он уходит с этим предупреждением, состоит в том, что значение потери от одной итерации к следующей увеличивается из-за колебаний шума, где истинное среднее значение потерь все еще уменьшается. Поэтому, хотя оптимизация может работать, она выходит преждевременно. –

+0

Что заставляет вас думать, что эти алгоритмы подходят для этого? И пока не отображается код. Попробуйте использовать градиентный алгоритм, например fmin или fmin_powell. – sascha

ответ

0

Нормализация коэффициентов или переменных на этапе предварительной обработки может помочь. Ты сделал это? Переполнение, недостаточное сглаживание и неспособность сходиться обычно являются симптомом проблем с численным масштабированием.