我目前正在使用tensorflow进行机器学习项目。我的目标是使用带有注意机制的序列到序列模型检测源序列中的错误。使用4层LSTM单元同时对编码器和解码器(顶部带有Luong注意机制)获得了很好的结果。
现在,我决定对不同的体系结构进行一些实验。对于一个实验,我想测试GRU和原始RNN单元的性能。所以我换了几行:
encoder_layers = [tf.nn.rnn_cell.LSTMCell(FLAGS.num_units) for i in range(FLAGS.num_layers)]
decoder_layers = [tf.nn.rnn_cell.LSTMCell(FLAGS.num_units) for i in range(FLAGS.num_layers)]
针对:
encoder_layers = [tf.nn.rnn_cell.GRUCell(FLAGS.num_units) for i in range(FLAGS.num_layers)]
decoder_layers = [tf.nn.rnn_cell.GRUCell(FLAGS.num_units) for i in range(FLAGS.num_layers)]
resp:
encoder_layers = [tf.nn.rnn_cell.BasicRNNCell(FLAGS.num_units) for i in range(FLAGS.num_layers)]
decoder_layers = [tf.nn.rnn_cell.BasicRNNCell(FLAGS.num_units) for i in range(FLAGS.num_layers)]
不出所料,该模型使用香草RNN细胞变得更糟。但是,我惊讶地发现GRU单元也无法解决该任务。我的LSTM模型是在大约4000次迭代之后学会的,主要重复输入序列。 GRU无法得知这一点,并且经过30'000次迭代后,仍然输出训练中记忆中的序列片段。
有人知道为什么吗?显然,我不需要改进模型,因为LSTM单元已经可以很好地工作了,但是我仍然很好奇。从我所听到和阅读的所有内容来看,GRU的有效性应该与LSTM相似。
谢谢!