我有一个基于 LSTM 的网络,它输入一个 n 大小的长度序列(nx 300)并输出下一个单步(1 x 300)。
“原始”数据由几千个可变长度的半处理序列组成,其中每个步骤(显然)是 1 x 300。因此 X 是 (nx 300)。
我从这个半处理的原始序列生成训练和测试数据的方式是:
- 删除所有短于 K=9 的原始序列
- 将步幅为 1 且长度 K=9 的滑动窗口应用于保留的每个原始序列
- 打乱生成的数据
- 单独的训练/开发测试/测试数据
现在所有的训练/测试数据都是 [9 x 300]而 Y 是 [1 x 300]
生成的网络在 epoch 10 左右开始过度拟合,导致我达到1。这本身不是问题,因为结果质量足够好。
如果我尝试短至 6 的序列(如在 6 x 300 中,在第一阶段被丢弃)它在 y 中为我们提供了足够的信息。
因此,问题是关于良好实践和改进网络的。
从技术上讲,我正在使用 Keras 并使用 Google Cloud ML 来执行超参数搜索。
问题是:
我应该坚持使用滑动窗口生成数据,因为它工作正常吗?
如果滑动窗口,k=9 是最好的猜测,我是否应该超参数化这个数字 K 并考虑它来搜索最小损失?我害怕这样做,因为超参数通常会影响网络本身,而不是训练数据集,但请注意 K 定义了数据集长度,我是否会通过超参数化来产生不希望的偏差?
如果滑动窗口,我应该用 y=[x2, x3,...,x9, x10] 生成 y 形 [9x300],而不是当前的 y 代?如果我尝试两种输出结构并选择降低开发测试中损失的一种,我会检查验证集吗?
如果没有滑动窗口,我应该对每个原始时间序列输入一个序列进行训练吗?并使用注意力或双向lstm?2
改组生成带有改组的部分句子的批次,而不是来自相同原始序列的批次。但由于洗牌是在分离数据进行训练和测试之前完成的,所以我似乎不是以最好的方式(甚至是正确的方式)。我是否应该首先将原始长句子分成训练/每个测试阶段,然后用滑动窗口(如果适用)打破它们?
参考: