2016-03-01 163 views
5

我正在构建一个rnn并使用sequene_length参数为批次中的序列提供长度列表,并且批次中的所有序列填充为相同长度。可变长度填充和填充填充梯度

但是,在执行反向传播时,是否可以屏蔽与填充步骤相对应的梯度,因此这些步骤对权重更新的贡献为0?我已经掩盖了他们这样相应的费用(其中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)) 

问题是我不知道的是否将填充步骤中的渐变归零或不归零?

回答

2

对于所有framewise /前馈(非经常性)操作,屏蔽损失/成本就足够了。

对于所有的序列/循环操作(例如dynamic_rnn),总是有一个sequence_length参数,您需要将其设置为相应的序列长度。那么不会是零填充步骤的梯度,或者换句话说,它将有0个贡献。