Изучают ли оптимизаторы TensorFlow градиенты на графике с заданиями? - PullRequest
1 голос
/ 08 июля 2019

Я воспроизводлю оригинальную статью о сетях Элмана (Elman, 1990) - вместе с иорданскими сетями, известными как Простые рекуррентные сети (SRN). Насколько я понимаю, мой код правильно реализует прямое распространение, в то время как этап обучения не завершен. Я реализую сеть с использованием низкоуровневого API TensorFlow в Python.

Сеть Элмана - это искусственная нейронная сеть, состоящая из двух слоев, где скрытый слой копируется как «контекстный слой», который объединяется с входными данными при следующем запуске, распространяющем сеть. Первоначально контекстный слой инициализируется с активацией = 0,5 и имеет фиксированный вес 1,0.

enter image description here

У меня вопрос по расчету градиентов, при обратном распространении сети. В моем коде я использую tf.assign для обновления контекстных единиц активациями из скрытого слоя. Перед добавлением оператора присваивания на график TensorBoard показывает, что GradientDescentOptimizer будет изучать градиенты из всех переменных в графе. После того, как я включил это утверждение, градиенты не отображаются для переменных в узлах, идущих «до» назначения. Другими словами, я ожидал бы, что b_1, w_x, w_c и a_1 будут отображаться в списке градиентов, полученных оптимизатором, даже с заданием на графике.

Я считаю, что моя реализация для прямого распространения верна, потому что я сравнил окончательные значения для активаций, используя tf.assign, и значения из другой реализации, используя простые массивы Numpy. Значения равны.

Наконец: это поведение преднамеренное или я делаю что-то не так?

Вот ноутбук с реализацией сети, как я описал:

https://gist.github.com/Irio/d00b9661023923be7c963395483dfd73

Ссылки

Elman, J.L. (1990). Нахождение структуры во времени. Когнитивная наука, 14 (2), 179–211. Получено с https://crl.ucsd.edu/~elman/Papers/fsit.pdf

1 Ответ

1 голос
/ 08 июля 2019

Нет, операции присваивания не распространяют градиент обратно. Это специально, поскольку присвоение значения переменной не является дифференцируемой операцией. Однако вам, вероятно, нужен не градиент присвоения, а градиент нового значения переменной. Вы можете использовать этот градиент, только не используйте его в качестве результата операции присваивания. Например, вы можете сделать что-то вроде этого:

import tensorflow as tf

my_var = tf.Variable(var_intial_value, name="MyVar")
# Compute new value for the variable
new_my_var = ...
# Make the assignment operation a control dependency
with tf.control_dependencies([tf.assign(my_var, new_my_var)]):
    # Passing the value through identity here will ensure assignment is done
    # while keeping it differentiable
    new_my_var = tf.identity(new_my_var)
# Continue using the value

Это будет означать, что my_var не используется в обратном распространении и поэтому не будет обновляться оптимизатором. Однако, я полагаю, если вы присваиваете значения my_var самостоятельно, оптимизатор не должен обновлять их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...