传统DNN或者CNN无法对时间序列上的变化进行建模,即当前的预测只跟当前的输入样本相关,无法建立在时间或者先后顺序上出现在当前样本之前或者之后的样本之间的联系。实际的很多场景中,样本出现的时间顺序非常重要,例如自然语言处理、语音识别、手写体识别等应用。
循环神经网络RNN包含循环的网络,可以记录信息的持久化信息,特别适合应用在跟时间序列相关的场合。
RNN之父Jürgen Schmidhuber
Jürgen Schmidhuber 是瑞士人工智能实验室 IDSIA 的科学事务主管,同时任教于卢加诺大学和瑞士南部应用科学与艺术学院。他于1987年和1991年在慕尼黑工业大学先后获得计算机科学的学士和博士学位。自1987年以来,一直引领着自我改进式(self-improving)通用问题求解程序(problem-solver)的研究。从1991年开始,他成为深度学习神经网络领域的开拓者。
他在 IDSIA 和慕尼黑工业大学的研究团队开发了一种递归神经网络,并率先在正式的国际性比赛中获胜。这些技术革新了手写体识别、语音识别、机器翻译和图片注释技术,现在被谷歌、微软、IBM、百度和其他很多公司应用。
RNN循环神经网络的基本循环结构如下图:
RNN的输入是一组向量,或者说是任意长度的一个序列,具体到文本应用中就是一段话。RNN假定序列之中每个元素出现的位置不是孤立的,它一定是跟在它之前的出现的元素有关。
上图表示神经网络的模块A的输出除了作为下一个模块的输入外,还会和下一个时刻模块A的输入一起,作为A的输入传递给模块A,注意A的输出是在下一时刻传输给A,而不是在同一时刻循环输出再输入给A(这样就成了死循环了)。为了方便解读,一般把循环结构展开:
这样每一个模块A的输入就包含了两部分:
1. 上一个模块A的输出
2. 时间序列在此样本之前的所有样本在模块A之前的所有模块上的输出。
RNN通过这样一个一个循环结构,构建了一个与序列和先后次序有关的模型,该模型的预测不仅与当前输入有关,还与在此输入之前的所有输入状态有关,这也是与自然状态下人的思维判别方式最像的。
RNN还在隐含层节点之间增加了互连:
理论上RNN可以支持任意长度的序列,但是如果序列太长会导致优化时出现梯度消失的问题,即神经元很难接收到离当前元素很远位置上的元素对当前元素的影响,常规只能接收到之前的若干个单位,所以一般会设置最大长度,超长会对其截断。
LSTM(long short-term memory)长短时记忆网络
LSTM解决了RNN不支持长期依赖的问题,使其大幅度提升记忆时长。
LSTM是一种特殊类型的RNN,可以学习长期依赖信息,由Hochreiter & Schmidhuber 在1997年提出。标准RNN中循环模块如下:
而在LSTM中,这一结构变为:
LSTM的成功的关键在于图中上方的贯穿线,类似于传送带,将前边序列的信息成功传递给很远后边的神经元,而保持不衰减。LSTM设计了“门”的结构来决定当前的状态如何添加到贯穿线上。
LSTM 的门决定了信息通过的方式,包含一个sigmoid 神经网络层和一个乘法操作,Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”。
LSTM 拥有三个门,来保护和控制细胞状态。
第一个Sigmoid门决定了需要从当前状态中舍弃哪些信息,这个门称为“忘记门”,例如根据当前的状态出现了一个新的主语,那么之前的句子中的主语就应该被丢弃掉。
第二个Sigmoid+T函数组成的门决定了哪些信息需要被添加到状态中,这里分为两部分,一个是Sigmoid层决定了将要更新哪些值,这一部分跟第一层完全一样,而T层会创建一个新的信息用来添加到状态中。如替换掉之前句子的主语的状态。
前边两个门的工作主要是用来更新贯穿线的状态的,第三个门的作用是根据贯穿线上的信息以及当前的输入信息计算模块的输出,更新的依然是哪些信息需要丢弃,哪些信息需要被添加。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:循环神经网络RNN模型和长短时记忆系统LSTM - Python技术站