Spec-Zone.ru › TensorFlow 2.3

tf.custom_gradient

Просмотреть исходный код на GitHub

Декоратор для определения функции с пользовательским градиентом.

Просмотреть псевдонимы

Псевдонимы для миграции

См. Руководство по миграции для получения дополнительной информации.

tf.compat.v1.custom_gradient

tf.custom_gradient(
    f=None
)

Этот декоратор позволяет тонко управлять градиентами последовательности операций. Это может быть полезно по нескольким причинам, включая предоставление более эффективного или численно стабильного градиента для последовательности операций.

Например, рассмотрим следующую функцию, которая часто встречается при вычислении кросс-энтропии и логарифмических правдоподобий:

def log1pexp(x):
  return tf.math.log(1 + tf.exp(x))

Из-за численной нестабильности градиент этой функции, вычисленный при x=100, равен NaN. Например:

x = tf.constant(100.)
y = log1pexp(x)
dy = tf.gradients(y, x) # Will be NaN when evaluated.

Выражение градиента можно аналитически упростить для обеспечения численной стабильности:

@tf.custom_gradient
def log1pexp(x):
  e = tf.exp(x)
  def grad(dy):
    return dy * (1 - 1 / (1 + e))
  return tf.math.log(1 + e), grad

С этим определением градиент при x=100 будет правильно вычислен как 1,0.

Вложенность пользовательских градиентов может привести к неинтуитивным результатам. Поведение по умолчанию не соответствует производным n-го порядка. Например

@tf.custom_gradient
def op(x):
  y = op1(x)
  @tf.custom_gradient
  def grad_fn(dy):
    gdy = op2(x, y, dy)
    def grad_grad_fn(ddy):  # Not the 2nd order gradient of op w.r.t. x.
      return op3(x, y, dy, ddy)
    return gdy, grad_grad_fn
  return y, grad_fn

Функция grad_grad_fn будет вычислять градиент первого порядка от grad_fn по отношению к dy, который используется для генерации графов градиента по направлению вперёд из графов градиента по направлению назад, но не является тем же, что и градиент второго порядка от op по отношению к x.

Вместо этого оберните вложенные @tf.custom_gradients в другую функцию:

@tf.custom_gradient
def op_with_fused_backprop(x):
  y, x_grad = fused_op(x)
  def first_order_gradient(dy):
    @tf.custom_gradient
    def first_order_custom(unused_x):
      def second_order_and_transpose(ddy):
        return second_order_for_x(...), gradient_wrt_dy(...)
      return x_grad, second_order_and_transpose
    return dy * first_order_custom(x)
  return y, first_order_gradient

Дополнительные аргументы во внутренней функции, помеченной декоратором @tf.custom_gradient, контролируют ожидаемые значения возврата самой внутренней функции.

См. также tf.RegisterGradient, который регистрирует функцию градиента для примитивной операции TensorFlow. tf.custom_gradient, с другой стороны, позволяет тонко контролировать вычисление градиента последовательности операций.

Обратите внимание, что если помеченная функция использует Variable, то окружающая область переменных должна использовать ResourceVariable.

Аргументы
f функция f(*x), которая возвращает кортеж (y, grad_fn), где:
  • x — последовательность (вложенных структур) Tensor входных данных функции.
  • y — (вложенная структура) Tensor выходные данные применения операций TensorFlow в f к x.
  • grad_fn — функция с сигнатурой g(*grad_ys), которая возвращает список Tensor такой же длины, как (распакованные) x — производные Tensor в y по отношению к Tensor в x. grad_ys — последовательность Tensor такой же длины, как (распакованные) y, хранящая начальные значения градиентов для каждой Tensor в y.

В чисто математическом смысле производные векторно-аргументной векторно-значной функции f должны быть её матрицей Якоби J. Здесь мы представляем матрицу Якоби J как функцию grad_fn, которая определяет, как J будет преобразовывать вектор grad_ys при левом умножении на него (grad_ys * J, произведение вектора на Якоби или VJP). Это функциональное представление матрицы удобно использовать для расчёта правила цепи (например, в алгоритме обратного распространения).

Если f использует Variable (которые не являются частью входных данных), т.е. через get_variable, то grad_fn должна иметь сигнатуру g(*grad_ys, variables=None), где variables — список Variable и возвращает 2-кортеж (grad_xs, grad_vars), где grad_xs такое же, как выше, а grad_vars — list<Tensor> с производными Tensor в y по отношению к переменным (то есть, grad_vars имеет один тензор на переменную в переменных).

Возвращает
Функция h(x), которая возвращает то же значение, что и f(x)[0], и чьё градиент (как вычисляется tf.gradients) определяется f(x)[1].

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/custom_gradient

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API