Seq2Seq 对话仅在几个 epoch 后预测最常见的单词,例如“you”

人工智能 神经网络 自然语言处理 张量流 循环神经网络 长短期记忆
2021-10-23 02:04:29

我正在 OpenSubtitles 对话框 - Cornell-Movie-Dialogs-Corpus上训练 Seq2Seq 模型。

我的工作基于以下论文(但目前我还没有实现 Attention):

我收到的loss值相当高,并且~6.4在 3 个 epoch 后变化很大。该模型会预测最常见的单词以及有时其他不重要的单词(但 99.99% 只是“你”):

  • 我已经尝试了 128 - 2048 个隐藏单元,每个encoder和1 或 2 或 3 个 LSTM 层decoder结果或多或少是相同的。

SEQ1:是的,伙计,这意味着爱尊重社区和美元太包unk end

SEQ2:但是你是怎么得到 unk 82 结尾的

预测:促进第16次仪表板是你的你,你在你留下你的号码你借你在你借些你祝福你,你留下句句句键你是你借你在你借说你

我在这里使用预测,意思是 - 在greedy收到前 3 个小批量元素的所有值之后(这里我只展示第一个元素)。为了方便 -并且也打印 - 了解呈现给模型的实际对话框。logitargmax(..)SEQ1SEQ2

我的架构的伪代码如下所示(我使用的是 Tensorflow 1.5):

seq1 = tf.placeholder(...)
seq2 = tf.placeholder(...)

embeddings = tf.Variable(tf.random_uniform([vocab_size, 100],-1,1))

seq1_emb = tf.nn.embedding_lookup(embeddings, seq1)
seq2_emb = tf.nn.embedding_lookup(embeddings, seq1)

encoder_out, state1 = tf.nn.static_rnn(BasicLSTMCell(), seq1_emb)
decoder_out, state2 = tf.nn.static_rnn(BasicLSTMCell(), seq2_emb,
                                                        initial_state=state_1)
logit = Dense(decoder_out, use_bias=False)

crossent = tf.nn.saparse_softmax_cross_entropy_with_logits(logits=logit, 
                                                         labels=target)
crossent = mask_padded_zeros(crossent)
loss = tf.reduce_sum(crossent) / number_of_words_in_batch

train = tf.train.AdamOptimizer(learning_rate=0.00002).minimize(loss) 

我也想知道我是否顺利state1通过decoder,通常看起来像这样:

# reshape in pseudocode: state1 = state[1:]
new_state1 = []
for lstm in state1:
    new_lstm = []
    for gate in lstm:
        new_lstm.append(gate[1:])
    new_state1.append(tuple(new_lstm))
state1 = tuple(new_state1)
  • encoder我应该在和的状态之间使用一些投影层decoder吗?

因此,如果seq1有 32 个单词,seq2则有 31 个(因为我们不会在最后一个单词之后预测任何内容,即 tag <END>)。

1个回答

回答我自己的问题 - 这是因为两件事:

  • 批次数量太少- 模型刚刚开始获得有关语言对话的统计知识。我需要训练它更长的时间。

  • 我过早地屏蔽了序列(错误地删除了 <END> 标签) - 因为在每个句子上最后一个世界只是 <END> 标签 - 我在所有训练示例中都删除了它,这阻止了 Model 了解它是什么意思“结束句子“。

最后一个条件可能会进一步导致这种奇怪的模式,因为如果模型不知道要输入什么单词(并且由于缺少 < END > 标签),它必须填充每个句子直到 max_sequence_len 结束。

因此模型以循环方式输入- 最常见的单词之一(目标句子没有信号,因为它只是结束了)。