tf.keras.ops.custom_gradient
Декоратор для определения функции с пользовательским градиентом.
tf.keras.ops.custom_gradient(
f
)
Этот декоратор позволяет точно контролировать градиенты последовательности операций. Это может быть полезно по разным причинам, в том числе для обеспечения более эффективного или численно устойчивого градиента последовательности операций.
| Аргументы | |
|---|---|
f | Функция f(*args), возвращающая кортеж (output, grad_fn), где:
|
| Возвращает | |
|---|---|
Функция h(*args), возвращающая то же значение, что и f(*args)[0], а её градиент определяется с помощью f(*args)[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.
- Пример специально для 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
- И наконец, пример специально для 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