Python深度学习--学习笔记(十三)

用LSTM层编写辨别imdb评论正负面模型

上一节,我们提到了RNN已经RNN在keras中最简单的层SimpleRNN。但SimpleRNN由于过于简化,没有实用价值。

实际上,它不可以学到长期依赖。原因在于梯度消失问题,当运用比较多的非循环层时,而让网变得无法训练。同样的问题其实也普遍发生在密集连接层。

今天介绍的LSTM(long short-term memory)层,也是RNN层中的一种,这个算法有Hochreiter和 Schmidhuber 在 1997 年开发,是二人研究梯度消失问题的重要成果。

简单的来讲,LSTM比SimpleRNN在内部循环中多了一个Ct值的传递。
这里,附上伪代码,LSTM与SImpleRNN的对比来方便理解:

#SimpleRNN:
output_t = np.tanh(np.dot(W, input_t) + np.dot(U, state_t) + b)
state_t = output_t
#LSTM
output_t = activation(dot(state_t,Uo) + dot(input_t,Wo) + dot(C_t,Vo) + bo)
i_t = activation(dot(state_t, Ui) + dot(input_t, Wi) + bi)
f_t = activation(dot(state_t, Uf) + dot(input_t, Wf) + bf)
k_t = activation(dot(state_t, Uk) + dot(input_t, Wk) + bk)
c_t+1 = i_t * k_t + c_t * f_t
state_t = output_t

其中,i,f,k分别代表循环过程前面的层。将循环过程中不同的权重(W)和状态权重(U)携带到后面的循环中,有效控制梯度消失问题。

这里贴上简单的例子,理解LSTM的实际运用:

from keras import layers
from keras import models

#处理数据
from keras.datasets import imdb
from keras.preprocessing import sequence

max_features = 10000
maxlen = 500
# 在这么多单词之后截断文本(这些单词都
# 属于前 max_features 个最常见的单词)
batch_size = 32

print('Loading data...')
(input_train,y_train),(input_test,y_test) = imdb.load_data(num_words=max_features)

print(len(input_train),'train sequence')
print(len(input_test),'test sequence')

print('Pad sequences (sample x time)')
input_train = sequence.pad_sequences(input_train,maxlen=maxlen)
input_test = sequence.pad_sequences(input_test,maxlen=maxlen)
print('input_train shape:',input_train.shape)
print('input_test shape:',input_test.shape)


#构建模型
model = models.Sequential()
model.add(layers.Embedding(max_features,32))
# 32 维向量
model.add(layers.LSTM(32))
model.add(layers.Dense(1,activation='sigmoid'))

model.summary()
#编译模型
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['acc'])


#训练模型
history = model.fit(input_train,y_train,
                    epochs=10,
                    batch_size=128,
                    validation_split=0.2)

Python深度学习--学习笔记(十三)_第1张图片
验证精度达到了88%,还不错,肯定比SimpleRNN网络好多了,这主要是因为LSTM受梯度消失问题的影响要小的多。

但对于一种计算量如此之大的方法而言,这个结果也说不上是突破性的。为什么 LSTM 不能表现得更好?
一个原因是你没有花力气来调节超参数,比如嵌入维度或 LSTM 输出维度。
另一个原因可能是
缺少正则化
。但说实话,主要原因在于,适用于评论分析全局的长期性结构(这
正是 LSTM 所擅长的),对情感分析问题帮助不大。对于这样的基本问题,观察每条评论中出现
了哪些词及其出现频率就可以很好地解决。这也正是第一个全连接方法的做法。但还有更加困
难的自然语言处理问题,特别是问答和机器翻译,这时 LSTM 的优势就明显了。

你可能感兴趣的:(Python深度学习--学习笔记(十三))