我正在构建一个rnn并使用sequene_length参数提供批处理中序列的长度列表,并且批处理中的所有序列都填充到相同的长度。
但是,在进行反向提升时,是否可以屏蔽与填充步骤相对应的渐变,因此这些步骤对重量更新有贡献?我已经掩盖了这样的相应费用(其中batch_weights是0和1的向量,其中对应于填充步骤的元素是0')
loss = tf.mul(tf.nn.sparse_softmax_cross_entropy_with_logits(logits, tf.reshape(self._targets, [-1])), batch_weights)
self._cost = cost = tf.reduce_sum(loss) / tf.to_float(tf.reduce_sum(batch_weights))
问题是我不确定通过执行上述操作是否将填充步骤中的渐变归零?
答案 0 :(得分:5)
对于所有逐帧/前馈(非重复)操作,屏蔽损耗/成本就足够了。
对于所有序列/重复操作(例如dynamic_rnn
),总是有一个sequence_length
参数需要设置为相应的序列长度。然后不会有零填充步骤的渐变,或者换句话说,它将有0个贡献。