tensorflow / quantum

Hybrid Quantum-Classical Machine Learning in TensorFlow
https://www.tensorflow.org/quantum
Apache License 2.0
1.8k stars 577 forks source link

Tracing adjoint gradient #667

Open zaqqwerty opened 2 years ago

zaqqwerty commented 2 years ago

Some tf.function wrapped functions that only have a single tape result in:

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

One possible cause is mentioned at this link:

It should be noted tf.GradientTape is still watching the forward pass of a tf.custom_gradient, and will use the ops it watches. As a consequence, calling tf.function while the tape is still watching leads to a gradient graph being built. If an op is used in tf.function without registered gradient, a LookupError will be raised.

So solving this seems like it would involve removing tf.function decoration from the library, leaving it up to users to decorate as desired.

MichaelBroughton commented 2 years ago

Can you provide a minimal snippet that reproduces this issue ? It looks like this lookup is related to trying to get gradient info from the gradient op which could be caused by trying to do 2nd order or multi-tape things.

zaqqwerty commented 2 years ago

Still need to get a more minimal example. Most toggleable place it's turned up is line 144 of the tests here , where I found that adding persistent=True to the gradient tape causes the error LookupError: No gradient defined for operation'TfqAdjointGradient' to happen.