1

我正在 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))
4

1 回答 1

0

在我看来,您希望拥有一个编码器和多个解码器(例如 2 个,用于 2 个输出序列),对吗?seq2seq 中有one2many正是针对这个用例。

至于损失,我认为您可以将两个序列的损失相加。或者你想以某种方式称重它们?我认为将它们相加是个好主意,然后计算梯度和其他一切,就好像添加的损失是唯一的损失一样。

于 2016-08-02T20:19:17.133 回答