5

z是一个复变量,C(z)是它的共轭。在复分析理论中,不存在C(z) wrt z的导数。但是在 tesnsorflow 中,我们可以计算dC(z)/dz,结果只是1。这是一个例子:

x = tf.placeholder('complex64',(2,2))
y = tf.reduce_sum(tf.conj(x))
z = tf.gradients(y,x)
sess = tf.Session()
X = np.random.rand(2,2)+1.j*np.random.rand(2,2)
X = X.astype('complex64')
Z = sess.run(z,{x:X})[0]

输入X

[[0.17014372+0.71475762j  0.57455420+0.00144318j]
 [0.57871044+0.61303568j  0.48074263+0.7623235j ]]

结果Z

[[1.-0.j  1.-0.j]
 [1.-0.j  1.-0.j]]

我不明白为什么渐变设置为1?而且我想知道tensorflow 通常如何处理复杂的渐变

4

2 回答 2

4

如何?

Tensorflow 用于梯度的方程为:

tf-grad-def

其中“*”表示共轭。

当使用 wrt z 和 z* 的偏导数的定义时,它使用 Wirtinger 演算。Wirtinger 演算能够计算非全纯函数的复变量的导数。维廷格的定义是:

写作者

为什么有这个定义?

例如,当使用复值神经网络 (CVNN) 时,梯度将用于一个或多个复变量的非全纯实值标量函数,然后梯度的 tensorflow 定义可以写为:

该定义与 CVNN 的文献相对应,例如本书的第 4 章第 4.3 节或Amin 等人。(在无数例子之间)。

于 2019-09-25T13:31:01.530 回答
2

有点晚了,但我最近也遇到了这个问题。

关键是TensorFlow将复变量的复值函数f(z)的“梯度”定义为“真实映射F的梯度:(x,y) -> Re(f(x+iy) ),表示为复数”(该实地图的梯度是 R^2 中的向量,因此我们可以用显而易见的方式将其表示为复数)。

推测该定义的原因是,在 TF 中,人们通常关注梯度,以便在损失函数上运行梯度下降,特别是识别该损失函数的最大增加/减少的方向。使用上面的梯度定义意味着复变量的复值函数可以用作标准梯度下降算法中的损失函数,结果将是函数的实部被最小化(这在我看来是对“优化这个复值函数”的某种合理解释)。

现在,对于您的问题,编写梯度定义的等效方法是

梯度(f) := dF/dx + idF/dy = conj(df/dz + dconj(f)/dz)

(您可以使用 d/dz 的定义轻松验证)。这就是 TensorFlow 处理复杂梯度的方式。至于 f(z):=conj(z) 的情况,我们有 df/dz=0(正如你提到的)和 dconj(f)/dz=1,给出梯度(f)=1。

如果您有兴趣,我在这里写了一个更长的解释:https ://github.com/tensorflow/tensorflow/issues/3348#issuecomment-512101921

于 2019-07-18T00:27:34.297 回答