Spec-Zone.ru › TensorFlow

tf.keras.ops.custom_gradient

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

tf.keras.ops.custom_gradient(
    f
)

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

Аргументы
f Функция f(*args), возвращающая кортеж (output, grad_fn), где:
  • args — это последовательность входных тензоров (вложенных структур) функции.
  • output — это выходные тензоры (вложенная структура), полученные в результате применения операций из forward_fn к args.
  • grad_fn — это функция с сигнатурой grad_fn(*args, upstream), которая возвращает кортеж тензоров того же размера, что и (сплющенный) args: производные тензоров в output по тензорам в args. upstream — это тензор или последовательность тензоров, содержащая начальные значения градиентов для каждого тензора в output.
Возвращает
Функция h(*args), возвращающая то же значение, что и f(*args)[0], а её градиент определяется с помощью f(*args)[1].

Примеры:

  1. Пример, не зависящий от backend.
@ops.custom_gradient
def log1pexp(x):
    e = ops.exp(x)

    def grad(*args, upstream=None):
        if upstream is None:
            (upstream,) = args
        return ops.multiply(upstream, 1.0 - 1.0 / ops.add(1, e))

    return ops.log(1 + e), grad

Обратите внимание, что функция grad, вычисляющая градиент, требует args, а также именованный аргумент upstream — в зависимости от выбранного backend. Для backend JAX и TensorFlow требуется только один аргумент, тогда как для backend PyTorch может использоваться аргумент upstream.

При работе с backend TensorFlow/JAX достаточно grad(upstream). В PyTorch функция grad требует *args, а также upstream, например def grad(*args, upstream). Следуйте предыдущему примеру, чтобы использовать @ops.custom_gradient способом, совместимым со всеми backend.

  1. Пример специально для JAX и TensorFlow:
@ops.custom_gradient
def log1pexp(x):
    e = ops.exp(x)
    def grad(upstream):
        return ops.multiply(upstream, 1.0 - 1.0 / ops.add(1, e))
    return ops.log(1 + e), grad
  1. И наконец, пример специально для PyTorch с использованием *args и upstream:
@ops.custom_gradient
def log1pexp(x):
    e = ops.exp(x)
    def grad(*args, upstream):
        return ops.multiply(upstream, 1.0 - 1.0 / ops.add(1, e))
    return ops.log(1 + e), grad

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/keras/ops/custom_gradient

Spec-Zone.ru

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