前言
最近做实验需要处理时序数据,先要用LSTM处理一下看看效果如何。所以记录一下自己的学习过程。
提示:本篇文章内容仅供参考
一、数据处理
-
Categorical features转换为Numerical features为什么用one hot vector表示?
不能用标量表示Categorical features。举个例子,国家这个属性,如果1:美国,2:中国,3:印度,那么1+2=3,不能说美国加中国等于印度。但是用向量表示就可以理解了。 -
Tokenizatiom:把文本变成单词列表
这里需要注意的地方:大小写含义是否相同、去除stop words(比如of,a等对分类无意义的词)、拼写纠错等等 -
建立词频表,处理列表:对于列表中的单词,出现过的词频+1,未出现过的词插入词频表。
-
生成字典:按词频将词频表中的单词排序(从大到小),用index替换词频(frequency),即出现最多的词为1,次多的为2,以此类推。这个表就叫字典,将单词映射到数字。
-
删除低频词:低频词可能是书写错误或者特殊专有名词,删除低频词能减少参数,降低计算量和过拟合的风险。
接下来如果有必要还可以将数字转换成向量。 -
样本长度不一:超过阈值的截取一部分,不足的补0。
-
Word Embedding
关于Embedding层,可以参考Embedding层作用讲解,讲的非常通俗易懂。
二、Simple RNN
诸如Logical Regression和CNN都是典型的一对一模型,即一个输入对应一个输出,显然不适合针对时序数据。我们阅读的时候会从左到右阅读,在读的过程中不断积累信息,从而理解最终意思而不会一次一段文字直接输入大脑。而且对于时序数据,输入与输出长度不固定(如翻译),显然多对一或者多对多模型更加合适。所以RNN闪亮登场!
流程:将输入的词用word embedding转化为词向量,每次把词向量输入RNN,用状态h积累结果。如图,h1包含第一个词的信息,h2包含前两个词的信息,以此类推(h可以理解为特征向量)
简单的RNN模型如图所示:
注:
1. h(t-1)和x(t)做concat
2. A是模型参数
3. tanh函数:放置循环次数过多导致,A的次方太大或太小导致h爆炸或者消失。
4. 可以只输出h(t)再使用sigmod函数得到结果,也可以保留所有状态向量合成一个矩阵在用Flatten展平。
Simple RNN的缺点:
对长内容处理效果并不好。理论上来说,状态h(t)应该和x(0)到x(t)都有关,但是,当t增大到一定数量时,如
h
100
h_{100}
h100,
∂
h
1
00
∂
x
1
\frac{\partial h_100 }{\partial x_1 }
∂x1∂h100 接近于0,说明状态
h
100
h_{100}
h100已经快忘记
x
1
x_{1}
x1。
三、LSTM
原理
原理类似Simple RNN,结构更复杂。LSTM提出的动机是为了解决上面我们提到的长期依赖问题。
使用双向RNN也能一定程度上解决遗忘问题。
具体参考知乎:LSTM解析
基于pytorch的RNN的实现
参考视频:RNN与LSTM知识讲解与实战
新建一个RNN实例,有三个参数
- input_size:输入数据的维度,如对于文本处理而言,一个单词用一个100维的向量表示,则该参数为100,对于房价预测而言数据只有一个数,那么该参数就是1。
- hidden_size:h的数量
- num_layers:RNN的层数
向前传播:
输入的时候直接讲所有数据同时输入即可,pytorch会自动处理。想要更细致的处理可以使用RNNCell。