在 JAX 中使用 VJP 时有没有办法禁用前向求值?
Is there a way to disable forward evaluation while using VJP in JAX?
我在项目中经常使用VJP。它 运行 是受 Jacobian 计算影响的函数,returns 是 primals_out 以及可调用的 vjp 函数。
例如,JAX 文档中的自定义 VJP 定义是这样给出的:
from jax import custom_vjp
@custom_vjp
def f(x, y):
return jnp.sin(x) * y
def f_fwd(x, y):
# Returns primal output and residuals to be used in backward pass by f_bwd.
return f(x, y), (jnp.cos(x), jnp.sin(x), y)
def f_bwd(res, g):
cos_x, sin_x, y = res # Gets residuals computed in f_fwd
return (cos_x * g * y, sin_x * g)
f.defvjp(f_fwd, f_bwd)
在此示例中,我们看到使用 VJP 时需要对前向函数进行评估。使用常规 VJP 而不是自定义 VJP 时也是如此。但是,当函数的评估成本很高并且由于我已经 运行 我的代码中的某处函数时,我不希望 VJP 再次评估该函数。
那么,有什么方法可以表明在计算函数的 VJP 时不会对函数求值吗?
我认为在这种情况下没有任何方法可以显式禁用前向求值,但是如果您将计算包装在 jit
编译中,XLA 编译器将自动执行无用代码消除和 trim 计算图中未使用的分支。
我在项目中经常使用VJP。它 运行 是受 Jacobian 计算影响的函数,returns 是 primals_out 以及可调用的 vjp 函数。 例如,JAX 文档中的自定义 VJP 定义是这样给出的:
from jax import custom_vjp
@custom_vjp
def f(x, y):
return jnp.sin(x) * y
def f_fwd(x, y):
# Returns primal output and residuals to be used in backward pass by f_bwd.
return f(x, y), (jnp.cos(x), jnp.sin(x), y)
def f_bwd(res, g):
cos_x, sin_x, y = res # Gets residuals computed in f_fwd
return (cos_x * g * y, sin_x * g)
f.defvjp(f_fwd, f_bwd)
在此示例中,我们看到使用 VJP 时需要对前向函数进行评估。使用常规 VJP 而不是自定义 VJP 时也是如此。但是,当函数的评估成本很高并且由于我已经 运行 我的代码中的某处函数时,我不希望 VJP 再次评估该函数。
那么,有什么方法可以表明在计算函数的 VJP 时不会对函数求值吗?
我认为在这种情况下没有任何方法可以显式禁用前向求值,但是如果您将计算包装在 jit
编译中,XLA 编译器将自动执行无用代码消除和 trim 计算图中未使用的分支。