Tensorflow tf.gradients,我如何理解'grad_ys'并使用它?

Tensorflow tf.gradients,我如何理解'grad_ys'并使用它?,tensorflow,Tensorflow,在tf.gradients中,有一个关键字参数grad_ys grad_ys是一个与ys长度相同的张量列表,用于保存ys中每个y的初始梯度。当grad_ys为无时,我们为ys中的每个y填充一个y形状的“1”张量。用户可以提供他们自己的初始grad_ys,以使用每个y的不同初始梯度计算导数(例如,如果想要为每个y中的每个值对梯度进行不同的加权) 为什么这里需要毕业生?这里的文档是隐式的。你能给出一些具体的用途和代码吗 我的tf.gradients示例代码是 [1]中的:将numpy作为np导入 在

tf.gradients
中,有一个关键字参数
grad_ys

grad_ys
是一个与
ys
长度相同的张量列表,用于保存
ys
中每个
y
的初始梯度。当
grad_ys
为无时,我们为
ys
中的每个
y
填充一个
y
形状的“1”张量。用户可以提供他们自己的初始
grad_ys
,以使用每个y的不同初始梯度计算导数(例如,如果想要为每个y中的每个值对梯度进行不同的加权)

为什么这里需要毕业生?这里的文档是隐式的。你能给出一些具体的用途和代码吗

我的
tf.gradients
示例代码是

[1]中的
:将numpy作为np导入
在[2]中:将tensorflow作为tf导入
在[3]中:sess=tf.InteractiveSession()
在[4]中:X=tf.placeholder(“float”,shape=[2,1])
在[5]中:Y=tf.placeholder(“float”,shape=[2,1])
[6]中:W=tf.Variable(np.random.randn(),name='weight')
在[7]中:b=tf.Variable(np.random.randn(),name='bias')
在[8]中:pred=tf.add(tf.multiply(X,W),b)
在[9]中:成本=0.5*tf.reduce_和(tf.pow(pred-Y,2))
在[10]中:梯度=tf.梯度(成本,[W,b])
[11]:sess.run(tf.global\u variables\u initializer())
在[15]中:W,b,pred,cost,grads=sess.run([W,b,pred,cost,grads],
feed_dict={X:[[2.0],[3.]],Y:[[3.0],[2.]})

grad_ys
仅适用于高级用例。下面是你可以怎么想的

tf.gradients
允许您计算
tf.gradients(y,x,grad_ys)=grad_ys*dy/dx
。换句话说,
grad_ys
是每个
y
的乘数。在这种表示法中,提供这个参数似乎很愚蠢,因为一个人应该能够将自己乘以,即
tf.gradients(y,x,grad_ys)=grad_ys*tf.gradients(y,x)
。不幸的是,这个等式并不成立,因为当向后计算梯度时,我们会在每一步之后执行缩减(通常是求和)以获得“中间损失”

此功能在许多情况下都很有用。其中一个在文档字符串中提到。还有一个。记住链式规则-
dz/dx=dz/dy*dy/dx
。假设我们想要计算
dz/dx
,但是
dz/dy
是不可微的,我们只能近似它。假设我们以某种方式计算近似值,并将其称为
approx
。然后,
dz/dx=tf.梯度(y,x,grad_ys=近似值)

另一个用例是当你有一个带有“巨大扇入”的模型时。假设您有100个输入源,它们经过几层(称为“100个分支”),在
y
处合并,然后再经过10层,直到丢失
。可能一次计算整个模型的所有梯度(需要记住许多激活)不适合内存。一种方法是首先计算
d(损失)/dy
。然后,使用
tf计算
branch\u i
中变量相对于
loss
的梯度(y,branch\u i\u变量,grad\u ys=d(loss)/dy)
。使用这个(以及我跳过的更多细节)可以降低峰值内存需求