seq2seq 模型的预处理

Posted

技术标签:

【中文标题】seq2seq 模型的预处理【英文标题】:Preprocessing for seq2seq model 【发布时间】:2018-12-07 22:48:33 【问题描述】:

我正在尝试构建一个 seq2seq 模型,我尝试按照 Tensorflow 官方教程进行操作,但没有提到预处理步骤。我尝试在网上搜索,每个教程都是从模型开始的,没有预处理步骤信息。

我需要一些关于 seq2seq 中涉及的预处理步骤的信息:

如果我有这样的数据集:(使用 index2word 词汇编码后)

encoder [1, 2, 1, 3, 4] decoder [2, 3, 4]
encoder [2, 3, 4, 1] decoder [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65]
encoder [4, 5, 3, 11, 23, 1, 33, 44, 1, 3] decoder [4, 2, 3, 5]
encoder [44, 55] decoder [5, 6, 3, 2, 4, 22, 42, 11, 34]
encoder [1] decoder [55, 6, 3, 2, 4, 5, 6, 7, 7]
encoder [4, 2, 3, 4, 5] decoder [6, 5, 3, 5, 6, 7, 8, 2, 4, 5]
encoder [44, 2, 1, 22, 5, 3, 2] decoder [6, 5, 3, 4, 5, 6, 7]
encoder [55, 3, 1, 5, 1] decoder [5, 3, 2, 3, 4, 5]
encoder [14] decoder [5, 6, 7]

如果我将 5 作为批量大小,那么第一批:

encoder [1, 2, 1, 3, 4] decoder [2, 3, 4]
encoder [2, 3, 4, 1] decoder [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65]
encoder [4, 5, 3, 11, 23, 1, 33, 44, 1, 3] decoder [4, 2, 3, 5]
encoder [44, 55] decoder [5, 6, 3, 2, 4, 22, 42, 11, 34]
encoder [1] decoder [55, 6, 3, 2, 4, 5, 6, 7, 7]

现在,在阅读了许多文章后,我发现有四个特殊标记必须用于编码数据:

<PAD>:在训练期间,我们需要将我们的示例提供给 分批联网。

<EOS>:这也是批处理的另一个必要性,但更多关于 解码器端。它允许我们告诉解码器一个句子在哪里 结束,它允许解码器在它的 输出也是如此。

<UNK>: 用 . 替换未知数。

<GO>: 这是解码器第一个时间步的输入,让 解码器知道何时开始生成输出。

现在,如果我以我的批处理示例为例,那么我在填充后有问题:

编码器批次应该与解码器批次大小相同吗?

如果我的填充编码器数据批次看起来像:

encoder_input=[[1, 2, 1, 3, 4],
[2, 3, 4, 1],
[4, 5, 3, 11, 23, 1, 33, 44, 1, 3],
[44, 55],
[1]]

#after padding ( max time stamp is 10 )

encoder_padded=[[1, 2, 1, 3, 4, 0, 0, 0, 0, 0],
                [2, 3, 4, 1, 0, 0, 0, 0, 0, 0],
                [4, 5, 3, 11, 23, 1, 33, 44, 1, 3],
                [44, 55, 0, 0, 0, 0, 0, 0, 0, 0],
                [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

现在我应该将我的解码器序列长度填充到相同的大小吗? (最大 10 ?)或者我应该像这样使用解码器最大序列(最大 12)填充:

decoder_input=[[2, 3, 4],
               [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65],
               [4, 2, 3, 5],
               [5, 6, 3, 2, 4, 22, 42, 11, 34],
               [55, 6, 3, 2, 4, 5, 6, 7, 7]]

#after padding ( decoder batch max length is 12)

decoder_padded=[[2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
               [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65],
               [4, 2, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0],
               [5, 6, 3, 2, 4, 22, 42, 11, 0, 0, 0, 0],
               [55, 6, 3, 2, 4, 5, 6, 7, 7, 0, 0, 0]]

以及我最后的预处理数据应该是什么样子:

encoder_input  = ['hello','how','are','you','<PAD>','<PAD>','<PAD'>]

decoder_output = ['<GO>','i','am','fine','<EOS>','<PAD>','<PAD>']   

这是正确的格式吗?

【问题讨论】:

【参考方案1】:

我希望这是有用的。

编码器批次应该与解码器批次大小相同吗?

不,解码器计算遵循编码器,因此各自的数据将在不同的时间馈送到网络。您展示的示例是正确的。

在上一个示例中,您提到的decoder_output 应该是decoder_input。对于那对输入,您应该拥有的目标标签:

encoder_input  = ['hello','how','are','you','<PAD>','<PAD>','<PAD'>]
decoder_input  = ['<GO>','i','am','fine','<EOS>','<PAD>','<PAD>'] 
target_label   = ['i','am','fine','<EOS>','<PAD>','<PAD>'] 

【讨论】:

以上是关于seq2seq 模型的预处理的主要内容,如果未能解决你的问题,请参考以下文章

自然语言处理之seq2seq模型

吴裕雄--天生自然 pythonTensorFlow自然语言处理:Seq2Seq模型--训练

RNN经典案例使用seq2seq模型架构实现英译法任务

RNN经典案例使用seq2seq模型架构实现英译法任务

基于双语数据集搭建seq2seq模型

使用大数据集在 Google Colab TPU 上训练 seq2seq 模型 - Keras