Я пытаюсь реализовать новый оптимизатор, который состоит из большой части метода градиентного спуска (что означает, что я хочу выполнить несколько шагов градиентного спуска, затем выполнить различные операции над выводом, а затем снова). К сожалению, я нашел 2 фрагмента информации;
Если оба они верны, то 2 не имеет смысла для меня, и я пытаюсь выяснить, как правильно построить новый оптимизатор (алгоритм и все остальное кристально ясно).
большое спасибо
Я не уверен на 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)
Это было необходимо при реализации текущих оптимизаторов, и конечный пользователь мог легко смоделировать его с помощью кода раньше, так что это, вероятно, было причиной того, что он не был добавлен.
Часть «обработка градиента» обрабатывается полностью путем наследования optimizer.Optimizer
в коде Python. Код Python определяет только типы хранилищ для хранения средних значений движущегося окна, квадрата градиентов и т. Д., И выполняет код c ++, передавая ему уже вычисленный градиент.
Код C ++ имеет 4
линии, обновление хранимых средних и параметров.
Итак, на ваш вопрос «как построить оптимизатор»:
1 определить, что нужно хранить между расчетами градиента
2. наследовать optimizer.Optimizer
3. реализовать обновление переменных в c ++.
Других решений пока нет …