繁体   English   中英

TensorFlow 优化器是否通过分配学习图中的梯度?

[英]Do TensorFlow optimizers learn gradients in a graph with assignments?

我正在复制 Elman 网络的原始论文(Elman,1990)——连同 Jordan 网络,称为简单循环网络(SRN)。 据我所知,我的代码正确地实现了前向传播,而学习阶段是不完整的。 我正在使用 TensorFlow 的低级 API 在 Python 中实现网络。

Elman 网络是一个由两层组成的人工神经网络,其中隐藏层被复制为“上下文层”,下次我们向前传播网络时,它会与输入连接。 最初,上下文层初始化为 activation = 0.5,并具有固定的权重 1.0。

在此处输入图片说明

我的问题是关于网络反向传播中的梯度计算。 在我的代码中,我使用tf.assign使用来自隐藏层的激活来更新上下文单元。 在向图中添加赋值运算符之前,TensorBoard 显示 GradientDescentOptimizer 将从图中的所有变量中学习梯度。 在我包含这个语句之后,梯度不会出现在分配“之前”的节点中的变量。 换句话说,我希望b_1w_xw_ca_1出现在优化器学习的梯度列表中,即使在图中分配。

我相信我的前向传播实现是正确的,因为我使用tf.assign比较了激活的最终值和来自另一个实现的值,使用普通的 Numpy 数组。 值是相等的。

最后:这种行为是故意的还是我做错了什么?

这是我描述的网络实现的笔记本:

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

参考

埃尔曼,JL (1990)。 及时发现结构。 认知科学,14(2),179-211。 取自https://crl.ucsd.edu/~elman/Papers/fsit.pdf

不,分配操作不会反向传播梯度。 这是故意的,因为为变量赋值不是可微分操作。 但是,您可能不想要赋值的梯度,而是想要变量新值的梯度。 您可以使用该渐变,只是不要将其用作赋值操作的输出。 例如,您可以执行以下操作:

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赋值,那么优化器不应更新它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM