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

Posted

技术标签:

【中文标题】使用元素研究 RNN for Torch Lua 批处理可变长度序列【英文标题】:batch processing variable length sequences using element research RNN for Torch Lua 【发布时间】:2016-11-27 02:22:44 【问题描述】:

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

我想,我可以通过这个表述来表达清楚:

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

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

我还没有设计模型,因为我正在考虑一个合适的模型来支持批量训练。我想修改我的数据还是应该设计一个模型来修改这些数据?如果它在模型上,我该怎么做?

脚注:这个 LSTM 必须在每个训练示例之后忘记之前的序列。因为每个例子都是独立的。即,反向传播应该只在 a_single_example_length 个时间步长内完成。

【问题讨论】:

【参考方案1】:

您有一个可变长度序列的数据集,并且想要进行批处理。解决方案是将您的 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)。

【讨论】:

那么,我可以输入这样的序列吗? (将每一对视为单独的原始创建矩阵 [seqlen x batchsize] 注意:零不是序列的一部分,它们表示序列的终端)` 00 12 13 22 02 13 20 30 00` 我认为,这将是一个我正在谈论的这种情况下的批处理序列。

以上是关于使用元素研究 RNN for Torch Lua 批处理可变长度序列的主要内容,如果未能解决你的问题,请参考以下文章

Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)

Torch / Lua,如何选择数组或张量的子集?

错误:在编译时找不到 Lapack 库(zerobrane、lua、torch)

[Pytorch系列-51]:循环神经网络RNN - torch.nn.RNN类的参数详解与代码示例

如何使用批处理运行 RNN 模型,其中每行具有不同长度的文本?

在 Windows 10 上使用 Torch 运行 Lua(管理员权限有限)