Я воспроизводлю оригинальную статью о сетях Элмана (Elman, 1990) - вместе с иорданскими сетями, известными как Простые рекуррентные сети (SRN). Насколько я понимаю, мой код правильно реализует прямое распространение, в то время как этап обучения не завершен. Я реализую сеть с использованием низкоуровневого API TensorFlow в Python.
Сеть Элмана - это искусственная нейронная сеть, состоящая из двух слоев, где скрытый слой копируется как «контекстный слой», который объединяется с входными данными при следующем запуске, распространяющем сеть. Первоначально контекстный слой инициализируется с активацией = 0,5 и имеет фиксированный вес 1,0.
У меня вопрос по расчету градиентов, при обратном распространении сети. В моем коде я использую 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