自动微分可以处理数组切片的单独功能吗?

时间:2016-01-26 18:21:50

标签: gradient theano tensorflow backpropagation autodiff

给定长度为v的向量30,可以说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 || )

这甚至有意义吗?我在脑海中想象的方式我必须通过标识向量/矩阵进行一些乘法,并使用尾随0来转换v --> w

2 个答案:

答案 0 :(得分:3)

切片和重塑操作符合标准反向模式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])

enter image description here

答案 1 :(得分:0)

让我们看一下源代码:

@ops.RegisterGradient("Reshape")
def _ReshapeGrad(op, grad):
  return [array_ops.reshape(grad, array_ops.shape(op.inputs[0])), None]

这是张量流自动区分的方式。