在我的问题中,每个培训和测试样本都有不同的功能。例如,培训样本如下:
sample1中有四个特征:x1,x2,x3,x4,y1
sample2中有两个功能:x6,x3,y2
sample3中有三个功能:x8,x1,x5,y3
x是特征,y是目标。 这些样本可以训练LSTM回归并进行预测吗?
答案 0 :(得分:2)
考虑以下场景:您有6个长度为{ 1, 2, 3, 4, 5, 6}
的样本序列的(通向小)数据集,并且您希望使用大小为3的小批量训练您的LSTM(或更一般地,RNN)(你在每个训练步骤中一次喂3个序列),也就是说,你每个时期有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 样本序列,直到
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)。
填充值是任意选择的。它通常不应该影响任何东西,除非你有bug。尝试一些虚假值,例如Inf
或NaN
可能会在调试和验证过程中为您提供帮助。
重要的是,当使用这样的填充时,还有一些其他的事情可以使模型正常工作。如果使用反向传播,则应从输出计算和梯度计算中排除填充的结果(深度学习框架将为您执行此操作)。如果您正在运行受监督的模型,则通常还应对标签进行填充,并且不应考虑填充以进行损失计算。例如,您计算整个批次的交叉熵(使用填充)。为了计算正确的损失,对应于填充的伪交叉熵值应该用零掩码,然后每个序列应该独立求和并除以其实际长度。也就是说,应该在不考虑填充的情况下执行平均(在我的示例中,由于相对于加法的零的中性,这是保证的)。同样的规则也适用于回归损失和指标,如准确性,MAE等(也就是说,如果您与填充量一起平均,那么您的指标也会出错)。
为了节省更多的计算,有时人们构建批处理,使得批处理的序列具有大致相同的长度(如果数据集允许,则甚至完全相同)。这可能会引入一些不希望的效果,因为长序列和短序列永远不会在同一批次中。
总而言之,填充是一个功能强大的工具,如果您注意,它允许您通过批处理和动态序列长度非常有效地运行RNN。
答案 1 :(得分:1)
是。在所有input_sizes中,LSTM层的input_size应该是最大的。并使用空值替换备用单元格:
max(input_size)= 5
输入数组= [x1,x2,x3]
你用这种方式改变它: [x1,x2,x3] - > [x1,x2,x3,0,0]
这种方法相当普遍,并未对预测准确性产生任何负面影响。