Як Tensorflow `tf.train.Optimizer` обчислює градієнти?


10

Я стежу за підручником із журналу Tensorflow ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

Підручник використовує tf.train.Optimizer.minimize(конкретно tf.train.GradientDescentOptimizer). Я не бачу жодних аргументів, щоб передаватись ніде для визначення градієнтів.

Чи потік тензорів використовує цифрову диференціацію за замовчуванням?

Чи є спосіб пройти в градієнтах, як ви можете scipy.optimize.minimize?

Відповіді:


16

Це не числова диференціація, це автоматична диференціація . Це одна з головних причин існування tensorflow: вказуючи операції на графіку тензорфлоу (з операціями на Tensors і так далі), він може автоматично слідувати правилу ланцюга через графік, оскільки, оскільки він знає похідні кожної окремої операції, ви Вкажіть, він може поєднувати їх автоматично.

Якщо ви з якоїсь причини хочете перекрити це кусочно, це можливо gradient_override_map.


Чи не є автоматичною диференціацією за допомогою числової диференціації?
Ерін

@BYOR Ні; перегляньте посилання Вікіпедія вище. Однак те, що робить тензорфлоу, є десь між "справжнім" автозахистом у зворотному режимі та символічною диференціацією.
Дугал

@Dougal im, використовуючи нетерплячий режим без графіку, без декоратора tf.function, як автоматична диференціація знає відношення між тензорами?
datdinhquoc

1
@datdinhquoc Це той самий фундаментальний алгоритм, лише трохи складніше в реалізації.
Дугал

9

Тут використовується автоматична диференціація. Там, де він використовується ланцюговим правилом, і введіть слово в графі, що призначає градієнти

Скажімо, у нас є тензор C Цей тензор C зробив після ряду операцій. Скажімо, додаючи, множимо, переглядаючи деяку нелінійність тощо

Отже, якщо цей C залежить від деякого набору тензорів, який називається Xk, нам потрібно отримати градієнти

Tensorflow завжди відстежує шлях операцій. Я маю на увазі послідовну поведінку вузлів і те, як між ними протікають дані. Це робиться за графіком введіть тут опис зображення

Якщо нам потрібно отримати деривативи входів витрат wrt X, то це спочатку буде це завантаження шляху від x-input до вартості шляхом розширення графіка.

Потім він починається в порядку річок. Потім розподіліть градієнти за допомогою ланцюгового правила. (Те саме, що і розмноження)

У будь-якому випадку, якщо ви читаєте вихідні коди, що належать до tf.gradients (), ви можете виявити, що tensorflow зробив цю частину розподілу градієнта чудово.

Під час зворотного відстеження tf взаємодіє з графіком, у проході зворотного слова TF зустрінеться з різними вузлами. Всередині цих вузлів є операції, які ми називаємо (ops) matmal, softmax, relu, batch_normalization тощо графік

Цей новий вузол складається з часткової похідної операцій. get_gradient ()

Поговоримо трохи про ці щойно додані вузли

Всередині цих вузлів ми додаємо 2 речі 1. Похідне ми обчислили ealier) 2.Также вхідні дані для corpspoding opp в передньому проході

Тож за ланцюговим правилом ми можемо розрахувати

Тож це так само, як API-слово для зворотних слів

Тож тензорфлоу завжди думає про порядок графіка, щоб зробити автоматичну диференціацію

Отже, як ми знаємо, нам потрібні передні змінні для обчислення градієнтів, тоді нам потрібно зберігати проміжні значення також у тензорах, це може зменшити пам'ять. Для багатьох операцій TF знає, як обчислити градієнти та розподілити їх.


1
я використовую нетерплячий режим без графіку, без декоратора tf.function, як автоматична диференціація знає відношення між тензорами?
datdinhquoc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.