微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以使用 tf.GradientTape() 创建一个可以产生二阶、三阶或 n 阶梯度的函数?

如何解决是否可以使用 tf.GradientTape() 创建一个可以产生二阶、三阶或 n 阶梯度的函数?

我一直在尝试实现一个可以使用 GradientTape 输出函数的 n 阶微分的函数。例如:

如果函数是 y = x^2 * sin(x) 且 x=7 且 n=8。

y = x^2 * sin(x)

那么一阶微分是dy/dx,二阶微分是d2y/dx2。该函数将返回 dny/dnx。

我尝试在下面实现一些东西,但没有成功,因为 tf.GradientTape() 需要跟踪需要微分的方程。

def function(x):
  return (x**2) * tf.math.sin(x)

def gradient_by_order(function,x,n):
  
  with tf.GradientTape() as tape:
    y = function(x)
  
  d = tape.gradient(y,x)
 
  with tf.GradientTape() as tape:
    for i in range(n):
      d = tape.gradient(d,x)

x = tf.Variable(initial_value=5.)
gradient_by_order(function,10)

有没有办法使用递归或循环或任何其他方法来创建工作函数? 非常感谢:)

编辑:我知道您可以通过嵌套 with tf.GradientTape() as tape 来获得 n 阶导数,就像下面 Susmit Agrawal 的回答中所示。我只是想知道是否有一种方法可以编写一个可以输出 n 阶导数的函数(假设存在这样的导数),因为我找不到。

解决方法

您可以使用嵌套的 GradientTape 进行 n 阶微分。嵌套的层次就是导数的顺序。

示例:

import tensorflow as tf

x = tf.constant(X_VAL)
with tf.GradientTape() as tape1:
    tape1.watch(x)
    with tf.GradientTape() as tape2:
        tape2.watch(x)
        y = (x**2)*tf.sin(x)
    
    # dy/dx
    first_order = tape2.gradient(y,x)

# d2y/dx2 = (d/dx)(dy/dx) = (d/dx)(first_order)
second_order = tape2.gradient(first_order,x)

进一步参考: Official documentation on GradientTape

当然,如果 xtf.Variable 的实例,您不需要显式 watch 它。我把循环/递归的实验留给你。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。