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