使用元素研究 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)
错误:在编译时找不到 Lapack 库(zerobrane、lua、torch)
[Pytorch系列-51]:循环神经网络RNN - torch.nn.RNN类的参数详解与代码示例