今天在用tensorflow2编程的时候发现一个问题,就是tensorflow2的GradientTape自动求导存在误差,有人知道是怎么一回事吗?详细情况如下:
我定义了一个1×2矩阵K和2×1矩阵z的乘积,然后用tensorflow去求输出结果对K矩阵2个元素的导数,结果应该是z矩阵的数值,但是出来的结果不对,如果手动将两个矩阵的元素分别相乘再相加,结果又是对的了。
同样的,利用keras.layers.Dense做相同的计算(不要bias和激活函数),用这一层网络输出结果对输入求导同样存在误差(导数应该是该层网络的权重)。具体计算结果如下,计算结果图中见红框内对比,按理说z应该与G和N相等,wt应该与vg相等,为什么存在这样的误差?:
import tensorflow as tf
from tensorflow.keras.layers import Dense
K = tf.Variable(tf.random.normal([1,2]))
z = tf.random.normal([2,1])
d = Dense(1)
with tf.GradientTape(persistent=True) as tape:
n = tf.squeeze(tf.matmul(K,z))
o = d(K)
wt = d.weights
m = K[0,0]*z[0,0]+K[0,1]*z[1,0]
G = tape.gradient(n, K)
N = tape.gradient(m, K)
wg = tape.gradient(o, d.trainable_variables)
vg = tape.gradient(o, K)