我正在Tensorflow平台中学习基于LSTM的seq2seq模型。我可以很好地在给定的简单seq2seq示例上训练模型。
然而,在我必须从给定序列中同时学习两个序列的情况下(例如:同时从当前序列中学习上一个序列和下一个序列),我们如何做到这一点,即计算两个序列中的组合误差,并对两个序列反传相同的误差?
以下是我正在使用的LSTM代码片段(主要取自ptb示例:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/rnn/ptb/ptb_word_lm.py#L132):
output = tf.reshape(tf.concat(1, outputs), [-1, size])
softmax_w = tf.get_variable("softmax_w", [size, word_vocab_size])
softmax_b = tf.get_variable("softmax_b", [word_vocab_size])
logits = tf.matmul(output, softmax_w) + softmax_b
loss = tf.nn.seq2seq.sequence_loss_by_example(
[logits],
[tf.reshape(self._targets, [-1])],
[weights])
self._cost = cost = tf.reduce_sum(loss) / batch_size
self._final_state = state
self._lr = tf.Variable(0.0, trainable=False)
tvars = tf.trainable_variables()
grads, _ = tf.clip_by_global_norm(tf.gradients(cost, tvars),config.max_grad_norm)
optimizer = tf.train.GradientDescentOptimizer(self.lr)
self._train_op = optimizer.apply_gradients(zip(grads, tvars))
在我看来,您想要一个编码器和多个解码器(例如2个,用于2个输出序列),对吗?seq2seq中正好有一个2many用于此用例。
至于损失,我认为你可以把两个序列的损失相加。或者你想以某种方式加重它们的重量?我认为把它们相加,然后计算梯度和其他一切是个好主意,就好像增加的损失是唯一的损失一样。