8

TensorFlow を使用して行列式の導関数を計算することに興味があります。実験から、TensorFlow が行列式による微分方法を実装していないことがわかります。

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

もう少し調べてみると、導関数を実際に計算できることがわかりました。たとえば、ヤコビの公式を参照してください。関数デコレータを使用する必要がある行列式を介して差別化するこの手段を実装するために、

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

しかし、私はこれがどのように達成されるかを理解できるほどテンソルフローに精通していません。誰かがこの問題について何か洞察を持っていますか?

この問題に遭遇した例を次に示します。

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

3 に答える 3

9

こちらの「Pythonでグラデーションを実装する」セクションを確認してください

具体的には、次のように実装できます

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

次に、それが機能することを確認するための簡単なトレーニング ループを実行します。

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

その後、時間の経過に伴う損失を視覚化できます

import matplotlib.pyplot as plt

plt.ylabel("Determinant Squared")
plt.xlabel("Iterations")
plt.plot(losses)

このようなものを見るべきです 損失プロット

于 2015-11-15T04:30:13.827 に答える
0

行列行列式の導関数とは何かと混乱していると思います。

マトリックス行列式は、何らかの式によってマトリックスの要素に対して計算される関数です。したがって、行列のすべての要素が数値である場合、行列式は 1 つの数値であり、導関数は になります0。一部の要素が変数の場合、これらの変数の式を取得します。例えば:

x, x^2
1, sin(x)

行列式は にx*sin(x) - x^2なり、導関数はになり2x + sin(x) + x*cos(x)ます。ヤコビの式は、行列式を随伴行列に接続するだけです。


あなたの例では、マトリックスAは数値のみで構成されているため、行列式は単なる数値であり、それも単なる数値lossです。最小化するためにいくつかの自由変数が必要ですが、あなたは単なる数値であるGradientDescentOptimizerため、何もありません。loss

于 2015-11-15T01:04:55.510 に答える
0

興味のある方のために、私の問題に有効な解決策を発見しました:

@tf.RegisterGradient("MatrixDeterminant")
def _MatrixDeterminant(op, grad):
    """Gradient for MatrixDeterminant."""
    return op.outputs[0] * tf.transpose(tf.matrix_inverse(op.inputs[0]))
于 2015-11-15T03:10:32.200 に答える