LSTM模型浅析

在对神经网络类算法模型一无所知的时候,我就曾想过信息与时序的问题,并陷入混乱中…今天开始看BiLSTM的原理时,才发现早就有了相应的解决方案…

神经网络的灵感来自于人脑神经元的工作方式,然而为了在计算机中实现,依然是个跟加权有关的数学问题,权重决定了信息的重要程度。每个节点虽然有多个输入输出,但是一种状态下只是二值问题。神经网络的隐藏层越多,处理复杂问题的能力也就越强。

历史模型的局限

普通的神经网络(NN):各输入层之间没有运算连接,无法表示上下文关系

  • $h_t = sigmoid(W_x * x_t + b)$

循环神经网络(RNN): 其实比较类似于进位加法链,上一次运算的结果会加入到下一次运算中。这种基于时序的处理,只包含了上文信息,而忽略了下文信息。如果用增加依赖步数的方式,会导致把精力都集中在记忆大量的输入信息上,从而使建模能力下降。还有一个问题是RNN比较难以训练,逐步求导的梯度下降方式可能产生梯度爆炸问题

  • $h_t = tanh(W_x x_t + W_h h_{t-1} +b)$

双向循环神经网络(BRNN): 再增加一个向后的网络,使得未来信息被包含进来。然而,仍然存在存取的上下文信息范围有限的问题,随着网络环路的不断递归,隐含层的影响是会不断衰减的,即长期依赖问题,这就引出了关于权重的考虑,什么样的信息是重要的,需要在后续的计算中一直保留呢? 于是出现了 LSTM

长短期记忆(LSTM): 核心是基于门函数的自我衡量的机制,通过记忆门与遗忘门来控制之前的影响,相比于RNN,多了一个输入和输出,它们控制的是长期记忆。LSTM用细胞状态来表示内部复杂的处理过程。

双向长短期记忆(BiLSTM): 即增加一个反向的LSTM。两个方向的结果拼接后得最终结果。

门控循环单元(GRU):将忘记和输入门结合成一个“更新门”,它还合并了单元状态和隐藏状态,并做了一些其他更改。由此产生的模型比标准的LSTM模型更简单,并且越来越受欢迎。

英文参考文章

中文参考文章

LSTM的应用领域

  • one to many: 如给出一个图片,生成描述语句;由一个单词写出一篇诗
  • many to one : 如 视频分类
  • many to many: 结构对应如手写识别 或 不对应 如给一个视频生成描述

总之,与序列有关的都可以用该模型来处理,特别是上下文有关的情况

在实践中,一般先用CNN抽取特征,再用LSTM进行序列学习

神经网络是一个工具,很多库都已经实现了,不用多度担心其中的数学问题和实现难度,更应该关心的是你的问题到底适应什么样的网络结构,训练数据多大,能承受多深的神经网络。这考验的其实是工程能力

实现

LSTM的训练对内存要求较高,训练一般就是10~20 的序列长度, 预测的长度没有太大限制。参数设置就是炼丹…

了解一种DL框架,如TensorFlow , PyTorch, 内部都已经集成了LSTM,知道如何调用就行