Spec-Zone.ru › TensorFlow 2.3

tf.gradients

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

Строит символические производные суммы ys по x в xs.

tf.gradients(
    ys, xs, grad_ys=None, name='gradients', gate_gradients=False,
    aggregation_method=None, stop_gradients=None,
    unconnected_gradients=tf.UnconnectedGradients.NONE
)

tf.gradients допустимо только в контексте графа. В частности, оно допустимо в контексте обёртки tf.function, где код выполняется как граф.

ys и xs — каждый из них является Tensor или списком тензоров. grad_ys — список Tensor, содержащий градиенты, полученные ys. Список должен иметь такую же длину, как ys.

gradients() добавляет в граф операции для вычисления производных ys по xs. Он возвращает список Tensor длиной len(xs), где каждый тензор — это sum(dy/dx) для y в ys и для x в xs.

grad_ys — список тензоров той же длины, что и ys содержащий начальные градиенты для каждого y в ys. Когда grad_ys равно None, для каждого y в ys заполняется тензор из «1» с формой y. Пользователь может предоставить собственные начальные grad_ys для вычисления производных с использованием другого начального градиента для каждого y (например, если необходимо различно взвесить градиент для каждого значения в каждом y).

stop_gradients — Tensor или список тензоров, которые следует рассматривать как постоянные по отношению ко всем xs. Эти тензоры не будут обработаны при обратном распространении, как будто они были явно отключены с помощью stop_gradient. Среди прочего, это позволяет вычислять частные производные, а не полные. Например:

@tf.function
def example():
  a = tf.constant(0.)
  b = 2 * a
  return tf.gradients(a + b, [a, b], stop_gradients=[a, b])
example()
[<tf.Tensor: shape=(), dtype=float32, numpy=1.0>,
<tf.Tensor: shape=(), dtype=float32, numpy=1.0>]

Здесь частные производные g равны [1.0, 1.0], в отличие от полных производных tf.gradients(a + b, [a, b]), которые учитывают влияние a на b и равны [3.0, 1.0]. Обратите внимание, что вышесказанное эквивалентно:

@tf.function
def example():
  a = tf.stop_gradient(tf.constant(0.))
  b = tf.stop_gradient(2 * a)
  return tf.gradients(a + b, [a, b])
example()
[<tf.Tensor: shape=(), dtype=float32, numpy=1.0>,
<tf.Tensor: shape=(), dtype=float32, numpy=1.0>]

stop_gradients обеспечивает возможность остановки градиента после построения графа, в отличие от tf.stop_gradient, который используется во время построения графа. При совместном использовании этих подходов обратное распространение останавливается как на узлах tf.stop_gradient, так и на узлах в stop_gradients, в зависимости от того, какой из них встречается раньше.

Все целочисленные тензоры рассматриваются как постоянные по отношению ко всем xs, как будто они были включены в stop_gradients.

unconnected_gradients определяет возвращаемое значение для каждого x в xs, если оно не связано в графе с ys. По умолчанию это None для защиты от ошибок. Математически эти градиенты равны нулю, что можно запросить с помощью опции 'zero'. tf.UnconnectedGradients предоставляет следующие варианты и поведение:

@tf.function
def example(use_zero):
  a = tf.ones([1, 2])
  b = tf.ones([3, 1])
  if use_zero:
    return tf.gradients([b], [a], unconnected_gradients='zero')
  else:
    return tf.gradients([b], [a], unconnected_gradients='none')
example(False)
[None]
example(True)
[<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[0., 0.]], ...)>]

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

@tf.function
def example():
  Ws = tf.constant(0.)
  bs = 2 * Ws
  cost = Ws + bs  # This is just an example. Please ignore the formulas.
  g = tf.gradients(cost, [Ws, bs])
  dCost_dW, dCost_db = g
  return dCost_dW, dCost_db
example()
(<tf.Tensor: shape=(), dtype=float32, numpy=3.0>,
<tf.Tensor: shape=(), dtype=float32, numpy=1.0>)
Аргументы
ys Tensor или список тензоров, которые нужно продифференцировать.
xs Tensor или список тензоров, которые нужно использовать для дифференцирования.
grad_ys Необязательно. Tensor или список тензоров того же размера, что и ys и содержащий градиенты, вычисленные для каждого y в ys.
name Необязательное имя для группировки всех операций градиента. По умолчанию «gradients».
gate_gradients Если True, добавляет кортеж вокруг возвращаемых градиентов для операций. Это позволяет избежать некоторых гонок.
aggregation_method Указывает метод комбинирования градиентных терминов. Допустимые значения — константы, определённые в классе AggregationMethod
stop_gradients Необязательно. Tensor или список тензоров, по которым не нужно дифференцировать.
unconnected_gradients Необязательно. Указывает значение градиента, возвращаемое при отсутствии связи между входными тензорами. Допустимые значения — константы, определённые в классе tf.UnconnectedGradients, по умолчанию — none .
Возвращаемое значение
Список Tensor длиной len(xs), где каждый тензор — sum(dy/dx) для y в ys и для x в xs.
Исключения
LookupError если у одной из операций между x и y нет зарегистрированной функции градиента.
ValueError если аргументы некорректны.
RuntimeError если вызов осуществляется в режиме Eager.

© 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/gradients

Spec-Zone.ru

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