Использует ли тензорный поток автоматический или символический градиент?
Мне не удалось найти четкое утверждение о том, использует ли тензорный поток автоматическое или символическое дифференцирование.
Я снял тензорный поток paper, и они упоминают автоматические градиенты, но неясно, означают ли они только символические градиенты, поскольку они также что у него есть эта возможность.
Ответы
Ответ 1
Под "автоматическим дифференцированием" вы можете думать о "дифференцировании конечными разностями", где вы приближаете производную от f(x)
как [f(x+e)-f(x-e)]/(2e)
. Однако автоматическая дифференциация различна, а метод конечных разностей является примером "численного дифференцирования".
TensorFlow использует автоматическое дифференцирование в обратном режиме для него gradients
и метод конечных разностей для тестов, которые проверяют правильность работы градиента, например здесь.
Метод конечных разностей нецелесообразен для задач с большими размерами, тогда как автоматическое дифференцирование в обратном режиме дает вам производную от функции "много- > 1" примерно с той же стоимостью, что и вычисляющая исходная функция
Вы можете увидеть ядро реализации здесь.
Реализация метода дифференцирования символична в том смысле, что операция gradients
принимает вычислительный граф и создает вычислительный граф, который можно вернуть обратно в операцию "градиенты", чтобы получить производные более высокого уровня.
Здесь пример
tf.reset_default_graph()
x = tf.Variable(0.)
y = tf.square(x)
z = tf.gradients([y], [x])
Вот график, который вы получите
![введите описание изображения здесь]()
Есть несколько дополнительных операторов, поскольку тот же самый код графа будет работать для более высокого размера x
, но дело в том, что вы видите как x^2
, так и 2*x
на одном и том же графике.
Ответ 2
TF использует автоматическое дифференцирование и, более конкретно, автоматическое дифференцирование в обратном направлении.
Существует 3 популярных метода вычисления производной:
- Численное дифференцирование
- Символическое дифференцирование
- Автоматическое дифференцирование
Численное дифференцирование зависит от определения производной:
, где вы помещаете очень маленькую h
и оцениваете функцию в двух местах. Это самая основная формула, и на практике люди используют другие формулы, которые дают меньшую ошибку оценки. Этот способ вычисления производной подходит в основном, если вы не знаете свою функцию и можете ее только пробовать. Также для этого требуется много вычислений для высокотемпературной функции.
Символическое дифференцирование манипулирует математическими выражениями. Если вы когда-либо использовали matlab или mathematica, то вы видели что-то вроде этого
![введите описание изображения здесь]()
Здесь для каждого математического выражения они знают производную и используют различные правила (правило продукта, правило цепи) для вычисления полученной производной. Затем они упрощают конечное выражение для получения полученного выражения.
Автоматическое дифференцирование управляет блоками компьютерных программ. У дифференциатора есть правила для принятия производной каждого элемента программы (когда вы определяете любой op в core TF, вам нужно зарегистрировать градиент для этого op). Он также использует правило цепи, чтобы разбить сложные выражения на более простые. Вот хороший хороший пример того, как он работает в реальных программах TF с некоторыми объяснениями.
Вы можете подумать, что автоматическое дифференцирование совпадает с символьным дифференцированием (в одном месте они работают с математическим выражением, в другом - с компьютерными программами). И да, они иногда очень похожи. Но для команд управления потоком (`if, while, loops) результаты могут быть очень different:
символическое дифференцирование приводит к неэффективному коду (если только тщательно ) и сталкивается с трудностями преобразования компьютерной программы в одиночное выражение
Ответ 3
Символическое дифференцирование Afaik означает работу с математическим, символическим уравнением (т.е. символическим математическим уравнением в, производным от уравнения). Автоматическое дифференцирование вычисляет производные на основе вычислительных функций (которые, в свою очередь, разбиваются на основные операции, такие как сложение/вычитание и умножение/деление).
Так как TensorFlow выполняет дифференцирование на основе вычислительного графика операций, я бы интуитивно сказал, что это автоматическая дифференциация (я не знаю никакой другой техники, которая была бы здесь уместна, я думаю, что TensorFlow преобразует вычисление граф в математическое уравнение, которое затем анализируется для вычисления производной этого уравнения, не может быть и речи). Авторы говорят "символическое дифференцирование" в TensorFlow whitepaper хотя, однако, я думаю, что это может быть неправильное имя, похожее на "Тензор", вместо "(многомерного) массива данных", если вы спросите математика.