本文讲解循环神经网络。

1 简介

循环神经网络(Recurrent Neural Network, RNN)是时间递归神经网络,另一种递归神经网络是结构递归神经网络。时间递归神经网络的神经元间连接构成矩阵,结构递归神经网络利用相似的神经网络结构递归构造更为复杂的深度网络。RNN一般指时间递归网络。普通递归神经网络无法处理随着递归,权重指数级爆炸或消失的问题(Vanishing gradient problem),难以捕捉长时间关联,为解决该问题,结合长短时记忆网络(Long short-term memory, LSTM)。
循环神经网络源于1982年Saratha Sathasivam提出的霍普菲尔德网络,霍普菲尔德网络提出时,因为实现困难,并且没有具体的应用场景,于1986年被全连接神经网络及一些传统的机器学习算法取代。传统的机器学习算法的缺点:

  • 非常依赖人工提取特征,使得基于传统机器学习的图像识别、语音识别及自然语言处理等问题特征提取的特征工作量过大
  • 参数过多、无法利用数据中时间序列信息

循环神经网络在挖掘数据中的时序信息及语义信息的深度表达能力被广泛引用于语音识别、语音模型、机器翻译及时序分析等方面。
  
LSTM于1997年以论文形式和世人见面,它适合处理和预测时间序列中间隔和延迟相对较长的重要事件。基于LSTM的系统可以学习翻译语言、控制机器人、图形分析、文档摘要、语音识别、图像识别、手写识别、控制聊天机器人、预测疾病、点击率和股票、合成音乐等任务。

2 结构及工作原理

2.1 结构

经典循环神经网络
每一时刻t,循环神经网络针对该时刻的输入结合当前模型的状态给出一个输出,并更新模型状态。如图2.1所示,循环神经网络的主体结构A的输入来自输入层xt和循环边提供上一时刻的隐藏状态(hidden state)ht1。每个时刻,循环神经网络的模块A读取xtht1之后,会生成新的隐藏状态ht,并生成该时刻的输出ot

模块A中的运算和变量是不变的,所以循环神经网络理论上可以看作是同一神经网络结构的无限复制,好比卷积神经网络在不同空间位置共享参数,循环神经网络是不同时间位置共享参数,从而使有限的参数处理任意长度的序列,模块A的拆解如图2.2所示。
从以上分析循环神经网络结构可知,RNN可有效解决与时间序列相关的问题。

2.2 工作原理

循环神经网络中的状态是通过一个向量来表示的,这个向量的维度也称为循环神经网络隐藏层的大小,假设输入向量为x,隐藏状态维度为n,则循环体的全连接层神经网络的输入为n+x,即上一时刻的状态和当前时刻的输入拼接成一个向量作为循环体重神经网络的输入,如图2.3所示。全连接层的输出为当前时刻的状态,作为下一层的隐藏层,则输出节点数为n,与该层的隐藏层输入维度一致,全连接层的输出需要进一步计算,作为最终输出。循环体中参数个数为(n+x)n+n

2.3 过程源码

github地址:https://github.com/xindaqi/AIFuture.git

3 LSTM结构及工作原理

3.1 结构

循环神经网络通过保存历史信息,充分利用建模信息来帮助当前决策,但是长期依赖(long-term dependencies)问题凸显。有些问题模型仅需要短期信息来执行当前任务,不需要要记忆更久的信息,这类问题相关的信息和待预测信息间隔很短,循环神经网络可较容易地利用先前的信息。如果相关信息和待预测信息时间间隔很长,循环神经网络性能会受限制,而LSTM可很好解决该问题。
LSTM结构由Sepp Hochreiter和Jurgen Schmidhuber与1997年提出,结构如图3.1所示。

3.2 工作原理

LSTM结构的运行靠一些“门”结构计算让信息有选择地影响循环神经网络中每个时刻的状态。“门”结构即利用sigmoid神经网络和一个按位做乘法的操作。使用sigmoid作为激活函数的全连接神经网络层的输出值在[0,1]之间,当sigmoid输出为1时,全部信息通过,“门”开,当sigmoid输出为0时,信息无法通过,“门”关闭。
为使循环神经网络更有效地保存长期记忆,,图3.1中的“遗忘门”和“输入门”是LSTM的核心。

  • 遗忘门
    使循环神经网络“忘记”之前无用的消息。根据当前的输入xt和上一时刻的输出ht1决定哪一部分记忆需要“遗忘”,遗忘门f=sigmoid(Wf[ht1,xt]),将上一时刻的状态ct1f向量按位相乘,则f取值接近0的维度上的信息会被“遗忘”,f取值接近1的维度上的信息被保留。
  • 输入门
    在循环网络“忘记”部分之前状态后,还需要从当前的输入状态补充最新的记忆。输入门根据xtht1决定哪些信息加入到状态ct1中生成新的状态ct
  • 输出门
    LSTM结构在计算得到新状态ct后,需要产生当前时刻的输出,通过输出门完成,输出门根据最新状态ct、上一时刻的输出ht1和当前的输入xt决定该时刻的输出ht

3.3 LSTM结构中“门”的结构:

  • 输入值
    z=tanh(Wz[ht1,xt])
  • 输入门
    i=sigmoid(Wi[ht1,xt])
  • 遗忘门
    f=sigmoid(Wf[ht1,xt])
  • 输出门
    o=sigmoid([Wo[ht1,xt]])
  • 新状态
    ct=fct1+iz
  • 输出
    ht=otanhct

3.4 过程源码

github地址:https://github.com/xindaqi/AIFuture.git


10-06 20:54