(转)LSTM神经网络介绍
原文链接:http://www.atyun.com/16821.html
扩展阅读: https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/ is a really good tutorial of time series forecasting using LSTM。
长短期记忆网络,通常称为“LSTM”(Long Short Term Memory network,由Schmidhuber和Hochreiterfa提出)。LSTM已经被广泛用于语音识别,语言建模,情感分析和文本预测。在深入研究LSTM之前,我们首先应该了解LSTM的要求,它可以用实际使用递归神经网络(RNN)的缺点来解释。所以,我们要从RNN讲起。
递归神经网络(RNN)
对于人类来说,当我们看电影时,我们在理解任何事件时不会每次都要从头开始思考。我们依靠电影中最近的经历并向他们学习。但是,传统的神经网络无法从之前的事件中学习,因为信息不会从一个时间步传递到另一个时间步。而RNN从前一步学习信息。
例如,电影中如果有某人在篮球场上的场景。我们将在未来的框架中即兴创造篮球运动:一个跑或者跳的人的形象可能被贴上“打篮球”的标签,而一个坐着看的人的形象可能被打上“观众”的标签。
一个经典的RNN
一个典型的RNN如上图所示 – 其中X(t)代表输入,h(t)是输出,而A代表从循环中的前一步获得信息的神经网络。一个单元的输出进入下一个单元并且传递信息。
但是,有时我们并不需要我们的网络仅仅通过过去的信息来学习。假设我们想要预测文中的空白字“大卫,一个36岁,住在旧金山的老男人。他有一个女性朋友玛丽亚。玛丽亚在纽约一家著名的餐厅当厨师,最近他在学校的校友会上碰面。玛丽亚告诉他,她总是对_________充满热情。”在这里,我们希望我们的网络从依赖“厨师”中学习以预测空白词为“烹饪”。我们想要预测的东西和我们想要它去得到预测的位置之间的间隙,被称为长期依赖。我们假设,任何大于三个单词的东西都属于长期依赖。可惜,RNN在这种情况下无法发挥作用。
为什么RNN在这里不起作用
在RNN训练期间,信息不断地循环往复,神经网络模型权重的更新非常大。因为在更新过程中累积了错误梯度,会导致网络不稳定。极端情况下,权重的值可能变得大到溢出并导致NaN值。爆炸通过拥有大于1的值的网络层反复累积梯度导致指数增长产生,如果值小于1就会出现消失。
长短期记忆网络
RNN的上述缺点促使科学家开发了一种新的RNN模型变体,名为长短期记忆网络(Long Short Term Memory)。由于LSTM使用门来控制记忆过程,它可以解决这个问题。
下面让我们了解一下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?
为了克服梯度消失问题,我们需要一个二阶导数在趋近零点之前能维持很长距离的函数。tanh是具有这种属性的合适的函数。
为什么要使用Sigmoid?
由于Sigmoid函数可以输出0或1,它可以用来决定忘记或记住信息。
信息通过很多这样的LSTM单元。图中标记的LSTM单元有三个主要部分:
- LSTM有一个特殊的架构,它可以让它忘记不必要的信息。Sigmoid层取得输入X(t)和h(t-1),并决定从旧输出中删除哪些部分(通过输出0实现)。在我们的例子中,当输入是“他有一个女性朋友玛丽亚”时,“大卫”的性别可以被遗忘,因为主题已经变成了玛丽亚。这个门被称为遗忘门f(t)。这个门的输出是f(t)* c(t-1)。
- 下一步是决定并存储记忆单元新输入X(t)的信息。Sigmoid层决定应该更新或忽略哪些新信息。tanh层根据新的输入创建所有可能的值的向量。将它们相乘以更新这个新的记忆单元。然后将这个新的记忆添加到旧记忆c(t-1)中,以给出c(t)。在我们的例子中,对于新的输入,他有一个女性朋友玛丽亚,玛丽亚的性别将被更新。当输入的信息是,“玛丽亚在纽约一家著名的餐馆当厨师,最近他们在学校的校友会上碰面。”时,像“著名”、“校友会”这样的词可以忽略,像“厨师”、“餐厅”和“纽约”这样的词将被更新。
- 最后,我们需要决定我们要输出的内容。Sigmoid层决定我们要输出的记忆单元的哪些部分。然后,我们把记忆单元通过tanh生成所有可能的值乘以Sigmoid门的输出,以便我们只输出我们决定的部分。在我们的例子中,我们想要预测空白的单词,我们的模型知道它是一个与它记忆中的“厨师”相关的名词,它可以很容易的回答为“烹饪”。我们的模型没有从直接依赖中学习这个答案,而是从长期依赖中学习它。
我们刚刚看到经典RNN和LSTM的架构存在很大差异。在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网络。几个超参数如下:
- embed_dim:嵌入层将输入序列编码为维度为embed_dim的密集向量序列。
- lstm_out:LSTM将矢量序列转换为大小为lstm_out的单个矢量,其中包含有关整个序列的信息。
其他超参数,如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要强于其他模型。LSTM遗忘,记忆和更新信息的能力使其比经典的RNN更为先进。
(转)LSTM神经网络介绍的更多相关文章
- (转) 干货 | 图解LSTM神经网络架构及其11种变体(附论文)
干货 | 图解LSTM神经网络架构及其11种变体(附论文) 2016-10-02 机器之心 选自FastML 作者:Zygmunt Z. 机器之心编译 参与:老红.李亚洲 就像雨季后非洲大草原许多野 ...
- LSTM神经网络
LSTM是什么 LSTM即Long Short Memory Network,长短时记忆网络.它其实是属于RNN的一种变种,可以说它是为了克服RNN无法很好处理远距离依赖而提出的. 我们说RNN不能处 ...
- YJango的卷积神经网络——介绍
原文地址:https://zhuanlan.zhihu.com/p/27642620 如果要提出一个新的神经网络结构,首先就需要引入像循环神经网络中“时间共享”这样的先验知识,降低学习所需要的训练数据 ...
- LSTM 神经网络输入输出层
今天终于弄明白,TensorFlow和Keras中LSTM神经网络的输入输出层到底应该怎么设置和连接了.写个备忘. https://machinelearningmastery.com/how-to- ...
- 长短时记忆神经网络(LSTM)介绍以及简单应用分析
本文分为四个部分,第一部分简要介绍LSTM的应用现状:第二部分介绍LSTM的发展历史,并引出了受众多学者关注的LSTM变体——门控递归单元(GRU):第三部分介绍LSTM的基本结构,由基本循环神经网络 ...
- 深入浅出LSTM神经网络
转自:https://www.csdn.net/article/2015-06-05/2824880 LSTM递归神经网络RNN长短期记忆 摘要:根据深度学习三大牛的介绍,LSTM网络已被证明比传 ...
- RNN以及LSTM的介绍和公式梳理
前言 好久没用正儿八经地写博客了,csdn居然也有了markdown的编辑器了,最近花了不少时间看RNN以及LSTM的论文,在组内『夜校』分享过了,再在这里总结一下发出来吧,按照我讲解的思路,理解RN ...
- tensorflow学习之(十一)RNN+LSTM神经网络的构造
#RNN 循环神经网络 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data tf.se ...
- 【翻译】给初学者的 Neural Networks / 神经网络 介绍
本文翻译自 SATYA MALLICK 的 "Neural Networks : A 30,000 Feet View for Beginners" 原文链接: https:// ...
随机推荐
- 按照ID倒序查出某个字段不重复的集合
一.需求 有如下一个表pp_test: id name 1 aa 2 bb 3 cc 4 aa 5 cc 6 要求查出name字段中不重复的值(不算空值),并且按照id的倒序排列(不必输出ID). ...
- 【我的物联网成长记8】超速入门AT指令集【华为云技术分享】
[摘要] 在物联网中,AT命令集可用于控制&调测设备.通信模块入网等.本文为您介绍NB-IoT常用的AT命令集及其调测工具. 什么是AT指令集 AT命令,用来控制TE(Terminal Equ ...
- python使用mysql的一些坑
注意:如果你用的是python3.x,直接去看第四个问题 遇到的第一个问题 正常来说直接执行pip安装,就是可以的,但是MySQL-python偏偏比较独特 pip install MySQL-pyt ...
- HashMap 实现原理解析
概要 HashMap 最早出现在 JDK 1.2 中,底层基于散列算法实现.HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0.HashMap 并不保证 ...
- Java并发编程系列-(4) 显式锁与AQS
4 显示锁和AQS 4.1 Lock接口 核心方法 Java在java.util.concurrent.locks包中提供了一系列的显示锁类,其中最基础的就是Lock接口,该接口提供了几个常见的锁相关 ...
- 这些C++常用内置函数你会几个??
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Regina520 新手注意:如果你C++学的不好,可以去拿我的C+ ...
- 【Web技术】400- 浅谈Shadow DOM
编者按:本文作者:刘观宇,360 奇舞团高级前端工程师.技术经理,W3C CSS 工作组成员. 为什么会有Shadow DOM 你在实际的开发中很可能遇到过这样的需求:实现一个可以拖拽的滑块,以实现范 ...
- 基于RT-Thread的开源飞控StarryPilot
背景描述 近年来无人机应用市场日趋火热,无人机开始被应用在多个领域之中,比如航拍,植保,运输,安防等.随着应用场景的增加,对于无人机的大脑一飞控,的性能和功能要求也变得越来越高.国内具有一大批优质的无 ...
- python笔记03
day03 一.今日内容: 1.整型 2.字符串 3.布尔类型 二.内容回顾和补充 脑图--xmind软件,processon 1.运算符补充(in.not in) value = "我是中 ...
- Vue如何实现数据响应的
参考博客:https://medium.com/vue-mastery/the-best-explanation-of-javascript-reactivity-fea6112dd80d 翻译博客: ...