Spec-Zone.ru › TensorFlow 1.15

tf.custom_gradient

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

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

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

Основные псевдонимы

`tf.contrib.eager.custom_gradient`

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

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

tf.compat.v1.custom_gradient, `tf.compat.v2.custom_gradient`

tf.custom_gradient(
    f
)

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

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

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.

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

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

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

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

Возвращает
Функция 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/r1.15/api_docs/python/tf/custom_gradient

Spec-Zone.ru

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