Тензор потока: обратное распространение между отключенными подграфами через сохраненные промежуточные значения - PullRequest
0 голосов
/ 28 сентября 2018

Привет, сообщество Stackoverflow!

Я задаюсь вопросом о простой идее сокращения требований к памяти, связанной с конкретной проблемой обучения нейронных сетей feedfoward (В связи с другим моим вопросом: Градиенты вычисления OOM дляглубокая нейронная сеть. ).

Предположим, у меня есть график, определенный с помощью тензорного потока, реализующий вычисления для мультиперцептрона и функции потерь.После инициализации переменных и т. Д. Я вычисляю прямой проход, вводя входные данные в этот график, таким образом получая некоторое выходное значение.Я храню выходное значение в списке.После этого я делаю еще один проход вперед, используя предыдущий вывод в качестве нового ввода, и снова сохраняю новое значение вывода.Я могу повторить эту процедуру несколько раз и реализовать своего рода прямой проход через глубокую нейронную сеть.Я бы назвал такое повторение step k .Я делаю общий K таких шагов.

Изображение распространение между шагами переводит эту идею в перспективу для двух последних вычисленных шагов.

Теперь моя цель - вычислить обратный проход ошибки черезвсе эти шаги.

Предполагается, что рассчитанные градиенты сохраняются для каждого шага, но не применяются напрямую.

Я могу использовать сохраненные значения для пересчета активаций для каждого шага.

На последнем шаге можно получить градиенты непосредственно из определенной функции потерь с помощью операции train_op.compute_gradients (убыток) с использованием определенной пользователем цели для шага K и последнего выводазначение сохранено для шаг K-1 .

Теперь я надеялся, что смогу просто использовать что-то вроде tf.gradients (loss, [input_vars]) для вычисленияградиент по входу.Я мог бы добавить этот градиент к выходному значению step K-1 и использовать эту сумму в качестве целевого значения для оценки функции потерь для step K-1 , снова используя выход шаг K-2 в качестве входного значения.

Другими словами: градиент потерь Fct относительно входа дает информацию о том, как должен измениться выход на предыдущем шаге.

Эта идея каким-то образом реализована или уже существуют методы для такого обратного распространения через промежуточные значения между отключенными вычислительными графами?

Или это то, что я спрашиваю / пишу полную чушь?(Для меня это довольно сложно выразить словами ...)

Спасибо за потраченное время!

...