Остановка градиента в TensorFlow
Функция stop_gradient возвращает
те же числа, что на входе, но
дальше по цепочке производная
через этот фрагмент не идёт.
Так отделяют часть формулы,
которую обучение не должно
крутить.
Сначала посчитаем градиент без обрыва: к квадрату переменной прибавим саму переменную и прочитаем производную:
import tensorflow as tf
x = tf.Variable(3.0)
with tf.GradientTape() as tape:
square = x * x
total = square + x
grad = tape.gradient(total, x)
print(grad) # выведет tf.Tensor(7.0, shape=(), dtype=float32)
Теперь квадрат обернём в
stop_gradient и снова
прибавим x. Значение
суммы совпадёт, а градиент
станет другим:
import tensorflow as tf
x = tf.Variable(3.0)
with tf.GradientTape() as tape:
square = x * x
total = tf.stop_gradient(square) + x
grad = tape.gradient(total, x)
print(grad) # выведет tf.Tensor(1.0, shape=(), dtype=float32)
Создайте переменную 2.0,
на ленте умножьте её на себя,
прибавьте переменную и выведите
градиент суммы по переменной.
Повторите расчёт для 2.0,
но квадрат перед сложением
отделите от градиента. Выведите
новую производную по переменной.
Создайте переменную-ряд
1.0, 3.0, возведите
ряд в квадрат поэлементно,
сложите с исходным рядом без
обрыва и выведите градиент.