sequence-to-sequence 模型的种类很多,每一种模型都可以使用不同的RNN单元,但是都必须以 encoder inputs 和decoder inputs作为参数。在tf.nn.seq2seq接口中有各种RNN encoder-decoder sequence-to-sequence模型,最基本的是这个样子:
outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell)
encoder_inputs 是一个tensors的列表,代表encoder的输入,例如上图的A,B,C。同样,decoder_inputs是代表decoder的tensors,例如上图的GO, W, X, Y, Z。
cell是类models.rnn.rnn_cell.RNNCell 的实例,决定了模型使用哪种cell,你可以用GRUCell 或者 LSTMCell。rnn_cell提供了wrappers建立多层cells,也可以 cell inputs 或者outputs添加dropout ,等等,具体可以参考RNN Tutorial 。
basic_rnn_seq2seq返回2个参数,outputs 和states。它们都是tensors列表,长度与decoder_inputs相同。outputs对应于每个时间步长中的解码器的输出,在上图中是W,X,Y,Z,EOS。states表示在每个时间步长的解码器的内部状态。
在sequence-to-sequence 模型的很多应用中,t时刻解码器的输出将反馈成为t+1时刻的输入。测试时,这就是通过解码构建序列的方法。另一方面,训练的时候,通常在每个时间步骤向解码器提供正确的输入,即使解码器之前犯了错误。 seq2seq.py中的函数使用feed_previous参数支持这两种模式。例如,以embedding RNN模型为例。
outputs, states = embedding_rnn_seq2seq(
encoder_inputs, decoder_inputs, cell,
num_encoder_symbols, num_decoder_symbols,
output_projection=None, feed_previous=False)
在embedding_rnn_seq2seq模型中,所有的输入ÿ