我有一些数据以非常高的速率(大约每秒数百次)采样。对于任何给定实例,这会导致平均序列长度很大(约 90,000 个样本)。整个序列有一个标签。我正在尝试使用 LSTM 神经网络将新序列分类为这些标签之一(多类分类)。
然而,使用具有如此大序列长度的 LSTM 会导致网络变得相当大。
有哪些方法可以有效地“分块”这些序列,以便我可以减少神经网络的序列长度,同时仍然保留在整个实例中捕获的信息?
当序列很长时,RNN 可能会面临以下问题:梯度消失和梯度爆炸.
有方法。首先你需要明白的是为什么我们需要尝试上面的方法?这是因为随时间反向传播由于上述问题,可能会变得非常困难。
是的,LSTM 的引入大大减少了这个问题,但当它太长时,你仍然可能会遇到这样的问题。
所以一种方法是裁剪渐变。这意味着您为梯度设置了上限。参考这个堆栈溢出问题 https://stackoverflow.com/questions/36498127/how-to-effectively-apply-gradient-clipping-in-tensor-flow
那么你问的这个问题
有哪些方法可以有效地“分块”这些序列?
一种方法是随时间截断的反向传播。有多种方法可以实现这一点截断的BPTT。简单的想法是
- 仅计算给定时间步数的梯度
这意味着,如果您的序列有 200 个时间步长,并且只给出 10 个时间步长,那么它将仅计算 10 个时间步长的梯度,然后将该 10 个时间步长中存储的内存值传递到下一个序列(作为初始细胞状态)。这个方法是什么使用tensorflow计算截断的BPTT。 https://www.tensorflow.org/tutorials/recurrent#truncated-backpropagation
2.获取完整序列并且仅反向传播选定时间块中某些给定时间步长的梯度。这是一个持续的方式
这是我找到的最好的文章,解释了这些截断的 BPTT 方法。好简单。参考这个截断反向传播的风格 https://r2rt.com/styles-of-truncated-backpropagation.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)