自动微分可以处理数组切片的单独功能吗?
Can auto differentiation handle separate functions of array slices?
给定一个长度为 30
的向量 v
,theano 或 tensorflow 中的自动微分工具能否采用这样的梯度:
x = np.random.rand(5, 1)
v = f(x, z)
w = v[0:25].reshape(5, 5)
y = g(np.matmul(w, x) + v[25:30])
minimize ( || y - x || )
这有意义吗?我在脑海中想象的方式是,我必须按身份 vectors/matrices 和尾随 0 进行一些乘法以转换 v --> w
切片和重塑操作以与任何其他操作相同的方式适合标准反向模式 AD 框架。下面是一个简单的 TensorFlow 程序,它类似于您给出的示例(我必须更改一些东西以使尺寸匹配),以及梯度的结果计算图
def f(x, z):
"""Adds values together, reshapes into vector"""
return tf.reshape(x+z, (5,))
x = tf.Variable(np.random.rand(5, 1))
z = tf.Variable(np.random.rand(5, 1))
v = f(x, z)
w = tf.slice(v, 0, 5)
w = tf.reshape(v, (5, 1))
y = tf.matmul(tf.reshape(w, (5, 1)), tf.transpose(x)) + tf.slice(v, 0, 5)
cost = tf.square(tf.reduce_sum(y-x))
print tf.gradients(cost, [x, z])
我们来看看源码:
@ops.RegisterGradient("Reshape")
def _ReshapeGrad(op, grad):
return [array_ops.reshape(grad, array_ops.shape(op.inputs[0])), None]
这就是tensorflow自动微分的方式
给定一个长度为 30
的向量 v
,theano 或 tensorflow 中的自动微分工具能否采用这样的梯度:
x = np.random.rand(5, 1)
v = f(x, z)
w = v[0:25].reshape(5, 5)
y = g(np.matmul(w, x) + v[25:30])
minimize ( || y - x || )
这有意义吗?我在脑海中想象的方式是,我必须按身份 vectors/matrices 和尾随 0 进行一些乘法以转换 v --> w
切片和重塑操作以与任何其他操作相同的方式适合标准反向模式 AD 框架。下面是一个简单的 TensorFlow 程序,它类似于您给出的示例(我必须更改一些东西以使尺寸匹配),以及梯度的结果计算图
def f(x, z):
"""Adds values together, reshapes into vector"""
return tf.reshape(x+z, (5,))
x = tf.Variable(np.random.rand(5, 1))
z = tf.Variable(np.random.rand(5, 1))
v = f(x, z)
w = tf.slice(v, 0, 5)
w = tf.reshape(v, (5, 1))
y = tf.matmul(tf.reshape(w, (5, 1)), tf.transpose(x)) + tf.slice(v, 0, 5)
cost = tf.square(tf.reduce_sum(y-x))
print tf.gradients(cost, [x, z])
我们来看看源码:
@ops.RegisterGradient("Reshape")
def _ReshapeGrad(op, grad):
return [array_ops.reshape(grad, array_ops.shape(op.inputs[0])), None]
这就是tensorflow自动微分的方式