当每个时间步只有一个实例时,在递归神经网络 (RNN) 中进行批处理?

数据挖掘 神经网络 时间序列 rnn 预言 训练
2021-09-20 05:18:44

我已经搜索了互联网和书籍,但似乎所有东西都可以互换使用num_stepsbatch_size/或类似的术语,我无法掌握它们的具体用途,或者在谈论 RNN 时批次适合的地方(我了解它们与梯度下降的使用,也许我对 RNN 有误解,我需要在基本层面上直截了当——如果是这样,请这样做。

那么批处理在递归神经网络中应用在什么地方呢?在时间步内的实例级别或时间步本身的级别。

根据我目前的理解,输入模型的数据结构如下:

data = [
    "time_step_1": [
        "instance_1": [
            "feature_1": "some_value1",
            "feature_2": "some_value2",
            "feature_3": "some_value3",
            "feature_4": "some_value4"
        ],
    "time_step_2": [
        "instance_2_but_first_in_time_step_2": [
            "feature_1": "some_value1",
            "feature_2": "some_value2",
            "feature_3": "some_value3",
            "feature_4": "some_value4"
        ],
    "time_step_3": [
        "instance_3_but_first_in_time_step_3": [
            "feature_1": "some_value1",
            "feature_2": "some_value2",
            "feature_3": "some_value3",
            "feature_4": "some_value4"
        ],
    "time_step_4": [
        "instance_4_but_first_in_time_step_4": [
            "feature_1": "some_value1",
            "feature_2": "some_value2",
            "feature_3": "some_value3",
            "feature_4": "some_value4"
        ],
    "time_step_5": [
        "instance_5_but_first_in_time_step_5": [
            "feature_1": "some_value1",
            "feature_2": "some_value2",
            "feature_3": "some_value3",
            "feature_4": "some_value4"
        ],

    ]            
]

除了:许多人(和示例)每个时间步都有更多实例。

典型的训练循环如下所示:

for epoch in range(do_num_epochs):
    for time_step_count in range(len(data)):
        run(model, data[time_step_count])

也就是说,如果您在每个时间步(例如)有 10,000 个实例,那么批处理将允许更频繁地更新权重,而不必等待整个 10,000 个实例被处理。然后循环看起来像:

batch_size = len(data) // do_num_batches

for epoch in range(do_num_epochs):
    for time_step_count in range(len(data)):
        for batch_count in range(do_num_batches):
            batch_data = data[time_step_count][batch_count * batch_size : (batch_count + 1) * batch_size]
            run(model, batch_data)

但是,如果每个时间步只有一个数据实例,那么批量处理数据没有意义吗?

我制作了一个图表来尝试(也对我自己)解释流程和数据结构的样子:

数据结构

模型

我只是想了解批次在所有这些中的作用,它是如何适应的?

编辑/添加

在对该主题进行了更多研究之后,我相当确定批次是一种以块的形式输入序列并控制权重更新频率的方法。通过使用批次,权重在批次级别更新,从而使您可以将时间序列分组在一起。我在下面说明了我认为正确的内容,在下面的示例中有:

  • 4个实例,
  • 每个都有 5 个功能
  • 跨越 30 个时间步长

在此处输入图像描述

在第一个示例(小批量)中,有 3 个批次,batch_size在该示例中 = 10,权重将更新 3 次,每批次结束后更新一次。

在第二个示例中,有效=1 的在线batch_size学习,在该示例中,权重将更新 30 次,每次更新一次time_series

在最后一个示例(批量学习)中,一次处理整个数据集,权重仅在“批量”结束时更新一次 (1)。

在这些示例中的每一个中,整个数据集都将运行多次,这些循环中的每一个都是一个epoch

1个回答

您的编辑不正确。从 keras 文档中,您实际上可以了解时间步长和批次之间的区别。我举你的例子:

对于第一个例子。您有 4 个实例、样本或序列。每个序列的长度为 30,现在您实际上需要 3 个批次,每个批次由 4 个实例、样本或子序列组成,长度为 10(时间步长)。您的批量大小不是 10 而是 4,时间步长不会影响批量大小。每个批次的子序列可以具有您想要的长度,这不会改变批次大小为 4 的事实。

对于第二个例子是一样的。在线学习并不是说每个子序列的时间步数是1,你可以取你想要的时间步数,但是当你更新网络的参数时你应该考虑当时只考虑1个子序列。

您实际上可以从这里确认这一点:

http://philipperemy.github.io/keras-stateful-lstm/

在这部分:

“换句话说,每当你训练或测试你的 LSTM 时,你首先必须建立你的输入矩阵 X,形状为 nb_samples、时间步长、input_dim,其中你的批量大小除以 nb_samples。例如,如果 nb_samples=1024 和 batch_size=64,这意味着您的模型将接收 64 个样本块,计算每个输出(无论每个样本的时间步数是多少),平均梯度并传播它以更新参数向量。”

所以时间步长不会影响批量大小。