prediction = neural_net(x_value)
dx_f = tf.gradients(prediction, x_value)
dx_dx_f = tf.gradients(dx_f, x_value)
x_value是具有测试大小长度的数组。 但是,这导致predictions and derivatives。网络的预测(蓝色曲线)基本上正好抓住了正弦函数,但是我必须将一阶导数(橙色)除以10,将二阶导数(绿色)除以100才能使其成为正弦函数。在相同的数量级。因此,一阶导数看起来(在重新缩放后)还可以,但是第二个导数完全不稳定。由于对正弦函数的预测非常有效,因此这里显然发生了一些有趣的事情。
答案 0 :(得分:0)
我认为您无法使用tf.gradients计算二阶导数。看看tf.hessians(您真正想要的是Hessian矩阵的对角线),例如[1]。
另一种方法是使用tf.GradientTape:[2]。
[1] https://github.com/gknilsen/pyhessian
[2] https://www.tensorflow.org/api_docs/python/tf/GradientTape
答案 1 :(得分:0)
关于您所观察到的结果的一种可能解释是,您的函数不能两次导出。似乎极值周围的一阶导数存在跳跃。如果是这样,则该函数的二阶导数实际上并不存在,而您是否会感到困惑取决于该库如何处理此类位置。
考虑以下非平滑函数的图片,对于{1、2,....}中的所有x,该函数从0.5跳到-0.5。除x为整数外,所有位置的斜率均为1。如果您尝试绘制它的导数,则可能会在y = 1处看到一条直线,这很容易被误解,因为如果有人只是看这个图,他们可能会认为函数是完全线性的,并且从-infinity到+无穷大。
如果结果是由使用RELU的神经网络产生的,则可以尝试使用S型激活函数进行相同的操作。我想您不会在此功能中看到太多峰值。
答案 2 :(得分:0)
您了解到的是窦函数而不是其导数:在训练过程中,您正在使用成本函数控制误差,而成本函数仅考虑值,但根本不控制斜率:您本来可以学会了一个非常嘈杂的功能,但是完全匹配数据点。
如果仅在成本函数中使用数据点,则无法保证所学的导数。但是,通过一些高级培训技术,您还可以学习这样的派生形式:https://arxiv.org/abs/1706.04859
因此,作为总结,这不是代码问题,而仅仅是 一个理论问题