【问题标题】:TensorFlow gradient of matrix wrt a matrix is not making sense矩阵wrt矩阵的TensorFlow梯度没有意义
【发布时间】: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


    【解决方案1】:

    这里要理解的关键概念是tf.gradients 计算输出相对于输入的总和的梯度。即dy_dx 表示y_tf 的所有元素之和随着tf_t 的每个元素的变化而变化的比例。

    因此,如果您采用 tf_t[0, 0],则该值将用于计算 y_tf[0, 0]y_tf[0, 1]y_tf[0, 2],在每种情况下都具有系数 tf_b[0, 0]tf_b[0, 1]tf_b[0, 2]。所以,如果我将tf_t[0, 0] 增加一,y_tf 的总和将增加tf_b[0, 0] + tf_b[0, 1] + tf_b[0, 2],这就是dy_dx[0, 0] 的值。继续同样的推理,每个值tf_t[i, j] 实际上是乘以tf_b[j, :] 中的所有值,所以dy_dxtf_b 的行总和的重复。

    当您计算y_t0 相对于tf_t 的梯度时,tf_t[0, 0] 的变化会将结果的总和更改为tf_b[0, 0] 的因子,因此这就是其中的梯度值案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2016-03-02
      • 2018-05-16
      相关资源
      最近更新 更多