matrix determinant differentiation in tensorflow

后端 未结 3 1629
野的像风
野的像风 2020-12-10 06:36

I am interested in computing the derivative of a matrix determinant using TensorFlow. I can see from experimentation that TensorFlow has not implemented a method of differen

3条回答
  •  醉话见心
    2020-12-10 07:13

    Please check "Implement Gradient in Python" section here

    In particular, you can implement it as follows

    @ops.RegisterGradient("MatrixDeterminant")
    def _MatrixDeterminantGrad(op, grad):
      """Gradient for MatrixDeterminant. Use formula from 2.2.4 from
      An extended collection of matrix derivative results for forward and reverse
      mode algorithmic differentiation by Mike Giles
      -- http://eprints.maths.ox.ac.uk/1079/1/NA-08-01.pdf
    """
      A = op.inputs[0]
      C = op.outputs[0]
      Ainv = tf.matrix_inverse(A)
      return grad*C*tf.transpose(Ainv)
    

    Then a simple training loop to check that it works:

    a0 = np.array([[1,2],[3,4]]).astype(np.float32)
    a = tf.Variable(a0)
    b = tf.square(tf.matrix_determinant(a))
    init_op = tf.initialize_all_variables()
    sess = tf.InteractiveSession()
    init_op.run()
    
    minimization_steps = 50
    learning_rate = 0.001
    optimizer = tf.train.GradientDescentOptimizer(learning_rate)
    train_op = optimizer.minimize(b)
    
    losses = []
    for i in range(minimization_steps):
      train_op.run()
      losses.append(b.eval())
    

    Then you can visualize your loss over time

    import matplotlib.pyplot as plt
    
    plt.ylabel("Determinant Squared")
    plt.xlabel("Iterations")
    plt.plot(losses)
    

    Should see something like this

提交回复
热议问题