LSTM 可以训练每个样本中具有不同数量特征的回归吗?
Can LSTM train for regression with different numbers of feature in each sample?
在我的问题中,每个训练和测试样本都有不同数量的特征。例如训练样本如下:
There are four features in sample1: x1, x2, x3, x4, y1
There are two features in sample2: x6, x3, y2
There are three features in sample3: x8, x1, x5, y3
x是特征,y是目标。
这些样本是否可以训练 LSTM 回归并进行预测?
是的。你的 LSTM 层的 input_size 应该是所有 input_size 中最大的。以及用空值替换的备用单元格:
最大值(input_size) = 5
输入数组 = [x1, x2, x3]
你这样转换它:
[x1, x2, x3] -> [x1, x2, x3, 0, 0]
这种方法很常见,对预测准确性没有任何负面影响。
考虑以下场景:您有一个包含 6 个长度样本序列的(小的)数据集:{ 1, 2, 3, 4, 5, 6}
并且您想要使用大小为 minibatch 的 LSTM(或更一般的 RNN)进行训练3(你在每个训练步骤一次输入 3 个序列),也就是说,你每个 epoch 有 2 个批次。
假设由于随机化,在第 1 步中,批次最终由长度为 {2, 1, 5}
:
的序列构成
batch 1
----------
2 | xx
1 | x
5 | xxxxx
并且,下一批长度为{6, 3, 4}
的序列:
batch 2
----------
6 | xxxxxx
3 | xxx
4 | xxxx
人们通常会做的是 pad 样本序列,直到 minibatch 中最长的序列 (不一定是最长的序列)并将序列连接在一起,一个在另一个之上,以获得一个可以输入 RNN 的漂亮矩阵。假设您的特征由实数组成,用零填充并非不合理:
batch 1
----------
2 | xx000
1 | x0000
5 | xxxxx
(batch * length = 3 * 5)
(sequence length 5)
batch 2
----------
6 | xxxxxx
3 | xxx000
4 | xxxx00
(batch * length = 3 * 6)
(sequence length 6)
这样,对于第一批,您的 RNN 只会 运行 达到必要的步数 (5) 以节省一些计算。对于第二批,它必须达到最长的一批 (6)。
填充值任意选择。它通常不会影响任何东西,除非你有错误。尝试一些伪造的值,例如 Inf
或 NaN
可能会在调试和验证期间帮助您。
重要的是,当像这样使用填充时,还需要做一些其他事情才能使模型正常工作。如果你正在使用反向传播,你应该从输出计算和梯度计算中排除填充的结果(深度学习框架会为你做这件事)。如果您正在 运行 监督模型,通常还应填充标签,并且不应在损失计算中考虑填充。例如,您计算整个批次的交叉熵(使用填充)。为了计算正确的损失,对应于填充的虚假交叉熵值应该用零屏蔽,然后每个序列应该独立求和并除以它的真实长度。也就是说,应该在不考虑填充的情况下执行平均(在我的例子中,由于零相对于加法的中性,这是有保证的)。同样的规则适用于回归损失和指标,如准确度、MAE 等(也就是说,如果你与填充一起平均,你的指标也将是错误的)。
为了节省更多的计算,有时人们会构建批次,使批次中的序列长度大致相同(如果数据集允许,甚至完全相同)。不过,这可能会带来一些不良影响,因为长序列和短序列永远不会在同一批中。
总而言之,填充是一个强大的工具,如果您细心的话,它可以让您 运行 RNN 非常有效地使用批处理和动态序列长度。
在我的问题中,每个训练和测试样本都有不同数量的特征。例如训练样本如下:
There are four features in sample1: x1, x2, x3, x4, y1
There are two features in sample2: x6, x3, y2
There are three features in sample3: x8, x1, x5, y3
x是特征,y是目标。 这些样本是否可以训练 LSTM 回归并进行预测?
是的。你的 LSTM 层的 input_size 应该是所有 input_size 中最大的。以及用空值替换的备用单元格:
最大值(input_size) = 5
输入数组 = [x1, x2, x3]
你这样转换它: [x1, x2, x3] -> [x1, x2, x3, 0, 0]
这种方法很常见,对预测准确性没有任何负面影响。
考虑以下场景:您有一个包含 6 个长度样本序列的(小的)数据集:{ 1, 2, 3, 4, 5, 6}
并且您想要使用大小为 minibatch 的 LSTM(或更一般的 RNN)进行训练3(你在每个训练步骤一次输入 3 个序列),也就是说,你每个 epoch 有 2 个批次。
假设由于随机化,在第 1 步中,批次最终由长度为 {2, 1, 5}
:
batch 1
----------
2 | xx
1 | x
5 | xxxxx
并且,下一批长度为{6, 3, 4}
的序列:
batch 2
----------
6 | xxxxxx
3 | xxx
4 | xxxx
人们通常会做的是 pad 样本序列,直到 minibatch 中最长的序列 (不一定是最长的序列)并将序列连接在一起,一个在另一个之上,以获得一个可以输入 RNN 的漂亮矩阵。假设您的特征由实数组成,用零填充并非不合理:
batch 1
----------
2 | xx000
1 | x0000
5 | xxxxx
(batch * length = 3 * 5)
(sequence length 5)
batch 2
----------
6 | xxxxxx
3 | xxx000
4 | xxxx00
(batch * length = 3 * 6)
(sequence length 6)
这样,对于第一批,您的 RNN 只会 运行 达到必要的步数 (5) 以节省一些计算。对于第二批,它必须达到最长的一批 (6)。
填充值任意选择。它通常不会影响任何东西,除非你有错误。尝试一些伪造的值,例如 Inf
或 NaN
可能会在调试和验证期间帮助您。
重要的是,当像这样使用填充时,还需要做一些其他事情才能使模型正常工作。如果你正在使用反向传播,你应该从输出计算和梯度计算中排除填充的结果(深度学习框架会为你做这件事)。如果您正在 运行 监督模型,通常还应填充标签,并且不应在损失计算中考虑填充。例如,您计算整个批次的交叉熵(使用填充)。为了计算正确的损失,对应于填充的虚假交叉熵值应该用零屏蔽,然后每个序列应该独立求和并除以它的真实长度。也就是说,应该在不考虑填充的情况下执行平均(在我的例子中,由于零相对于加法的中性,这是有保证的)。同样的规则适用于回归损失和指标,如准确度、MAE 等(也就是说,如果你与填充一起平均,你的指标也将是错误的)。
为了节省更多的计算,有时人们会构建批次,使批次中的序列长度大致相同(如果数据集允许,甚至完全相同)。不过,这可能会带来一些不良影响,因为长序列和短序列永远不会在同一批中。
总而言之,填充是一个强大的工具,如果您细心的话,它可以让您 运行 RNN 非常有效地使用批处理和动态序列长度。