我正在实现一个非常复杂的非顺序循环计算图,我对使用 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个样本)但我可能也错了 .

有任何见解赞赏!