Dado un vector v de longitud digamos 30, ¿pueden las herramientas de diferenciación automática en digamos theano o tensorflow ser capaces de tomar el gradiente de algo como esto:

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 || )

¿Tendría esto siquiera sentido? De la forma en que me lo imagino, tendría que hacer algunas multiplicaciones por vectores / matrices de identidad con ceros al final para convertir v --> w

1
bge0 26 ene. 2016 a las 21:21

2 respuestas

La mejor respuesta

Las operaciones de corte y remodelación encajan en el marco AD de modo inverso estándar de la misma manera que cualquier otra operación. A continuación se muestra un programa TensorFlow simple que es similar al ejemplo que dio (tuve que cambiar un par de cosas para hacer coincidir las dimensiones) y el gráfico de cálculo resultante para el gradiente

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

4
Yaroslav Bulatov 26 ene. 2016 a las 19:11

Echemos un vistazo al código fuente:

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

Así es como tensorflow se diferencia automáticamente.

0
Zhi Zhang 9 ago. 2018 a las 12:06