批量处理可变长度序列使用元素研究RNN for Torch Lua

时间:2016-07-23 06:47:45

标签: lua torch lstm recurrent-neural-network

我正在尝试使用语音音译数据训练元素研究RNN模块中的LSTM模型。我将训练数据作为X和Y的单独表格.X和Y都包含每个训练示例作为张量,即X中的张量包含序列中每个字符的ASCII值,Y中的张量包含结果序列的ASCII值。我已经以一种形式创建了数据,对于X和Y的特定示例,它完美地排列并用零填充进行训练。所以,我可以一次用一个例子训练LSTM。但是,问题是,我不知道如何进行批量训练,因为每个示例张量都有不同的长度。

我想,我可以通过这种表述来说清楚:

X{                                      Y{ 
[EEEEE00000]                            [00000MMMMM]
[EEE0000]                               [000MMMM]
[EEEEEEEE0000000000]                    [00000000MMMMMMMMMM]
.                                       .
.                                       .
.                                       .
}                                       }

其中,EEEE ..表示输入序列,MMMM ...表示输出序列..

我还没有设计模型,因为我正在思考一个能够支持批量训练的合适模型。我是想修改数据还是应该以修改数据的方式设计模型?如果它的模型,我怎么能这样做?

脚注:此LSTM必须在每个训练示例后忘记先前的序列。因为每个例子都是独立的。即,backprop只能用于 a_single_example_length 时间步。

1 个答案:

答案 0 :(得分:0)

您有一个可变长度序列的数据集,并且您想要进行批处理。解决方案是将您的X和Y组织为seqlen x batchsize张量,其中每个独立序列由零(或零的张量)分隔:

0 0
1 2
1 2
2 3
0 0
2 3
2 3
1 2

在上面的例子中,我们有序列1-1-2,2-2-1,2-2-3和3-3-2,每个序列用零分隔。

使用rnn:maskZero()rnn可以检测到这些零,并在检测到时忘记先前的隐藏状态。这实际上意味着BPTT只会在序列的持续时间内反向传播(即零重置BPTT)。