Что делает opt.apply_gradients() в TensorFlow?
Документация не совсем понятна. Я полагаю, что градиенты, которые можно получить через opt.compute_gradients(E, [v])
, содержат ∂E/∂x = g(x)
для каждого элемента x
тензора, который хранится v
. Выполняет ли opt.apply_gradients(grads_and_vars)
выполнение x ← -η·g(x)
, где η
- скорость обучения? Это означало бы, что если я хочу добавить переменную с положительным добавлением p
к переменной, мне нужно будет изменить g(x) ← g(x) - (1/η)p
, например. например:
opt = tf.train.GradientDescentOptimizer(learning_rate=l)
grads_and_vars = opt.compute_gradients(loss, var_list)
for l, gv in enumerate(grads_and_vars):
grads_and_vars[l] = (gv[0] - (1/l) * p, gv[1])
train_op = opt.apply_gradients(grads_and_vars)
Есть ли лучший способ сделать это?
Ответы
Ответ 1
Правило обновления, которое фактически применяет метод apply_gradients
, зависит от конкретного оптимизатора. Взгляните на реализацию apply_gradients
в tf.train.Optimizer
классе здесь. Он использует производные классы, реализующие правило обновления в методах _apply_dense
и _apply_spares
. Правило обновления, на которое вы ссылаетесь, выполняется с помощью GradientDescentOptimizer
.
Относительно вашего желаемого обновления добавленной добавки: Если то, что вы вызываете opt
, является созданием GradientDescentOptimizer
, тогда вы действительно можете достичь того, что хотите сделать
grads_and_vars = opt.compute_gradients(E, [v])
eta = opt._learning_rate
my_grads_and_vars = [(g-(1/eta)*p, v) for g, v in grads_and_vars]
opt.apply_gradients(my_grads_and_vars)
Более элегантный способ сделать это - это, вероятно, написать новый оптимизатор (наследующий от tf.train.Optimizer
), который реализует ваше нужное правило обновления напрямую.
Ответ 2
Вы также можете использовать API для быстрого выполнения.
import tensorflow as tf
tf.enable_eager_execution()
tfe = tf.contrib.eager
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
grad = tfe.implicit_gradients(loss)
optimizer.apply_gradients(grad(model_fn, val_list))
Я сделаю для него экземпляр следующим образом:
import tensorflow as tf
tf.enable_eager_exeuction()
tfe = tf.contrib.eager
W = tfe.Variable(np.random.randn())
b = tfe.Variable(np.random.randn())
def linear_regression(inputs):
return inputs * W + b;
def MSE(model_fn, inputs, labels):
return tf.reduce_sum(tf.pow(model_fn(inputs) - labels, 2)) / (2 * n_samples)
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.001)
grad = tfe.implicit_gradients(MSE)
optimizer.apply_gradients(grad(linear_regression, train_X, train_Y)) # train_X and train_Y are your input data and label