0

亲爱的chainer社区,

我无法抗拒官方示例NStepLSTM中的逻辑用法(英文到法文翻译)。seq2seq

  1. def __call__(self, xs, ys): xs = [x[::-1] for x in xs] #Reverse x据我所知xs,这是一个英文短语,ys也是一个法语短语。你为什么把英文短语倒过来?

  2. 你如何训练网络?您将xs和嵌入ys到连续空间中,然后向编码器输入,exs以获得英语短语的潜在表示。但是然后你将潜在表示放入解码器中eys。但是eys是法语短语的连续表示,在测试阶段解码器无法知道生成的法语短语,可以吗?你如何应用你的网络?

    hx, cx, _ = self.the encoder(None, None, exs) _, _, os = self.decoder(hx, cx, eys)

  3. ys_in = [F.concat([eos, y], axis=0) for y in ys]为什么我们把它放在end of sequence开头?

  4. ys = self.xp.full(batch, EOS, 'i')def translate,我们将数组放入end of sequence解码器,为什么?

如果我不想翻译句子而是构建一个自动编码器来将短语映射到潜在空间,我该怎么办?

4

1 回答 1

1

谢谢你的问题。

问题 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用于两者和。

最后的问题

如果我不想翻译句子而是构建一个自动编码器来将短语映射到潜在空间,我该怎么办?

当你想构建一个自动编码器时,

  1. 删除此行xs = [x[::-1] for x in xs]
  2. 使用bos而不是eosys_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

如果您还有其他问题,请再次问我。

于 2017-11-22T07:23:33.737 回答