Deep learning LSTM是否可以在每个样本中使用不同数量的特征进行回归训练?

Deep learning LSTM是否可以在每个样本中使用不同数量的特征进行回归训练?,deep-learning,lstm,rnn,Deep Learning,Lstm,Rnn,在我的问题中,每个训练和测试样本都有不同数量的特性。例如,培训样本如下所示: 样本1中有四个特征:x1、x2、x3、x4、y1 样本2中有两个特性:x6、x3和y2 样本3中有三个特性:x8、x1、x5、y3 x是特征,y是目标。 这些样本能否训练LSTM回归并进行预测?是。LSTM层的输入大小应该是所有输入大小中最大的。以及用空值替换的备用单元格: 最大(输入大小)=5 输入数组=[x1,x2,x3] 你可以这样变换它: [x1,x2,x3]->[x1,x2,x3,0,0] 这种方法相当普遍,

在我的问题中,每个训练和测试样本都有不同数量的特性。例如,培训样本如下所示:

样本1中有四个特征:x1、x2、x3、x4、y1

样本2中有两个特性:x6、x3和y2

样本3中有三个特性:x8、x1、x5、y3

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

是。LSTM层的输入大小应该是所有输入大小中最大的。以及用空值替换的备用单元格:

最大(输入大小)=5

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

你可以这样变换它: [x1,x2,x3]->[x1,x2,x3,0,0]


这种方法相当普遍,不会对预测精度产生任何负面影响。

是的。LSTM层的输入大小应该是所有输入大小中最大的。以及用空值替换的备用单元格:

最大(输入大小)=5

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

你可以这样变换它: [x1,x2,x3]->[x1,x2,x3,0,0]


这种方法非常常见,不会对预测精度产生任何负面影响。

考虑以下场景:您有一个(缩小)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
人们通常会做的是将样本序列填充到小批量中最长的序列(不一定是整个最长序列的长度)将序列一个接一个地连接在一起,得到一个很好的矩阵,可以输入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等(也就是说,如果你将平均值与填充值一起计算,你的指标也将是错误的)

为了节省更多的计算量,有时人们构造批处理,使批处理中的序列具有大致相同的长度(如果数据集允许,甚至完全相同)。但这可能会带来一些不希望出现的效果,因为长序列和短序列决不在同一批处理中


总之,padding是一个强大的工具,如果你注意的话,它可以让你用批处理和动态序列长度非常有效地运行RNN。

考虑以下场景:你有一个(小的)6个长度样本序列的数据集:
{1,2,3,4,5,6}
,你想训练你的LSTM(或者更一般地说,一个RNN)对于大小为3的minibatch(您在每个训练步骤一次提供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
人们通常会做的是将样本序列填充到小批量中最长的序列(不一定是整个最长序列的长度)将序列一个接一个地连接在一起,得到一个很好的矩阵,可以输入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
,可能会在调试和验证期间帮助您

重要的是,当使用这样的填充时,要使模型正常工作,还需要做其他一些事情。如果使用反向传播,则应将填充的结果从输出计算和梯度计算中排除(深度学习框架将为您做到这一点)。如果您运行的是监督模型,则标签通常也应填充,并且在损失计算中不应考虑填充。例如,您计算整个批次的交叉熵(带填充).为了计算正确的损失,对应于填充的伪交叉熵值应该用零屏蔽,然后eac