毕业设计的核心算法是LSTM。所以这里用来记录学习LSTM的原理和实现方法。
主要的学习材料来源于以下几篇博客:
The Unreasonable Effectiveness of Recurrent Neural Networks
Understanding LSTM Networks
PyTorch 实现序列模型和基于LSTM的循环神经网络
好了,接下来让我们一起学习吧。(本文图片均出自以上博客)
RNN(Recurrent Neural Networks)中文译为循环神经网络,其相比较于其他的CNN,GAN等神经网络的主要区别在于RNN体现了时间和序列的特征。
在我们的意识活动中,对于事物的认识并非都是切片化的,静止的。正如我们对于一篇文章的解读,往往需要参照文章的上下文才能正确的的理解文章所要表达的意思。断章取义得到的往往不是正确的的理解。而这正好就是其他神经网络所欠缺的地方。
The Unreasonable Effectiveness of Recurrent Neural Networks一文中举出的一个简单例子,如果我们想要让计算机学习"hello"这个单词,并根据输入判断下一个输出是什么。就能很好的体现RNN的能力。当然我们可以轻松的学习到"h,e,o"这三个单词后的输入,但是当我们面对输入为"l"时,如何判断应该输出"l"还是“o”呢?这就需要参考"l"之前的字母了。
同时另外一种RNN(Recursive Neural Network)作为循环神经网络的改进版本,可以适用于变长数据的输入问题。中文一般翻译为递归神经网络。
LSTM作为一款典型且性能相当优秀的RNN。其与原始的RNN的主要区别在于它在算法中加入了一个判断信息有用与否的“处理器”,这个处理器作用的结构被称为cell。
一个cell当中被放置了三扇门,分别叫做输入门、遗忘门和输出门。一个信息进入LSTM的网络当中,可以根据规则来判断是否有用。只有符合算法认证的信息才会留下,不符的信息则通过遗忘门被遗忘。
说起来无非就是一进二出的工作原理,却可以在反复运算下解决神经网络中长期存在的大问题。目前已经证明,LSTM是解决长序依赖问题的有效技术,并且这种技术的普适性非常高,导致带来的可能性变化非常多。各研究者根据LSTM纷纷提出了自己的变量版本,这就让LSTM可以处理千变万化的垂直问题。(摘自百度百科)
Understanding LSTM Networks一文中图文并茂,并且浅显易懂的为我们讲解了LSTM的设计原理。
首先LSTM是循环神经网络的一种,所以其也具有RNN的一些特性,比如可以看做嵌套的多个输入,神经元,输出的结构组合。如下图:
但是作为对时间序列特征敏感的RNN,同样也有着自己的问题和不足,主要表现在普通的RNN无法对于较长间隔的输入同样保持敏感性,文中作者称这个问题为“The Problem of Long-Term Dependencies”,远距离依赖问题。为了解决这个问题LSTM应运而生。
LSTM(Long Short Term Memory networks)作为一种特殊的RNN,具有实现保持远距离依赖,并加以学习的能力。而LSTM为什么能具有普通RNN所缺失的性质呢?
一般的RNN一系列简单的重复神经元模块,如图:
LSTM同样继承了这样的结构,不过神经元模块的内部更加复杂。
然后,让我们来慢慢理清楚这里面都是些什么吧
LSTM的核心思想
LSTM的核心思想被称作--cell state, 我把他称作细胞状态,其对应的结构如下图:
图中这条黑色的箭头就象征着状态的传递,而每个模块会接收到之前的状态信息,同时也会根据新的输入产生新的状态传递给后方模块。在这里数据的传输相当简单,各个模块可以选择接收哪些状态或者放弃哪些状态。而这个功能通常会由一个称作“门”的功能组件完成。
而这个门通常是使用一个sigmoid函数层输出一个介于0~1之间的值,用于描述通过多少信息。
一个LSTM单元通常拥有三个这种“门”结构,去保护和控制这些细胞状态。
接着分析下面的部分
首先在我们的LSTM模块中我们需要的是选择哪些信息是我们需要的,而哪些有是需要舍弃的。这个步骤由一层"forget gate layer"来控制
接下来我们需要决定哪些新信息是需要添加到模块状态中去的,这里有两个部分,首先一个sigmoid层"input gate layer"决定哪个值是我们所需要更新的,接下来使用一个tanh层生成一个新的值用于添加到我们的新状态上。
接着我们开始更改之前的旧状态Ct−1,生成新状态Ct‘。按照我们之前的设计,我们首先用ft乘以Ct-1,用来忘记我们不要的旧状态,接着加上it*Ct的结果对旧状态进行更新。
最后我们选择输出我们的状态结果,这里我们依旧先使用一个sigmoid函数来选择我们的输出内容M,然后把我们得到的新状态通过一个tanh层得到一个(-1~1)的值于之前的选择矩阵M相乘得到新的输出ht。
这是最基础的LSTM模型,但是大多数的论文中的LSTM都会根据需求做出一些小的改进。
这就需要对问题做更深入的研究了。