谢谢你的问题。
问题 1
请参阅以下 seq2seq 原始论文。他们建议:
Note that the LSTM reads the input sentence in reverse, because doing so introduces many short term dependencies in the data that make the optimization problem much easier.
(摘要)
we found that reversing the order of the words in all source sentences (but
not target sentences) improved the LSTM’s performance markedly
https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf
我认为官方示例代码也将输入句子反转为上述论文。
问题2
但是然后你将潜在表示放入解码器中eys
。但是eys
是法语短语的连续表示
是的。这段代码是在训练时使用的,所以我们知道目标句子(黄金词)。
hx, cx, _ = self.the encoder(None, None, exs)
_, _, os = self.decoder(hx, cx, eys)
在测试时,您应该使用def translate(self, xs, max_length=100):
. 该方法可用于从源句预测句子xs
。
result = []
for i in range(max_length):
eys = self.embed_y(ys)
eys = F.split_axis(eys, batch, 0)
h, c, ys = self.decoder(h, c, eys)
cys = F.concat(ys, axis=0)
wy = self.W(cys)
ys = self.xp.argmax(wy.data, axis=1).astype('i')
result.append(ys)
对于每个循环,使用源句子向量和前一个单词预测一个单词ys
。
问题 3 问题 4
我认为这部分应该如下:(
ys_in = [F.concat([bos, y], axis=0) for y in ys]
句子开头)官方代码eos
用于两者和。
最后的问题
如果我不想翻译句子而是构建一个自动编码器来将短语映射到潜在空间,我该怎么办?
当你想构建一个自动编码器时,
- 删除此行
xs = [x[::-1] for x in xs]
- 使用
bos
而不是eos
在ys_in = [F.concat([eos, y], axis=0) for y in ys]
两者都可以使用eos
而不是bos
. 您只需删除xs = [x[::-1] for x in xs]
自动编码器的这一行。
如果你想使用bos
,你应该修改如下:
UNK = 0
EOS = 1
BOS = 2
47:eos = self.xp.array([EOS], 'i')
48: ys_in = [F.concat([eos, y], axis=0) for y in ys]
=>
bos = self.xp.array([BOS], 'i')
ys_in = [F.concat([bos, y], axis=0) for y in ys]
79: ys = self.xp.full(batch, EOS, 'i')
=>
ys = self.xp.full(batch, BOS, 'i')
def load_vocabulary(path):
with open(path) as f:
# +2 for UNK and EOS
word_ids = {line.strip(): i + 3 for i, line in enumerate(f)}
word_ids['<UNK>'] = 0
word_ids['<EOS>'] = 1
word_ids['<BOS>'] = 2
return word_ids
如果您还有其他问题,请再次问我。