2016-11-17 3 views
1

Я пытаюсь реализовать новый оптимизатор, который состоит из большой части метода Gradient Descent (что означает, что я хочу выполнить несколько шагов с градиентом спуска, а затем выполнять различные операции с выходом и снова). К сожалению, я нашел 2 части информации;Шаги для создания оптимизатора на TensorFlow

  1. Вы не можете выполнить определенное количество шагов с оптимизаторами. Неужели я ошибаюсь? Потому что это может показаться логичным вариантом.
  2. Учитывая, что 1 истинно, вам нужно закодировать оптимизатор с использованием C++ в качестве ядра и тем самым потерять мощные возможности TensorFlow (например, градиенты вычисления).

Если они оба истины, то 2 не имеет для меня никакого смысла, и я пытаюсь выяснить, каков правильный способ создания нового оптимизатора (алгоритм и все остальное кристально чисты).

Большое спасибо

ответ

1
  1. Я не 100% уверен, но я думаю, что вы правы. Но я не вижу преимуществ добавления такой опции в TensorFlow. В оптимизаторы на основе GD, я знаю, как правило, работают так:

    for i in num_of_epochs: 
        g = gradient_of_loss() 
        some_storage = f(previous_storage, func(g)) 
        params = func2(previous_params, some_storage) 
    

Если вам необходимо выполнить несколько шагов оптимизации, вы можете просто сделать это в цикле:

train_op = optimizer.minimize(loss) 
for i in range(10): 
    sess.run(train_op) 

I не думаю, что параметр multitrain_op = optimizer.minimize(loss, steps) был необходим для реализации текущих оптимизаторов, и конечный пользователь может легко имитировать его с кодом раньше, так что, вероятно, это была причина, по которой он не был добавлен.

  1. Давайте рассмотрим реализацию TF примера оптимизатора, Адам: python code, c++ code.

«Обработка градиента» обрабатывается целиком, наследуя optimizer.Optimizer в коде python. Код python определяет типы хранилищ для хранения средних значений движущегося окна, квадрата градиентов и т. Д. И выполняет код C++, передавая ему уже рассчитанный градиент.

Код C++ содержит 4 строк, обновляющих сохраненные значения и параметры.

Так на ваш вопрос «как построить оптимизатор»: 1. определить, что вам нужно сохранить между вычислениями градиента 2. inherit optimizer.Optimizer 3. реализовать обновление переменных в C++.