Градиент TensorFlow вычисляет производную функций с неизвестной зависимостью от решающей переменной - PullRequest
0 голосов
/ 01 мая 2018

Буду признателен, если вы сможете ответить на мои вопросы или предоставить мне полезные ресурсы.

В настоящее время я работаю над проблемой, которая мне необходима для чередующейся оптимизации. Итак, рассмотрим, что у нас есть две переменные решения x и y. На первом этапе я беру производную функции потерь по отношению к. х (для фиксированного у) и обновить х. На втором шаге мне нужно взять производную по отношению к. у. Проблема в том, что x неявно зависит от y, и найти замкнутую форму функции стоимости таким образом, чтобы показать зависимость x от y, не представляется возможным, поэтому градиенты функции стоимости относительно. ты неизвестен.

1) Мой первый вопрос: работает ли метод «autodiff» в обратном режиме, используемый в TensorFlow, для этих задач, где у нас нет явного вида функции стоимости относительно одной переменной и нам нужны производные? На самом деле значение функции стоимости известно, но зависимость от решающей переменной неизвестна посредством математики.

2) В общем виде, если я определю узел как «переменную tf.Variable» и у меня будет произвольная неразрешимая функция (которую невозможно вычислить вручную) для этой переменной, которая эволюционирует в результате выполнения кода, можно ли вычислить градиенты через "tf.gradients"? Если да, как я могу убедиться, что он реализован правильно? Могу ли я проверить это с помощью TensorBoard?


Моя модель слишком сложна, но упрощенная форма может рассматриваться следующим образом: предположим, что функция потерь для моей модели - L (x). Я могу закодировать L (x) как функцию от «x» во время фазы построения в тензорном потоке. Однако у меня есть и другая переменная "k", которая инициализируется нулем. Зависимость L (x) от "k" формирует, когда код выполняется, поэтому моя функция потерь - L (x, k), на самом деле. И что более важно, «x» является функцией «k» неявно. (вся оптимизация выполняется с использованием GradientDescent). Проблема в том, что у меня нет L (x, k) в качестве функции закрытой формы, но у меня есть значение L (x, k) на каждом шаге. Я могу использовать «числовые» методы, такие как FDSA / SPSA, но они не являются точными. Мне просто нужно убедиться, что, как вы сказали, есть путь между "k" и L (x, k), но я не знаю, как!

1 Ответ

0 голосов
/ 02 мая 2018

Градиенты TensorFlow работают только тогда, когда граф, соединяющий x и y при вычислении dy / dx, имеет хотя бы один путь, который содержит только дифференцируемые операции. В общем, если tf дает вам градиент, это правильно (в противном случае подайте ошибку, но ошибки градиента редки, так как градиент для всех дифференцируемых операций хорошо проверен, и правило цепочки довольно легко применить).

Не могли бы вы немного подробнее рассказать о том, как выглядит ваша модель? Возможно, вы захотите использовать активное выполнение, если ваше прямое усложнение слишком странно, чтобы выразить его в виде фиксированного графа потока данных.

...