как тензорный поток обрабатывает сложный градиент?

Пусть z — комплексная переменная, C(z) — ее сопряжение. В теории комплексного анализа производная C(z) по z не существует. Но в tessorflow мы можем вычислить 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? И я хочу знать, как тензорный поток вообще обрабатывает сложные градиенты.


person zhd.zhang    schedule 27.02.2017    source источник
comment
Я предполагаю, что это не поддерживается. Требуется ли для вашей работы этот функционал?   -  person Neal    schedule 28.02.2017


Ответы (2)


Как?

Уравнение, используемое Tensorflow для градиента:

tf-grad-def

Где «*» означает сопряжение.

При использовании определения частных производных по z и z* используется исчисление Виртингера. Исчисление Виртингера позволяет вычислять производную по комплексной переменной для неголоморфных функций. Определение Виртингера:

wirtinger

Почему это определение?

При использовании, например, комплексных нейронных сетей (CVNN) градиенты будут использоваться поверх неголоморфной скалярной функции с действительным знаком одной или нескольких комплексных переменных, определение тензорного потока градиента может быть записано как:

Это определение соответствует литературе CVNN, например, главе 4, разделу 4.3 или Амин и др. (между бессчетное количество примеров).

person Agustin Barrachina    schedule 25.09.2019

Немного поздно, но я тоже недавно столкнулся с этой проблемой.

Ключевым моментом является то, что 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

person Harry Slatyer    schedule 18.07.2019