我一直在遵循这篇文章:https://discuss.pytorch.org/t/understanding-lstm-input/31110/3 ,如果我正确解释的话,每个小批量的形状应该是(100,100,5)。但在这种情况下,seq_len和batch_size有什么区别?此外,这是否意味着输入LSTM层的第一层应该有5个单元?
谢谢!
这是一个老问题,但由于它已经被浏览了80多次且没有回复,让我来试着回答一下。
在一个LSTM网络中用于预测序列。在自然语言处理(NLP)中,可以是一系列单词; 在经济学中,可以是一系列经济指标等等。
第一个参数是这些序列的长度。如果您的序列数据由句子组成,则“Tom has a black and ugly cat”是长度为7(seq_len)的序列,每个单词对应一个,也许第8个表示句子的结尾。
当然,你可能会反对“如果我的序列长度不同怎么办?”这是常见情况。
两种最常见的解决方案是:
使用空元素填充序列。例如,如果您拥有的最长句子有15个单词,则将上面的句子编码为“[Tom] [has] [a] [black] [and] [ugly] [cat] [EOS] [] [] [] [] [] [] []”,其中EOS表示句子结尾。突然之间,您的所有序列都变成了长度为15,这解决了您的问题。只要找到[EOS]标记,模型就会迅速学习到其后是无限序列的空标记[],并且该方法几乎不会消耗您的网络资源。
发送相同长度的小批量。例如,训练网络以所有具有2个单词的句子,然后是3个单词,然后是4个单词。当然,seq_len将在每个小批量中增加,并且每个小批量的大小将根据您的数据中有多少长度为N的序列而变化。
最佳效果的方法是将您的数据分成近似大小的小批量,通过近似长度进行分组,并仅添加必要的填充。例如,如果您将长度为6、7和8的句子一起小批量处理,则长度为8的序列将不需要填充,而长度为6的序列将仅需要填充2次。如果您有一个具有广泛变化长度序列的大型数据集,那么这是最好的方法。
选项1是最简单(也是最懒惰)的方法,适用于小数据集。
最后一件事......始终在结尾处填充您的数据,而不是在开头。
希望对你有所帮助。