【发布时间】:2020-11-16 11:09:10
【问题描述】:
假设我有两个矩阵 tf_t(形状:5x3)和 tf_b(形状:3x3)。 y_tf = tf.matmul(tf_t, tf_b) 然后我使用 tf.gradient api 计算了 dy/dt
import tensorflow as tf
mat = [[0.8363, 0.4719, 0.9783],
[0.3379, 0.6548, 0.3835],
[0.7846, 0.9173, 0.2393],
[0.5418, 0.3875, 0.4276],
[0.0948, 0.2637, 0.8039]]
another_mat = [[ 0.43842274 ,-0.53439844, -0.07710262],
[ 1.5658046, -0.1012345 , -0.2744976 ],
[ 1.4204658 , 1.2609464, -0.43640924]]
tf_t = tf.Variable(tf.convert_to_tensor(mat))
tf_b = tf.Variable(tf.convert_to_tensor(another_mat))
with tf.GradientTape() as tape:
tape.watch(tf_t)
y_tf = tf.matmul(tf_t, tf_b)
y_t0 = y_tf[0,0]
# dy = 2x * dx
dy_dx = tape.gradient(y_tf, tf_t)
print(dy_dx)
我在矩阵下面是 dy/dx
tf.Tensor(
[[-0.17307831 1.1900724 2.245003 ]
[-0.17307831 1.1900724 2.245003 ]
[-0.17307831 1.1900724 2.245003 ]
[-0.17307831 1.1900724 2.245003 ]
[-0.17307831 1.1900724 2.245003 ]], shape=(5, 3), dtype=float32)
上面的矩阵看起来不正确。 因为对于元素 y_tf[0,0]
注意:y_tf[0,0] = tf_t[0,0]*tf_b[0,0] + tf_t[0,1]*tf_b[1,0] + tf_t[0,2]*tf_b[2,0]
如果我执行
tape.gradient(y_t0, tf_t)
我得到这样的矩阵
tf.Tensor(
[[0.43842274 1.5658046 1.4204658 ]
[0. 0. 0. ]
[0. 0. 0. ]
[0. 0. 0. ]
[0. 0. 0. ]], shape=(5, 3), dtype=float32)
上面的第一行是矩阵tf_b 的第一列,考虑到矩阵乘法的工作原理,这是有道理的@ 它的第一个元素 dy_dx[0,0] 为 -0.17307831,这是 tf_b ( sum(tf_b[0,:]) 第一行的总和!!
那么谁能解释一下tf_y[0,0] wrt tf_x 的梯度是如何减少到-0.17307831 而不是3.424693 的?
这个问题可能看起来类似于this,但我正在寻找的答案并没有用清晰的图片解决。
【问题讨论】:
标签: tensorflow autograd tensorflow-gradient