答案是:取决于手头的问题。对于您的一步预测的情况 - 是的,您可以,但您不必这样做。但无论你是否这样做都会极大地影响学习。
批次与样本机制(“参见 AI”= 参见“附加信息”部分)
所有模型都将样本视为独立的例子;一批 32 个样品就像一次喂 1 个样品,32 次(有差异 - 参见 AI)。从模型的角度来看,数据被分为批次维度,batch_shape[0]
,以及特征尺寸,batch_shape[1:]
- 两人“别说话”。两者之间的唯一关系是通过梯度(参见 AI)。
重叠批次与无重叠批次
也许理解它的最好方法是信息-基于。我将从时间序列二元分类开始,然后将其与预测联系起来:假设您有 10 分钟的 EEG 记录,每个记录 240000 个时间步长。任务:癫痫发作还是非癫痫发作?
- 由于 240k 对于 RNN 来说太大了,我们使用 CNN 进行降维
- 我们可以选择使用“滑动窗口”——即一次提供一个子段;我们使用 54k
取10个样品,成型(240000, 1)
。怎么喂?
-
(10, 54000, 1)
,包括所有样本,切片为sample[0:54000]; sample[54000:108000]
...
-
(10, 54000, 1)
,包括所有样本,切片为sample[0:54000]; sample[1:54001]
...
以上两者你选哪一个?如果是 (2),那么您的神经网络永远不会将这 10 个样本的癫痫发作与非癫痫发作混淆。但它对任何其他样本也一无所知。即,它将严重过度拟合,因为信息它看到每次迭代几乎没有不同(1/54000 = 0.0019%) - 所以你基本上是在给它喂食同一批连续几次。现在假设(3):
-
(10, 54000, 1)
,包括所有样本,切片为sample[0:54000]; sample[24000:81000]
...
合理很多;现在我们的窗口有 50% 的重叠,而不是 99.998%。
预测:重叠不好?
如果您正在进行一步预测,信息格局现在会发生变化:
- 有可能,您的序列长度是从 240000 起的 faaar,因此任何类型的重叠都不会遭受“同一批次多次”的影响
- 预测与分类根本不同,因为您提供的每个子样本的标签(下一个时间步)都不同;分类对整个序列使用一个
这极大地改变了你的损失函数,以及最小化它的“良好实践”:
- 预测器必须对其稳健初始样本,特别是对于 LSTM - 因此我们通过滑动序列来训练每个这样的“开始”,如您所示
- 由于标签随时间步长不同,损失函数随时间步长变化很大,因此过度拟合的风险要小得多
我应该怎么办?
首先,请确保您理解整篇文章,因为这里没有什么是真正的“可选”。然后,这是关于重叠与不重叠的关键,每批次:
-
一个样本发生了偏移:模型学会更好地预测每个起始步骤的前一步 - 含义:(1) LSTM 对初始细胞状态的鲁棒性; (2) LSTM 在落后 X 步的情况下可以很好地预测任何领先的步数
-
许多样品,移入later batch:模型不太可能“记住”训练集和过度拟合
你的目标:平衡两者; 1相对于2的主要优势是:
- 2 可以通过制作模型来限制模型forget看到的样品
- 1 允许模型提取更好的质量通过检查样本的多个起点和终点(标签)并相应地平均梯度来分析特征
我应该在预测中使用(2)吗?
- 如果您的序列长度非常长,并且您可以负担得起“滑动窗口”,其长度约为 50%,也许可以,但这取决于数据的性质:信号(EEG)?是的。股票、天气?对此感到怀疑。
- 多对多预测;更常见的是(2),在大序列或较长序列中。
LSTM 有状态:实际上可能对您的问题完全无用。
当 LSTM 无法一次处理整个序列,因此它被“分割”时,或者当需要从反向传播获得不同的梯度时,则使用有状态。对于前者,其想法是 - LSTM 在评估后者时考虑前一个序列:
-
t0=seq[0:50]; t1=seq[50:100]
说得通;t0
逻辑上导致t1
-
seq[0:50] --> seq[1:51]
没有意义;t1
并不因果地源自t0
换句话说:不要在不同批次的状态中重叠。同一批次是可以的,同样,独立性 - 样品之间没有“状态”。
何时使用有状态:当 LSTM 在评估下一批时受益于考虑上一批时。这can包括一步预测,但前提是您无法一次提供整个序列:
- 期望:100 个时间步长。可以做:50个。所以我们设置
t0, t1
如上面的第一个项目符号所示。
-
Problem:以编程方式实现并不简单。您需要找到一种在不应用梯度的情况下向 LSTM 提供数据的方法 - 例如冻结重量或设置
lr = 0
.
LSTM 何时以及如何在有状态中“传递状态”?
-
When: only 批次间;样本是完全独立的
-
How:仅在 Keras 中批次样本到批次样本:
stateful=True
requires你指定batch_shape
代替input_shape
- 因为,Keras 构建batch_size
编译时 LSTM 的不同状态
根据上述,您cannot做这个:
# sampleNM = sample N at timestep(s) M
batch1 = [sample10, sample20, sample30, sample40]
batch2 = [sample21, sample41, sample11, sample31]
这意味着21
因果关系如下10
- 并且会破坏训练。相反,做:
batch1 = [sample10, sample20, sample30, sample40]
batch2 = [sample11, sample21, sample31, sample41]
批次与样品:附加信息
“批次”是一组样本 - 1 或更大(假设此答案始终为后者)
。迭代数据的三种方法:批量梯度下降(一次整个数据集)、随机 GD(一次一个样本)和小批量 GD(中间)。 (然而,在实践中,我们也将最后一个 SGD 称为 SGD,并且仅与 BGD 进行区分 - 对于此答案假设如此。)差异:
- SGD 实际上从未优化训练集的损失函数 - 只是其“近似值”;每个批次都是整个数据集的子集,计算的梯度仅与最小化损失有关该批次的。批量大小越大,其损失函数与训练集的损失函数就越相似。
- 以上可以扩展到拟合批次与样本:样本是批次的近似值,或者是数据集的较差近似值
- 首先拟合 16 个样本,然后再拟合 16 个样本not与一次安装 32 个相同 - 因为权重已更新中间,所以后半部分的模型输出将会改变
- 事实上,选择 SGD 而不是 BGD 的主要原因不是计算限制,而是这是优越的, 大多数时候。简单解释一下:BGD 更容易过度拟合,而 SGD 通过探索更多样化的损失空间,在测试数据上收敛到更好的解决方案。
奖金图: