Мне интересно, как использовать stop_gradient
в tensorflow, и документация мне не понятна.
В настоящее время я использую stop_gradient
для создания градиента функции потерь w.r.t. слово вложения в модели CBOW word2vec. Я хочу просто получить значение, а не делать backpropagation (поскольку я создаю состязательные примеры).
В настоящее время я использую код:
lossGrad = gradients.gradients(loss, embed)[0]
real_grad = lossGrad.eval(feed_dict)
Но когда я запускаю это, он делает backpropogation в любом случае! Что я делаю неправильно, и так же важно, как я могу это исправить?
ПОДТВЕРЖДЕНИЕ: Чтобы уточнить "backpropagation", я имею в виду "вычисление значений и обновление параметров модели".
UPDATE
Если я запустил две строки выше после первого этапа обучения, я получаю другую потерю после 100 шагов обучения, чем когда я не запускаю эти две строки. Я мог бы принципиально не понимать что-то о Tensorflow.
Я попытался установить с помощью set_random_seed
как в начале объявления графика, так и перед каждым шагом обучения. Полная потеря согласована между несколькими прогонами, но не между включением/исключением этих двух строк. Итак, если это не RNG, вызывающий диспропорцию, и это не непредвиденное обновление параметров модели между этапами обучения, знаете ли вы, что могло бы вызвать это поведение?
РЕШЕНИЕ
Welp, это немного поздно, но вот, как я это решил. Я только хотел оптимизировать некоторые, но не все, переменные. Я думал, что способ предотвратить оптимизацию некоторых переменных будет заключаться в использовании stop_grad
- но я никогда не нашел способ сделать эту работу. Возможно, есть способ, но для меня работала настройка optimizer
только для оптимизации списка переменных. Поэтому вместо:
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss)
Я использовал:
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss, var_list=[variables to optimize over])
Это предотвратило opt
от обновления переменных не в var_list
. Надеюсь, это сработает и для вас!