我正在实现一个非常复杂的非顺序循环计算图,我对使用 RMSProp
批量执行梯度下降所花费的时间不满意 . 原因是反向计算应该是稀疏的,因为有一个输入变量,它确定每个时间步长使用了多大部分的计算图 . 关键代码如下:
g_t_ = g_t*c_prev[:,0,1] + tf.stop_gradient(g_t - g_t*c_prev[:,0,1])
A_t = roll_plan(A_prev) + write*g_t_
第一行只是在前向传递和后向传递中使用不同函数的技巧 . g_t
是我正在谈论的输入,它总是1或0 .
roll_plan(A_t)
是一个非常便宜的操作,它只是将矩阵向左移动一列,移除第一列并在末尾添加零 . 而 write
操作是一个非常复杂的子图的最后一个节点,因此这是所有计算的大部分发生的地方 .
但是, g_t
可能非常稀疏,因此只能在某些步骤中计算 write
但我怀疑即使 g_t
为零,tensorflow也会计算它 . 真的吗?有没有办法手动告诉tensorflow不需要计算 write
操作并在 g_t
的值上调整它?
此外,我使用 feed_dict
而不是队列,这可能带来明显的改善,但是,我不认为它是戏剧性的,因为在我的情况下批次非常小(每个样本有大约1000个值和小批量约100个样本)但我可能也错了 .
有任何见解赞赏!