zhd*_*ang 5 autodiff tensorflow
设z是一个复变量,C(z)是它的共轭。在复杂的分析理论,的衍生物C(z)的WRT Ž不存在。但是在 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]
Run Code Online (Sandbox Code Playgroud)
输入X是
[[0.17014372+0.71475762j 0.57455420+0.00144318j]
[0.57871044+0.61303568j 0.48074263+0.7623235j ]]
Run Code Online (Sandbox Code Playgroud)
结果Z是
[[1.-0.j 1.-0.j]
[1.-0.j 1.-0.j]]
Run Code Online (Sandbox Code Playgroud)
我不明白为什么梯度设置为1?我想知道tensorflow 一般是如何处理复杂的梯度的。
小智 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
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |