LSTM可以训练每个样本中具有不同数量特征的回归吗?

时间:2017-11-03 02:55:23

标签: deep-learning lstm rnn

在我的问题中,每个培训和测试样本都有不同的功能。例如,培训样本如下:

  

sample1中有四个特征:x1,x2,x3,x4,y1

     

sample2中有两个功能:x6,x3,y2

     

sample3中有三个功能:x8,x1,x5,y3

x是特征,y是目标。 这些样本可以训练LSTM回归并进行预测吗?

2 个答案:

答案 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 样本序列,直到最长序列(不一定是整个最长序列的长度)并连接序列在一起,一个在另一个上面,以获得可以馈入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)。

填充值是任意选择的。它通常不应该影响任何东西,除非你有bug。尝试一些虚假值,例如InfNaN可能会在调试和验证过程中为您提供帮助。

重要的是,当使用这样的填充时,还有一些其他的事情可以使模型正常工作。如果使用反向传播,则应从输出计算和梯度计算中排除填充的结果(深度学习框架将为您执行此操作)。如果您正在运行受监督的模型,则通常还应对标签进行填充,并且不应考虑填充以进行损失计算。例如,您计算整个批次的交叉熵(使用填充)。为了计算正确的损失,对应于填充的伪交叉熵值应该用零掩码,然后每个序列应该独立求和并除以其实际长度。也就是说,应该在不考虑填充的情况下执行平均(在我的示例中,由于相对于加法的零的中性,这是保证的)。同样的规则也适用于回归损失和指标,如准确性,MAE等(也就是说,如果您与填充量一起平均,那么您的指标也会出错)。

为了节省更多的计算,有时人们构建批处理,使得批处理的序列具有大致相同的长度(如果数据集允许,则甚至完全相同)。这可能会引入一些不希望的效果,因为长序列和短序列永远不会在同一批次中。

总而言之,填充是一个功能强大的工具,如果您注意,它允许您通过批处理和动态序列长度非常有效地运行RNN。

答案 1 :(得分:1)

是。在所有input_sizes中,LSTM层的input_size应该是最大的。并使用空值替换备用单元格:

max(input_size)= 5

输入数组= [x1,x2,x3]

你用这种方式改变它: [x1,x2,x3] - > [x1,x2,x3,0,0]

这种方法相当普遍,并未对预测准确性产生任何负面影响。