编码器—解码器(seq2seq) 讨论区

http://zh.diveintodeeplearning.org/chapter_natural-language-processing/seq2seq.html

网页里面有些公式显示的latex源码 :see_no_evil:

会用beam search嘛?

现在fix了~

要不下节课讲讲?

那太感谢啦~

网页上decoder的GRU公式里面的y的下标是不是还没改呀?

改好了。

@astonzhang 请教您一个问题,我最近用mxnet想做一个图像分类的问题,我设计的网络里用到了cnn和lstm,cnn用做提取特征,但是我在设计网络的时候发现我没有办法对我的中间的数据的shape做改变,以前用keras 可以直接拿到中间变量做shape改变,请问使用mxnet有什么好的解决方法呢?或者我的方法不对么,谢谢!

第十九课会对encoder的输出变量做一个转换,然后作为decoder的输入。也就是说,把encoder、decoder和转换定义成三个网络,一起训练。可能会和你的问题相关(转换对应你的reshape)。

:sob: 终于出了。。及时雨。。感动。。

具体实现是不将argmax换成argsort,然后取前n个?

image
课程中李老师使用的 batch_size 为1,一条一条的训练,这样速度是否会很慢?在语料很大的时候,如果把batch_size设置为大于1,那又如何在解码器中去控制batch里每条语句的解码长度不同呢?

这里有个例子

19课Video里 image
感觉有点问题
if y[0][i] = EOS: break 如果这样的话 output的timestep的个数 就必定小于intput的timestep的个数了吧
感觉课件里 写的是对的
for i in range(max_seq_len):
decoder_output, decoder_state = decoder(
decoder_input, decoder_state, encoder_outputs)
pred_i = int(decoder_output.argmax(axis=1).asnumpy())
# 当任一时刻的输出为EOS字符时,输出序列即完成。
if pred_i == output_vocab.token_to_idx[EOS]:
break
else:
output_tokens.append(output_vocab.idx_to_token[pred_i])
decoder_input = nd.array([pred_i], ctx=ctx)

还有个问题for i in range(max_seq_len): 限定了最大输出词量不会大于max_seq_len了 所以max_seq_len是不是一般设置的大一点

另外可不可以在encoder中不设max_seq_len, 而是用一个for loop把GRUcell串联起来读词直到读到EOS
这样是不是就实现了不定长输入 而没有max_seq_len的限制

1赞

对。在遍历输入word时,训练(train函数)我们用for i in range(max_seq_len)是可以的,因为训练句子长度不大于max_seq_len。测试(translate函数)应该允许输出更长的句子,所以用for i in range(更大一点的数)更好。如果用while True,在训练初期translate可能会无限输出序列无法停止。你可以试试

encoder-decoder(无attention)的方式与传统的RNN相比,有什么优点呢?
课程中说可以解决不定长输出问题,但是如果在RNN训练的时候也加入EOS这样的label不也可以实现不定长输出吗?就像创作歌词那样,可以无限输出,然后遇到EOS结束。

RNN中,训练样本是定长输入到定长输出。
encoder-decoder中,训练样本是不定长输入到不定长输出。

encoder-decoder中,训练样本不是也需要加PAD来保证长度一致吗?