对于RNN、LSTM等序列模型的数据集构建的一些理解

循环神经网络的特点就是能够使用序列的特征来处理一些位置顺序有意义的数据,例如“我吃青菜”和“青菜吃我”,数据的元素相同,但是位置不同,两句话的含义也截然不同。

例如abcdefg是一个序列数据,假设我们这里的任务是文本生成,即给定文本数据,训练出能够通过一个序列预测出下一个字符的模型。那么数据集该如何构建呢。

滑动窗口

滑动窗口(或者seq_len、时间步长等等应该一个意思吧),能滑动的窗口。例如滑动窗口大小为5。
那么数据集应当切分为abcde-f(abcde作为训练,f作为这个序列的标签)
bcdef-g、cdefg-e。
滑动窗口为4时,就abcd-e…

向量化

模型肯定是不能喂中文的,那么就得把数据向量化才能进行训练。一般数据量较小时,可以用one-hot编码。假设这里以字符级文本预测(字符为最小的单元)为例,那么[1, 0, 0, 0, 0, 0, 0]可以用来代表a,[0, 1, 0, 0, 0, 0, 0]可以用来代表b…
ab就可以用[ [1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0] ]表示,abcde也是一样的。
训练标签也应当向量化,例如a:1,b:2,c:3…建立一个字典,建立一个字典,然后用字典序来表示就可以了。
例如ab-c可以表示为
数据: [ [1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0] ]
标签: [3]

但是当词语级文本生成时,可能设计及到几万个词,那是one-hot就不太行了,要用到embedding进行降维(自己还没搞清楚,先不提了)。

Batch、Batch_size

训练模型时,一般不会把所有数据一起放进去,或者一个一个放进去训练,而是打包成Batch一份一份的喂进去更新参数的。

例如Batch_size为2时
abcdef
ab-c, bc-d, cd-e, de-f作为训练数据,那么打包成Batch可以表示如下

训练数据:

[ 

[ # 一个Batch,Batch_size=2, 一次两组数据一起进行训练(ab、bc)  
[ [1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0] ],
[ [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0] ] 
],
[ 
[ [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0] ],
[ [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0] ]
]

]
  

训练标签:

[
[[3], [4]] # 假设a的字典序为1然后依次递增,c为3,d为6.
[[5], [6]]
]

应该没啥问题吧…

你可能感兴趣的:(pytorch,自然语言处理,rnn,lstm,深度学习)