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

问题描述 投票:0回答:2

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

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

sample2中有两个特征:x6,x3,y2

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

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

deep-learning lstm rnn
2个回答
2
投票

考虑以下场景:你有一个(通过小方式)数据集的6个长度样本序列:{ 1, 2, 3, 4, 5, 6}你想要训练你的LSTM(或者更一般地说,RNN)与3号小批量(你一次喂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)。

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

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

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

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


1
投票

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

max(input_size)= 5

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.