diferenciación determinante de la matriz en el flujo tensorial

Estoy interesado en calcular la derivada de un determinante de matriz usando TensorFlow. Puedo ver por experimentación que TensorFlow no ha implementado un método de diferenciación a través de un determinante:

LookupError: No gradient defined for operation 'MatrixDeterminant' 
(op type: MatrixDeterminant)

Una pequeña investigación adicional reveló que en realidad es posible calcular la derivada; ver por ejemploFórmula de Jacobi. Determiné que para implementar este medio de diferenciar a través de un determinante que necesito usar el decorador de funciones,

@tf.RegisterGradient("MatrixDeterminant")
def _sub_grad(op, grad):
    ...

Sin embargo, no estoy lo suficientemente familiarizado con el flujo de tensor para comprender cómo se puede lograr esto. ¿Alguien tiene alguna idea sobre este asunto?

Aquí hay un ejemplo donde me encuentro con este problema:

x = tf.Variable(tf.ones(shape=[1]))
y = tf.Variable(tf.ones(shape=[1]))

A = tf.reshape(
    tf.pack([tf.sin(x), tf.zeros([1, ]), tf.zeros([1, ]), tf.cos(y)]), (2,2)
)
loss = tf.square(tf.matrix_determinant(A))


optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)


for step in xrange(100):
    sess.run(train)
    print sess.run(x)

Respuestas a la pregunta(3)

Su respuesta a la pregunta