人工智能技术网

RNN网络的原理

新的算法理论不断涌现的同时,各种深度学习框架也不断出现在人们视野,比如Torch,Caffe等等。TensorFlow是Google开发的第二代机器学习系统,于2015年底开源,成为了新一代流行的机器学习的算法框架。这一章节我们将学习循环神经网络(RNN)的基本原理。循环神经网络(RecurrentNeuralNetworks,RNNs)已经在众多自然语言处理(NaturalLanguageProcessing,NLP)中取得了巨大成功以及广泛应用。
PS:是因为最近来了帝都在导师那里做毕设,是利用CNN做信息隐藏的,后期会公布源码。帝都真的是人才济济,没有真的本事可能真的没有办法在这个宇宙世界中心混下去。,愿和大家共同成长,共同进步。
RNNs的基本介绍

不同于传统的FNNs(Feed-forward Neural Networks,前向反馈神经网络),RNNs引入了定向循环,能够处理那些输入之间前后关联的问题。定向循环结构如下图所示:
TensorFlow79
RNNs的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNNs之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNNs能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关,下图便是一个典型的RNNs:
TensorFlow80
TensorFlow81
循环神经网络进行展开成一个全神经网络RNNs包含输入单元(Inputunits),输入集标记为{x0,x1,…,xt,xt+1,…},而输出单元(Outputunits)的输出集则被标记为{y0,y1,…,yt,yt+1.,..}。RNNs还包含隐藏单元(Hiddenunits),我们将其输出集标记为{s0,s1,…,st,st+1,…},这些隐藏单元完成了最为主要的工作。你会发现,在图中:有一条单向流动的信息流是从输入单元到达隐藏单元的,与此同时另一条单向流动的信息流从隐藏单元到达输出单元。在某些情况下,RNNs会打破后者的限制,引导信息从输出单元返回隐藏单元,这些被称为“BackProjections”,并且隐藏层的输入还包括上一隐藏层的状态,即隐藏层内的节点可以自连也可以互连。例如,对一个包含5个单词的语句,那么展开的网络便是一个五层的神经网络,每一层代表一个单词。对于该网络的计算过程如下:
1.xt表示第t,t=1,2,3…步(step)的输入。比如,x1为第二个词的one-hot向量(根据上图,x0为第一个词)。
PS:使用计算机对自然语言进行处理,便需要将自然语言处理成为机器能够识别的符号,加上在机器学习过程中,需要将其进行数值化。而词是自然语言理解与处理的基础,因此需要对词进行数值化,词向量便是一种可行又有效的方法。何为词向量,即使用一个指定长度的实数向量v来表示一个词。有一种种最简单的表示方法,就是使用One-hotvector表示单词,即根据单词的数量|V|生成一个|V|*1的向量,当某一位为一的时候其他位都为零,然后这个向量就代表一个单词。缺点也很明显:
  • 由于向量长度是根据单词个数来的,如果有新词出现,这个向量还得增加
  • 主观性太强
  • 多单词,人工打labor并且adapt,很不方便
  • 难以计算单词之间的相似性
    现在有一种更加有效的词向量模式,该模式是通过神经网或者深度学习对词进行训练,输出一个指定维度的向量,该向量便是输入词的表达。如word2vec。
    2.st为隐藏层的第t步的状态,它是网络的记忆单元。st根据当前输入层的输出与上一步隐藏层的状态进行计算。st=f(Uxt+Wst−1),其中f一般是非线性的激活函数,如tanh或ReLU,在计算s0时,即第一个单词的隐藏层状态,需要用到s−1,但是其并不存在,在实现中一般置为0向量。
    3.ot是第t步的输出,如下个单词的向量表示,ot=softmax(Vst)。
    注意
    1.你可以认为隐藏层状态st是网络的记忆单元.st包含了前面所有步的隐藏层状态。而输出层的输出ot只与当前步的st有关,在实践中,为了降低网络的复杂度,往往st只包含前面若干步而不是所有步的隐藏层状态。
    2.在传统神经网络中,每一个网络层的参数是不共享的。而在RNNs中,每输入一步,每一层各自都共享参数U,V,W。其反应者RNNs中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数;这里并没有说清楚,解释一下,传统神经网络的参数是不共享的,并不是表示对于每个输入有不同的参数,而是将RNN是进行展开,这样变成了多层的网络,如果这是一个多层的传统神经网络,那么xt到st之间的U矩阵与xt+1到st+1之间的U是不同的,而RNNs中的却是一样的,同理对于s与s层之间的W、s层与o层之间的V也是一样的。
    3.上图中每一步都会有输出,但是每一步都要有输出并不是必须的。比如,我们需要预测一条语句所表达的情绪,我们仅仅需要关系最后一个单词输入后的输出,而不需要知道每个单词输入后的输出。同理,每步都需要输入也不是必须的。RNNs的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。
