Какова цель градиентной ленты Tensorflow?
Я посмотрел видео саммита разработчика Tensorflow, посвященное Eager Execution в Tensorflow, и докладчик представил введение в "Градиентную ленту". Теперь я понимаю, что Gradient Tape отслеживает автоматическое дифференцирование, которое происходит в модели TF.
Я пытался понять, почему я использовал градиентную ленту? Кто-нибудь может объяснить, как градиентная лента используется в качестве диагностического инструмента? Зачем кому-то использовать градиентную ленту, а не просто визуализацию весов с помощью Tensorboard?
Итак, я понял, что автоматическое дифференцирование, которое происходит с моделью, заключается в вычислении градиентов каждого узла, что означает корректировку весов и смещений в каждом узле с учетом некоторого пакета данных. Так что это процесс обучения. Но у меня сложилось впечатление, что я действительно могу использовать tf.keras.callback.TensorBoard()
позвоните, чтобы увидеть визуализацию тренировки на тензорной доске, чтобы я мог наблюдать за весами на каждом узле и определять, есть ли мертвые или перенасыщенные узлы.
Можно ли использовать градиентную ленту только для того, чтобы увидеть, уменьшаются ли некоторые градиенты до нуля или становятся действительно большими и т. Д.? Или есть какое-то другое использование градиентной ленты?
1 ответ
С активным выполнением, Tensorflow будет вычислять значения тензоров по мере их появления в вашем коде. Это означает, что он не будет предварительно вычислять статический граф, для которого входные данные подаются через заполнители. Это означает, что для обратного распространения ошибок вы должны отслеживать градиенты вычислений, а затем применять эти градиенты к оптимизатору.
Это очень отличается от работы без энергичного выполнения, где вы должны построить график, а затем просто использовать sess.run
оценить вашу потерю и затем передать ее в оптимизатор напрямую.
По сути, поскольку тензоры вычисляются немедленно, у вас нет графика для расчета градиентов, поэтому вам нужна лента градиентов. Дело не только в том, что он используется только для визуализации, но и в том, что без него невозможно реализовать градиентный спуск в нетерпеливом режиме.
Очевидно, что Tensorflow может просто отслеживать каждый градиент для каждого вычисления на каждом tf.Variable
, Тем не менее, это может быть огромным узким местом производительности. Они предоставляют градиентную ленту, чтобы вы могли контролировать, какие области вашего кода нуждаются в информации о градиенте. Обратите внимание, что в неугодном режиме это будет статически определяться на основе вычислительных ветвей, которые являются потомками вашей потери, но в нетерпеливом режиме нет статического графа и, следовательно, нет способа узнать.
Поработав над этим некоторое время, после публикации первоначального вопроса, я лучше понимаю, где градиентная лента полезна. Похоже, что самое полезное приложение Gradient Tap - это когда вы создаете собственный слой в своем keras
модель, например - или эквивалентно проектирование пользовательского цикла обучения для вашей модели.
Если у вас есть пользовательский слой, вы можете точно определить, как будут происходить операции в этом слое, включая вычисляемые градиенты, а также расчет суммы накопленных убытков.
Таким образом, лента градиента просто даст вам прямой доступ к отдельным градиентам, которые находятся в слое.
Вот пример из второй книги Аурелиена Герона о Tensorflow.
Скажем, у вас есть функция, которую вы хотите в качестве активации.
def f(w1, w2):
return 3 * w1 ** 2 + 2 * w1 * w2
Теперь, если вы хотите взять производные этой функции с учетом w1
а также w2
:
w1, w2 = tf.Variable(5.), tf.Variable(3.)
with tf.GradientTape() as tape:
z = f(w1, w2)
gradients = tape.gradient(z, [w1, w2])
Таким образом, оптимизатор вычислит градиент и даст вам доступ к этим значениям. Затем вы можете удвоить их, возвести в квадрат, утроить их и т. Д., Что угодно. Что бы вы ни выбрали, вы можете добавить эти скорректированные градиенты в расчет потерь для шага обратного распространения и т. Д.
Я думаю, что самое важное, что нужно сказать в ответ на этот вопрос, - это то, что
GradientTape
это не диагностический инструмент. Это заблуждение.
GradientTape
представляет собой математический инструмент для автоматического дифференцирования (autodiff), который является основной функциональностью TensorFlow. Он не "отслеживает" автодифференциал, это ключевая часть выполнения автодиффа.
Как описывают другие ответы, он используется для записи ("ленты") последовательности операций, выполняемых на некотором вводе и создания некоторого вывода, чтобы вывод можно было дифференцировать по отношению к вводу (через автоматическое распространение обратного распространения / обратный режим) (чтобы затем выполнить оптимизацию градиентного спуска).