tf.gradients
Создаёт символьные производные суммы 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's) формы 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. |
© 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/gradients