Шаги по созданию оптимизатора на TensorFlow

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

  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)

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

  1. Давайте посмотрим на реализацию TF примера оптимизатора, Адама: код Python, код C ++.

Часть «обработка градиента» обрабатывается полностью путем наследования optimizer.Optimizer в коде Python. Код Python определяет только типы хранилищ для хранения средних значений движущегося окна, квадрата градиентов и т. Д., И выполняет код c ++, передавая ему уже вычисленный градиент.

Код C ++ имеет 4 линии, обновление хранимых средних и параметров.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]