[英]tensorflow ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients
[英]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_1
、 w_x
、 w_c
和a_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.