张量流中具有复指数的自定义梯度

Custom gradient with complex exponential in tensorflow

作为练习,我正在尝试在 Tensorflow 中构建一个自定义运算符,并检查由 Tensorflow API 操作组成的相同前向操作的 Tensorflow 自动差异梯度。但是,我的自定义运算符的梯度不正确。看来我的复杂分析不正确,需要补习一下。

import tensorflow as tf

shape = (1, 16)
dtype = tf.complex64

x = tf.cast(tf.complex(tf.random.normal(shape), tf.random.normal(shape)), dtype=dtype)

def fun(x):
    phi = x * tf.math.conj(x)
    e = tf.exp(1j * phi)
    return e

def d_fun(x):
    d_phi = x + tf.math.conj(x)
    phi = x * tf.math.conj(x)
    d_e = 1j * d_phi * tf.exp(1j * phi)
    return d_e

@tf.custom_gradient
def tf_custom(x):    
    e = fun(x)
    def grad(dy):
        d_e = d_fun(x)
        return dy * d_e
    return e, grad

with tf.GradientTape() as g:
    g.watch(x)
    res = fun(x)
    
dy_dx = g.gradient(res, x)

with tf.GradientTape() as g:
    g.watch(x)
    res2 = tf_custom(x)
    
dy_dx2 = g.gradient(res2, x)

print(tf.reduce_sum(tf.abs(res - res2)).numpy())
print(tf.reduce_sum(tf.abs(dy_dx - dy_dx2)).numpy())

TensorFlow 2 不直接计算复杂变量函数的导数。似乎它使用 Wirtinger calculus. You can also find an explanation here.

计算复数函数的导数作为实部和虚部的函数