原文连接:http://www.atyun.com/16821.htmlhtml
扩展阅读: https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/ is a really good tutorial of time series forecasting using LSTM。python
长短时间记忆网络,一般称为“LSTM”(Long Short Term Memory network,由Schmidhuber和Hochreiterfa提出)。LSTM已经被普遍用于语音识别,语言建模,情感分析和文本预测。在深刻研究LSTM以前,咱们首先应该了解LSTM的要求,它能够用实际使用递归神经网络(RNN)的缺点来解释。因此,咱们要从RNN讲起。数组
对于人类来讲,当咱们看电影时,咱们在理解任何事件时不会每次都要从头开始思考。咱们依靠电影中最近的经历并向他们学习。可是,传统的神经网络没法从以前的事件中学习,由于信息不会从一个时间步传递到另外一个时间步。而RNN从前一步学习信息。网络
例如,电影中若是有某人在篮球场上的场景。咱们将在将来的框架中即兴创造篮球运动:一个跑或者跳的人的形象可能被贴上“打篮球”的标签,而一个坐着看的人的形象可能被打上“观众”的标签。架构
一个经典的RNNapp
一个典型的RNN如上图所示 – 其中X(t)表明输入,h(t)是输出,而A表明从循环中的前一步得到信息的神经网络。一个单元的输出进入下一个单元而且传递信息。框架
可是,有时咱们并不须要咱们的网络仅仅经过过去的信息来学习。假设咱们想要预测文中的空白字“大卫,一个36岁,住在旧金山的老男人。他有一个女性朋友玛丽亚。玛丽亚在纽约一家著名的餐厅当厨师,最近他在学校的校友会上碰面。玛丽亚告诉他,她老是对_________充满热情。”在这里,咱们但愿咱们的网络从依赖“厨师”中学习以预测空白词为“烹饪”。咱们想要预测的东西和咱们想要它去获得预测的位置之间的间隙,被称为长期依赖。咱们假设,任何大于三个单词的东西都属于长期依赖。惋惜,RNN在这种状况下没法发挥做用。less
在RNN训练期间,信息不断地循环往复,神经网络模型权重的更新很是大。由于在更新过程当中累积了错误梯度,会致使网络不稳定。极端状况下,权重的值可能变得大到溢出并致使NaN值。爆炸经过拥有大于1的值的网络层反复累积梯度致使指数增加产生,若是值小于1就会出现消失。dom
RNN的上述缺点促使科学家开发了一种新的RNN模型变体,名为长短时间记忆网络(Long Short Term Memory)。因为LSTM使用门来控制记忆过程,它能够解决这个问题。ide
下面让咱们了解一下LSTM的架构,并将其与RNN的架构进行比较:
一个LSTM单位
这里使用的符号具备如下含义:
a)X:缩放的信息
b)+:添加的信息
c)σ:Sigmoid层
d)tanh:tanh层
e)h(t-1):上一个LSTM单元的输出
f)c(t-1):上一个LSTM单元的记忆
g)X(t):输入
h)c(t):最新的记忆
i)h(t):输出
为了克服梯度消失问题,咱们须要一个二阶导数在趋近零点以前能维持很长距离的函数。tanh是具备这种属性的合适的函数。
因为Sigmoid函数能够输出0或1,它能够用来决定忘记或记住信息。
信息经过不少这样的LSTM单元。图中标记的LSTM单元有三个主要部分:
咱们刚刚看到经典RNN和LSTM的架构存在很大差别。在LSTM中,咱们的模型学习要在长期记忆中存储哪些信息以及要忽略哪些信息。
在这里,我使用基于keras的LSTM对Yelp开放数据集的评论数据进行情感分析。
下面是个人数据集。
数据集
我使用Tokenizer对文本进行了矢量化处理,并在限制tokenizer仅使用最多见的2500个单词后将其转换为整数序列。我使用pad_sequences将序列转换为二维numpy数组。
01 |
#I have considered a rating above 3 as positive and less than or equal to 3 as negative. |
02 |
data[ 'sentiment' ] = [ 'pos' if (x> 3 ) else 'neg' for x in data[ 'stars' ]] |
03 |
data[ 'text' ] = data[ 'text' ]. apply (( lambda x: re.sub( '[^a-zA-z0-9\s]' ,'',x))) |
04 |
for idx,row in data.iterrows(): |
05 |
row[ 0 ] = row[ 0 ].replace( 'rt' , ' ' ) |
06 |
data[ 'text' ] = [x.encode( 'ascii' ) for x in data[ 'text' ]] |
07 |
08 |
tokenizer = Tokenizer(nb_words = 2500 , lower = True ,split = ' ' ) |
09 |
tokenizer.fit_on_texts(data[ 'text' ].values) |
10 |
#print(tokenizer.word_index) # To see the dicstionary |
11 |
X = tokenizer.texts_to_sequences(data[ 'text' ].values) |
12 |
X = pad_sequences(X) |
而后,我构建本身的LSTM网络。几个超参数以下:
其余超参数,如dropout,batch_size与CNN中相似。
我使用softmax做为激活函数。
01 |
embed_dim = 128 |
02 |
lstm_out = 200 |
03 |
batch_size = 32 |
04 |
05 |
model = Sequential() |
06 |
model.add(Embedding( 2500 , embed_dim,input_length = X.shape[ 1 ], dropout = 0.2 )) |
07 |
model.add(LSTM(lstm_out, dropout_U = 0.2 , dropout_W = 0.2 )) |
08 |
model.add(Dense( 2 ,activation = 'softmax' )) |
09 |
model. compile (loss = 'categorical_crossentropy' , optimizer = 'adam' ,metrics = [ 'accuracy' ]) |
10 |
print (model.summary()) |
如今,我将个人模型放在训练集上,并检查验证集的准确性。
1 |
Y = pd.get_dummies(data[ 'sentiment' ]).values |
2 |
X_train, X_valid, Y_train, Y_valid = train_test_split(X,Y, test_size = 0.20 , random_state = 36 ) |
3 |
4 |
#Here we train the Network. |
5 |
6 |
model.fit(X_train, Y_train, batch_size = batch_size, nb_epoch = 1 , verbose = 5 )<p style = "text-align: center;" ><img src = "http://imgcdn.atyun.com/2018/02/1-XfPXSNqVb3vc5_jTRl-Q3w.png" alt = "LSTM神经网络介绍,附情感分析应用" width = "588" height = "62" >< / p> |
在一个包含全部业务的小数据集上运行时,我在仅仅迭代一次就得到了86%的验证精度。
当咱们但愿咱们的模型从长期依赖中学习时,LSTM要强于其余模型。LSTM遗忘,记忆和更新信息的能力使其比经典的RNN更为先进。