tf.gradients如何管理非全纯函数?

时间:2019-07-19 08:58:53

标签: tensorflow gradient autodiff

我正在使用复数值神经网络。我已经对tensorflow使用的反向模式autodiff 的工作方式进行了研究,但是我有一个问题:tensorflow如何管理复杂的偏导数?

对于全纯函数,您可以根据需要定义它(例如,[x+epsilon, y][x,y+epsilon]),因为它是相同的。但是非全纯函数会发生什么?

如果使用Wirtinger演算,则定义应为:

wirtinger

张量流是这种情况吗?还是以其他方式定义?我找不到关于复杂反向模式自动差异的任何好的书目。

2 个答案:

答案 0 :(得分:1)

所以我按照@jdehesa告诉我的那样做。如果我们采用f(z) = |z|^2 = x^2 + y^2,那么我们将:

它们不相等的事实意味着该函数不是全纯函数,并且其偏导数的值根据您接近该点的方式而有所不同,因此df / dz不存在。这就是维特林格演算到来的地方,当发生这种情况时,我们可以为它提供一个定义。

使用维特林格微积分的梯度定义为:

其中的“ *”代表共轭。

现在我已经测试了以下代码:

import tensorflow as tf

z = tf.constant(1+1j, dtype=tf.complex64) 
f = tf.square(tf.abs(z))
grad = tf.gradients(f, [z])[0]
with tf.Session() as sess:
    print(grad.eval())

在这里,所以正确的维特林格微积分应该不给出2 + j2,也不给出2(相对于x的部分)或2j(相对于y的部分)。 事实就是如此,结果是:(1.9999999+1.9999999j)

答案 1 :(得分:0)

好吧,所以我在github/tensorflow的现有线程中对此进行了讨论,@ charmasaur发现了响应,Tensorflow用于渐变的方程为:

tf-grad-def

当使用偏导数wrt z和z *的定义时,它使用Wirtinger微积分。


对于具有一个或多个复杂变量的实值标量函数的情况,此定义变为:

实际上是复数值神经网络(CVNN)应用程序中使用的定义(在此应用程序中,该函数是损耗/误差函数,它确实是真实的)。