使用 pydrake autodiff 计算 hessian
Computing hessian with pydrake autodiff
Drake 的卖点之一是可以通过 AutoDiff 轻松获得梯度,但我正在努力了解如何在 pydrake 中轻松计算二阶导数。
给定一个函数 f(x),我知道有两种计算雅可比行列式的方法。第一种方式使用 forwarddiff.jacobian
辅助函数,例如:
def f(x):
return x.T@x
x = np.array([1,2,3])
fx = jacobian(f,x) # = [2,4,6]
第二种方式更直接地使用autodiffutils
绑定:
x = InitializeAutoDiff([1,2,3])
y = f(x)
fx = ExtractGradient(y) # = [2,4,6]
是否有类似的方法来获取 Hessian?对 jacobian
辅助函数的嵌套调用不起作用,因为第二个参数不能是 AutoDiffXd
类型。但也许有一些方法更类似于上面的第二种方法?
当前推荐的答案是在需要多个导数时使用 symbolic::Expression
而不是 AutoDiffXd
。虽然我们所有的 C++ 代码如果用 AutoDiffX<AutoDiffXd>
编译以提供二阶导数应该可以工作,但我们目前不将它们构建为 libdrake.so
.
中的默认标量类型之一。
Drake 的卖点之一是可以通过 AutoDiff 轻松获得梯度,但我正在努力了解如何在 pydrake 中轻松计算二阶导数。
给定一个函数 f(x),我知道有两种计算雅可比行列式的方法。第一种方式使用 forwarddiff.jacobian
辅助函数,例如:
def f(x):
return x.T@x
x = np.array([1,2,3])
fx = jacobian(f,x) # = [2,4,6]
第二种方式更直接地使用autodiffutils
绑定:
x = InitializeAutoDiff([1,2,3])
y = f(x)
fx = ExtractGradient(y) # = [2,4,6]
是否有类似的方法来获取 Hessian?对 jacobian
辅助函数的嵌套调用不起作用,因为第二个参数不能是 AutoDiffXd
类型。但也许有一些方法更类似于上面的第二种方法?
当前推荐的答案是在需要多个导数时使用 symbolic::Expression
而不是 AutoDiffXd
。虽然我们所有的 C++ 代码如果用 AutoDiffX<AutoDiffXd>
编译以提供二阶导数应该可以工作,但我们目前不将它们构建为 libdrake.so
.