我正在尝试使用TensorFlow来最小化L
以下的损失函数(u
)。有3个变量u
,x_opt
,L
,具有以下依赖关系图:
u
---(f
) - > x_opt
---(g
) - > L
,
具有由函数f
和g
控制的依赖的确切形式。
def f(u):
def f_helper(u,x):
# with u held fixed, f_helper is a convex function of x
# the exact form of f_helper does not matter
return np.linalg.norm(x-u)
curried_f_helper = lambda x: f_helper(u,x)
x_opt = scipy.optimize(curried_f_helper,np.random.uniform(5))['x']
return x_opt
def g(x_opt):
# the exact form of g does not matter
return np.ones(x_opt.shape).dot(x_opt)
def L(u):
# want to optimize L over u
x_opt = f(u)
return g(x_opt)
# use TensorFlow to minimize L over u...
复杂性是f()
没有分析函数形式 - u
参数化解决方案为x_opt
的优化问题。因此,TensorFlow无法计算f
相对于u
的渐变。但是,我可以使用隐式微分来手动计算此渐变。理想情况下,我可以定义一个代表f
的新操作,并注册其渐变(我手动计算)。
我的问题是:我应该如何实现代表f
的op并指定其渐变?是否可以仅使用Python定义f
的操作,如果是,我是否必须使用tf.pyfunc
?