我训练了一个神经网络来对正弦函数进行回归,并希望计算相对于输入的一阶和二阶导数。我尝试使用这样的 tf.gradients() 函数(neural_net 是 tf.keras.Sequential 的实例):
prediction = neural_net(x_value)
dx_f = tf.gradients(prediction, x_value)
dx_dx_f = tf.gradients(dx_f, x_value)
Run Code Online (Sandbox Code Playgroud)
x_value 是一个长度为测试大小的数组。然而,这会产生预测和导数。网络的预测(蓝色曲线)基本上准确地捕获了正弦函数,但我必须将一阶导数(橙色)除以 10 倍,将二阶导数(绿色)除以 100 倍,才能得到在同一数量级。因此,一阶导数看起来(重新缩放后)没问题,但二阶导数完全不稳定。由于正弦函数的预测效果非常好,所以这里显然发生了一些有趣的事情。
对于您所观察到的情况,一种可能的解释可能是您的函数不可导出两次。看起来好像极值周围的一阶导数存在跳跃。如果是这样,那么该函数的二阶导数并不真正存在,并且您得到的图很大程度上取决于库如何处理这些地方。
考虑下面的非平滑函数图片,对于 {1, 2, ....} 中的所有 x,该函数从 0.5 跳转到 -0.5。除了当 x 是整数时之外,它的斜率在所有地方都是 1。如果你尝试绘制它的导数,你可能会在 y=1 处看到一条直线,这很容易被误解,因为如果有人只看这个图,他们可能会认为该函数是完全线性的,并且从 -无穷大 开始到+无穷大。
如果您的结果是由使用 RELU 的神经网络产生的,您可以尝试使用 sigmoid 激活函数执行相同的操作。我想您不会通过此函数看到那么多峰值。
| 归档时间: |
|
| 查看次数: |
4737 次 |
| 最近记录: |