一、LSTM发展背景
LSTM (Long Short Term Memory Network)首先是由Hochreiter & Schmidhuber(引用文献[Hochreiter, S, and J. Schmidhuber. “Long short-term memory.” Neural Computation 9.8(1997):1735-1780])于1997年提出,经过了若干代学者(Felix Gers, Fred Cummins, Santiago Fernandez, Justin Bayer, Daan Wierstra, Julian Togelius, Faustino Gomez, Matteo Gagliolo, and Alex Gloves)的发展,由此形成了现在比较系统且完整的LSTM框架;本文所介绍的就是目前深度学习时代的LSTM,它不仅仅在处理序列数据上表现优异,而且能够解决普通循环神经网络(RNN)难以解决的长期依赖问题。
二、LSTM基本结构与原理
2.1 基本原理概述
其实LSTM的基本原理,说复杂确实复杂,说简单也挺简单,可以把它分成三个部分去理解:
A:这两个是LSTM的宏观结构(其实就是T个BP神经网络沿着时间轴T排列,然后隐藏层之间的状态(权重参数)可以传递)
1.垂直于时间轴方向的LSTM网络:在每一个时间步上都有一个由输入层--隐藏层--输出层组成的BP神经网络(好吧它其实就是一个简单的BP神经网络啦!)
2.沿时间轴方向的历史信息传递渠道:由隐藏层传递的隐藏层状态h(权重参数矩阵)(跟RNN一样的啦)和细胞状态c(权重参数矩阵)(这就是LSTM的特殊之处啦)(这一步就是LSTM这种循环神经网络能处理长期依赖的时间序列数据的原因之一)
B:这个是LSTM的单元结构
3.单个LSTM单元的结构:LSTM的最关键的功能全在这个小小的单元体内(也就是隐藏层的神经元里),这才是LSTM的精华之所在
下面我们就可以分别研究一下这三个部分:
2.2 LSTM的整体结构(宏观上看)
由下图LSTM的结构图可知:每一个time_steps上都有一个BP神经网络,由输入层+隐藏层+输出层构成,这也就是LSTM结构的关键部分了,我们结合代码进行剖析一下结构:详情可以看注释
这里的模型构建过程,用的是keras构建,这个我之前也不懂,参考的是这位大佬的博客:(已经注明来处,欢迎大家自行前往学习)
LSTM 网络结构剖析(Keras) - 知乎 (zhihu.com)
import tensorflow as tf
from tensorflow import keras
from keras.optimizers import Adam
# 双层单尾lstm
def model_tLSTM_h2(units):
model = keras.Sequential() #此处便是先建立一个空的Sequential模型,我们将在其中逐步添加层
#Input Layer
#这里就是利用keras的layers函数构建模型层
#keras的好处在于可以清晰显式的定义模型的结构以及各层的激活函数,输入输出格式,以及各种信息
model.add(keras.layers.LSTM( #你问我为啥这里用LSTM层,下面又是Dense层,我只能跟你说,
#LSTM跟普通ANN的区别就是这个layers.LSTM,LSTM那单元体的精华全在里面了
#普通ANN自然就是直接Dense层就好啦!
units=units, #定义此层的神经元熟数量
activation="relu", #定义激活函数,不定义就是默认"tanh",建议是要根据自己的需求和实验结果来定义