【问题标题】:Is it possible to create a function using tf.GradientTape() that can produce Second Order, Third Order or nth Order Gradients?是否可以使用 tf.GradientTape() 创建一个可以产生二阶、三阶或 n 阶梯度的函数?
【发布时间】:2021-07-12 02:31:20
【问题描述】:

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

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

那么一阶微分是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,x,10)

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

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

【问题讨论】:

    标签: python-3.x algorithm recursion tensorflow2.0 calculus


    【解决方案1】:

    您可以使用嵌套的GradientTapes 进行 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 它。我将循环/递归的实验留给你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-16
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2012-04-29
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多