RNNs的应用
RNNs已经被在实践中证明对NLP是非常成功的。如词向量表达、语句合法性检查、词性标注等。在RNNs中,目前使用最广泛最成功的模型便是LSTMs(LongShort-TermMemory,长短时记忆模型)模型,该模型通常比vanilla RNNs能够更好地对长短时依赖进行表达,该模型相对于一般的RNNs,只是在隐藏层做了手脚。
语言模型与文本生成(Language Modeling and Generating Text)
给定一个单词序列,根据前面的单词预测每一个单词的可能性。然后根据前面的可能性,语言模型能够得到一个语句正确的可能性,这是机器翻译的一部分,往往可能性越大,语句越正确。另一种应用便是使用生成模型预测下一个单词的概率,从而生成新的文本根据输出概率的采样。语言模型中,典型的输入是单词序列中每个单词的词向量(如One-hotvector),输出时预测的单词序列。当在对网络进行训练时,如果ot=xt+1,那么第t步的输出便是下一步的输入。
机器翻译(Machine Translation)
机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。与语言模型关键的区别在于,需要将源语言语句序列输入后,才进行输出,即输出第一个单词时,便需要从完整的输入序列中进行获取。机器翻译如下图所示:
TensorFlow82
语音识别(Speech Recognition)
语音识别是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的概率值。
图像描述生成 (Generating Image Descriptions)
图像描述生成就是给定一张图像,利用RNN自动生成描述这张图像的文字内容
具体如下:
TensorFlow83
涉及到神经网络,自然语言处理等方方面面的知识。
训练RNNs的原理
对于RNN是的训练和对传统的ANN训练一样。同样使用BP误差反向传播算法,不过有一点区别。如果将RNNs进行网络展开,那么参数W,U,V是共享的,而传统神经网络却不是的。并且在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,并且还以来前面若干步网络的状态。比如,在t=4时,我们还需要向后传递三步,已经后面的三步都需要加上各种的梯度。该学习算法称为BackpropagationThroughTime(BPTT)。但在vanillaRNNs训练中,BPTT无法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,一般超过十步就无能为力了),因为BPTT会带来所谓的梯度消失或梯度爆炸问题(thevanishing/explodinggradientproblem)。当然,有很多方法去解决这个问题,如LSTMs便是专门应对这种问题的。
循环神经网络(RNN)反向传播算法(BPTT)理解
循环神经网络的前向传播算法:
TensorFlow84
RNN中前一时刻到当前时刻只有一个权重矩阵,该权重矩阵与时间并没有什么关系。整个前向传播算法与BP网络的前向传播算法的差别是多了一个前一时刻隐藏层的信息而已。在我们这边的前向传播算法可能与大家平时看到的会有点出入,因为这个前向传播算法将传播过程中的各个阶段都拆分开来表示。在进入激活函数前先用额外的两个变量表示,分别是进入隐藏层激活函数e前的和进入输出层激活函数g前的。
RNN的输入数据与其他神经网络如DNN的输入数据不同的是,RNN的输入数据样本不能打乱,必须按时间进行输入,而其他的神经网络输入数据可以打乱。所RNN与其他神经网络的前向传播算法和反向传播算法的实现其实并没有什么特别之处,只是多了几个变量。因此RNN的关于时间的t循环可以看做,第t个训练样本(或者第t个批量训练样本),但是一定要保持先后顺序,不然学习出来的可能没有什么用处。
接下来给出BPTT算法:
TensorFlow85
LSTM(Long Short-Term Memory)长短期记忆网络
原生的RNN会遇到一个很大的问题,叫做 The vanishing gradient problem for RNNs,也就是后面时间的节点对于前面时间的节点感知力下降,也就是记忆遗失,RNN解决这个问题用到的就叫LSTM,拿个小本子把事记上,好记性不如烂笔头嘛,所以LSTM引入一个核心元素就是Cell。
Long Short Term 网络—— 一般就叫做LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。
所有RNN都具有一种重复神经网络模块的链式的形式。在标准的RNN中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
TensorFlow86
LSTM同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
TensorFlow87
图中使用的各种元素的图标
TensorFlow88
在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
LSTM 的核心思想
LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
TensorFlow89
LSTM有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。
TensorFlow90
Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!LSTM 拥有三个门,来保护和控制细胞状态。
逐步理解LSTM
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取 h_{t-1} 和 xt,输出一个在 0 到 1 之间的数值给每个在细胞状态 C{t-1} 中的数字。1 表示“完全保留”,0 表示“完全舍弃”
TensorFlow91
下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层”决定什么值我们将要更新。然后,一个tanh层创建一个新的候选值向量,\tilde{C}t,会被加入到状态中。
TensorFlow92
现在是更新旧细胞状态的时间了,C
{t-1} 更新为 C_t。
我们把旧状态与 f_t 相乘,丢弃掉我们确定需要丢弃的信息。接着加上 i_t * \tilde{C}_t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
TensorFlow93
最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在-1到1之间的值)并将它和sigmoid门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
TensorFlow94

人工智能技术网 倡导尊重与保护知识产权。如发现本站文章存在版权等问题,烦请30天内提供版权疑问、身份证明、版权证明、联系方式等发邮件至1851688011@qq.com我们将及时沟通与处理。!:首页 > 新闻 » RNN网络的原理

()
分享到:

相关推荐

留言与评论(共有 0 条评论)
   
验证码: