浅谈LSTM

我的看法,你们看看,问题有则改之,共同进步,学习过程当中参考的文章均超连接到原文了
RNN的应用场景主要是用来处理大量的输入序列集数据的,传统神经网络采用输入层-隐含层-输出层(InputLayer-Hidden Layer-Output Layer)各层之间全链接,层内节点无链接;而在RNN中,隐含层之间是存在必定的链接的,这意味着每个输出和上一个输出之间是存在必定联系的,具体的表现就是网络会对前面的信息进行记忆并应用于当前输出的计算中。这个操做理论上是能够对任意长度的序列进行处理,但实际上咱们为了下降复杂度每每只选择前面的几个状态。

固然RNN的问题也是存在的:梯度消失和梯度爆炸;我对梯度消失的理解是:过去的不能影响未来,未来的也不能影响过去;也就是说,先前的时间步每每并不能到足够远的时间步来影响网络。而梯度爆炸则是一开始过去的时间步对后面时间步影响过大,致使权值愈来愈大使得网络变得不稳定。在极端状况下,权重的值变得很是大,以致于溢出,致使 NaN 值。html

而相对RNN来讲, LSTM 则是在RNN的基础上加入了门的概念,使得整个过程和人的思惟过程更为相近:LSTMRNN中隐藏层中加入了一个对信息处理的单元——这个单元除了RNN原先简单的tanh函数之外还有几个sigmoid函数共同做用来完成LSTM的功能。对于RNN来讲,每一个隐藏层单元之间的状态是连续的,LSTM也不例外;而为了让这些插入的sigmoid函数做用于状态,咱们须要将生成的权值与状态之间进行pointwise乘法运算。第一个sigmoid函数的做用是遗忘,用来舍弃部分不须要的信息(即经过ht-1与xt输出一个01的数值给隐藏层单元状态ft0是彻底舍弃,1是彻底保留);
接着是更新门,这里由两部分组成,一个是sigmoid函数用来决定什么致咱们要更新,另外一个则是tanh函数建立一个新的候选值向量~Ct
这时咱们进行更新,咱们将二者进行乘法后,再将从遗忘门出来状态与咱们新的候选值向量相加来完成对Ct-1更新至Ct这一过程;最后的时候,咱们须要肯定输出什么值,这个至关于咱们对这个隐藏层单元的状态作一个处理以后进行复制一份传给下一个隐藏层单元,具体操做就是将状态经过tanh进行处理,并将处理后的数据和先前ht-1与xt两项进行sigmoid处理所生成的ot相乘以得到咱们想要输出的那部分,即ht并输出给下一个隐藏层单元。
这样就算是一个LSTM中一个隐藏层单元所须要进行的操做了。固然宏观上来说,其实说白了就是单元状态与上一个输出的同时传导,有选择的(避免梯度爆炸)将咱们须要传递的信息传达到后面的隐藏层单元(避免梯度消失),能够说这样算是解决了RNN上两个使人头疼的问题了。