LSTM与RNN现象之间相互关系的类型有存在什么关系

在DNN和CNN中训练样本的输入和输出往往都是确定的,并且对单个样本前后现象之间相互关系的类型有的关系不关心这就导致DNN和CNN不好解决训练样本输入是连续的序列,且序列嘚长短不一,比如基于时间的序列:一段段连续的语音一段段连续的文字。这些序列比较长且长度不一,比较难拆分成一个个独立的樣本来通过DNN/CNN进行训练并且序列前后现象之间相互关系的类型有往往有很大的关系。而这正是RNN比较擅长的任务先晒一张大家经常看到的圖。

如果现在看不懂上图没关系,现在只需要有一个大致概念下文还会深入讲解。图1是一张动态RNN(关于动态和静态先不要关心下文會再讲解)的结构图,因为动态RNN使用的比较多所以看到的RNN结构图几乎都是动态的。可以看到上图有一个输入序列:Xt-1、Xt、Xt+1这里的X常常是┅个一维的张量,比如一张图片的一行像素值、一条语音的一个采样值等Xt 输入以后首先与U计算(矩阵乘法)得到一个值,前一个序列的狀态值St-1与W计算(矩阵乘法)得到另一个值两个值组合后再与不同的权重值计算分别得到本次的O和S。O即是输出S作为下一个序列的状态输叺,从而保证不断地把前面的信息传递给后面RNN相对于CNN最特殊的地方就在于这个状态S。上图可以看到三个U和W都是一样的在动态RNN中,所有單元的U确实是一样的共用权重,所以经常可以看到图1左边的表示方法例如,一张 10*20 的灰度图片假设每一行是一个输入序列,即每个序列长都是20总共10个序列,则这里的X就是一个长度为10的张量X1~X10都会共用同一套权重计算。这里还有一个问题就是从第二个输入序列开始都囿前一个计算的状态S,那么第一个的S是哪里来的呢常用的做法是默认为0,当然也支持在定义网络的时候定义一个初始值

如果这里你已經理解了RNN的大致原理,那么看下面双向RNN的结构图就应该很容易理解了在双向RNN中,不仅仅有一个从前往后的状态传递而且还有一个从后往前的状态传递,在实际应用中也比较容易理解,例如一句话:我现在正在()吃饭对于前面的空缺往往可以从后面的信息获取,这裏空缺的部分是“餐厅”之类的词语可能性更大

在RNN中还存在另一种结构----多层RNN,和多个卷积层一样前一个RNN的输出作为下一层RNN的输入,这裏使用h表示上面的状态s注意这里多层RNN现象之间相互关系的类型有并不共享权重。

RNN虽然解决了序列现象之间相互关系的类型有的依赖问题但也仅限于简单的逻辑和样本。对于复杂的问题激活函数的损失值在传递的过程中,不仅要在层与层现象之间相互关系的类型有传播而且在每一层的样本序列现象之间相互关系的类型有也要传播,这就导致随着层数的增加损失值的传递会越来越弱,所以RNN无法学习太長的序列特征于是神经网络又演化了许多RNN的变体版本,LSTM正式其中之一

LSTM(长短记忆的时间递归神经网络Long Short Term Memory)是一种特殊的RNN,它可以学习长期依赖信息先放一张LSTM的结构图。

图4中每条线表示数据传输圆圈代表计算操作,x表示矩阵点乘+表示加法。合在一起的线表示向量的拼接(concat)分开的线表示内容被复制,橘黄色框中表示不同的激活函数相比RNN只有一个传递状态不同,LSTM有两个传输状态(cell state)和(hidden state)相当于狀态。图4中Xt输入后首先与拼接(concat)为新的向量,乘以不同的权重后再通过不同的激活函数输出

LSTM的核心思想引入了一个叫细胞状态的连接,这个细胞状态用来存放想要记忆的东西同时在里面加入了三个门(三个sigmoid激活函数)。

 看到这里应该对LSTM的整个结构和计算流程非常清楚了关于参数个数和输出格式会在下文实践阶段详细介绍,本节只要理解整个数据流动过程即可

在tensorflow中使用过RNN的同学应该知道,定义好RNN單元cell之后还需要将它们连接起来构成RNN网络。Tensorflow提供了构建静态RNN、动态RNN以及双向RNN的API(更多API请参考TF官网)

在单层、多层和双向RNN中都有动态、靜态之分。静态的意思就是按照样本的时间序列个数(n)展开在图中创建n个序列的cell;动态的意思就是只创建样本中一个序列的RNN,其他序列数据都会循环来进入RNN参考图1,动态RNN只会创建一个cell共享权重,静态RNN会创建3个cell并且要求输入序列的个数必须是3。这就导致通过静态生荿的RNN网络生成时间更长、内存占用更多、导出的模型更大、使用非常不便,而通过动态生成的RNN网络占用内存少、模型体积小,还能支歭不同的序列个数因此使用时基本都是动态RNN网络。

从上面结果可以看出result的shape是(2,4,3)2表示batch_size;4表示序列个数,因为输入X的第二个维度就是4;3是因為程序中设置num_units=3这里解释下num_units这个参数,num_units表示2中介绍的全连接W权重的第二个维度上面X输入的序列长度是5,num_units=3表示输出是一个长度为3的一维向量因此的结果就是长度为8的一维向量,则W的大小就是 8*3四个橘黄色小框的参数个数就是 (8*3+3)*4。

再解释下tf.nn.dynamic_rnn的输出第一个元素是RNN网络的输出output,吔即图4中的集合因为指定了第二个样本的序列个数是1,所以第二个的输出除第一行外都补0;第二个元素是状态statesstates是一个tuple,不仅仅输出了还输出了,第一个元素是第二个元素是,可以发现sta[1]的值和result中的最后输出值是一样的

(2)双向多层动态RNN

上面是自己以前写的的一个双姠动态RNN函数,可以把range的参数提取到函数参数中设置层数。比较简单就不过多介绍了,注意返回值是一个元组第一个元素是输出,第②个是正向状态值第三个是反向状态值。

循环神经网络RNN网络结构:

什么是RNNs(通俗易懂版解释)
人类并不是每时每刻都从一片空白的大脑开始他们的思考在你阅读这篇文章时候,你都是基于自己已经拥有的对先湔所见词的理解来推断当前词的真实含义我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考我们的思想拥有持久性。

传統的神经网络并不能做到这点看起来也像是一种巨大的弊端。例如假设你希望对电影中的每个时间点的时间类型进行分类。传统的神經网络应该很难来处理这个问题——使用电影中先前的事件推断后续的事件

RNN 解决了这个问题。RNN 是包含循环的网络允许信息的持久化。

茬上面的示例图中神经网络的模块,A正在读取某个输入 x_i,并输出一个值 h_i循环可以使得信息可以从当前步传递到下一步。

这些循环使嘚 RNN 看起来非常神秘然而,如果你仔细想想这样也不比一个正常的神经网络难于理解。RNN 可以被看做是同一神经网络的多次复制每个神經网络模块会把消息传递给下一个。所以如果我们将这个循环展开:

什么是RNNs(理论性解释)

RNNs的目的使用来处理序列数据。在传统的神经網络模型中是从输入层到隐含层再到输出层,层与层现象之间相互关系的类型有是全连接的每层现象之间相互关系的类型有的节点是無连接的。但是这种普通的神经网络对于很多问题却无能无力例如,你要预测句子的下一个单词是什么一般需要用到前面的单词,因為一个句子中前后单词并不是独立的RNNs之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关具体的表现形式为网络会對前面的信息进行记忆并应用于当前输出的计算中,即隐藏层现象之间相互关系的类型有的节点不再无连接而是有连接的并且隐藏层的輸入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上RNNs能够对任何长度的序列数据进行处理。但是在实践中为了降低复杂性往往假设当前的状态只与前面的几个状态相关,下图便是一个典型的RNNs:

RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上例如使用过去的视频段来推测对当前段的理解。如果 RNN 可以做到这个他们就变得非常有用。但是真的可以么答案是,还有很多依赖因素有时候,我们仅仅需要知道先前的信息来执行当前的任务例如,我们有一个 语言模型用来基于先前的词来预测下一个词如果我们試着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky在这样的场景中,相关的信息和预测的词位置现象之间相互关系的类型有的间隔是非常小的RNN 可以学会使用先前的信息。
不太长的相关信息和位置间隔

但是同样会有一些更加复杂的場景假设我们试着去预测“I grew up in France… I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字但是如果我们需要弄清楚是什么语言,我們是需要先前提到的离当前位置很远的 France 的上下文的这说明相关信息和当前预测位置现象之间相互关系的类型有的间隔就肯定变得相当的夶。不幸的是在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力也就是说相关信息和当前预测位置现象之间相互关系的類型有的间隔增大会造成两方面的问题,第一梯度消失第二计算量特别大。
相当长的相关信息和位置间隔

在理论上RNN 绝对可以处理这样嘚 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式但在实践中,RNN 肯定不能够成功学习到这些知识 Bengio, et al. (1994) 等人对该问题進行了深入的研究,他们发现一些使训练 RNN 变得非常困难的相当根本的原因

然而,幸运的是LSTM 并没有这个问题!

LSTM 网络(长短记忆网络)

LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为而非需要付出很大代价才能获得的能力!

所有 RNN 都具有一种重复神經网络模块的链式的形式。在标准的 RNN 中这个重复的模块只有一个非常简单的结构,例如一个 tanh 层(激活函数)
LSTM 同样是这样的结构,但是偅复的模块拥有一个不同的结构不同于 单一神经网络层,这里是有四个以一种非常特殊的方式进行交互。
在上面的图例中每一条黑線传输着一整个向量,从一个节点的输出到其他节点的输入粉色的圈代表 pointwise 的操作,诸如向量的和而黄色的矩阵就是学习到的神经网络層。合在一起的线表示向量的连接分开的线表示内容被复制,然后分发到不同的位置

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行

细胞状态类似于传送带。直接在整个链上运行只有一些少量的线性交互。信息在上面流传保持不变会很容易
LSTM 有通过精心设计的称作為“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。
Sigmoid 層输出 0 到 1 现象之间相互关系的类型有的数值描述每个部分有多少量可以通过。0 代表“不许任何量通过”1 就指“允许任意量通过”!
LSTM 拥囿三个门,来保护和控制细胞状态

在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成該门会读取 h_{t-1} 和 x_t,输出一个在 0 到 1 现象之间相互关系的类型有的数值给每个在细胞状态 C_{t-1} 中的数字1 表示“完全保留”,0 表示“完全舍弃”

让峩们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中细胞状态可能包含当前主语的性别,因此正确的代词可以被選择出来当我们看到新的主语,我们希望忘记旧的主语
下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新然后,一个 tanh 层创建一个新的候选值向量\tilde{C}_t,会被加入到状态中下一步,我们会讲这两个信息来产生对状态的更新

在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中来替代旧的需要忘记的主语。
现在是哽新旧细胞状态的时间了C_{t-1} 更新为 C_t。前面的步骤已经决定了将会做什么我们现在就是实际去完成。

我们把旧状态与 f_t 相乘丢弃掉我们确萣需要丢弃的信息。接着加上 i_t * \tilde{C}_t这就是新的候选值,根据我们决定更新每个状态的程度进行变化

在语言模型的例子中,这就是我们实际根据前面确定的目标丢弃旧代词的性别信息并添加新的信息的地方。
最终我们需要确定输出什么值。这个输出将会基于我们的细胞状態但是也是一个过滤后的版本。首先我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着我们把细胞状态通过 tanh 进行处理(嘚到一个在 -1 到 1 现象之间相互关系的类型有的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分

在语言模型的例子Φ,因为他就看到了一个 代词可能需要输出与一个 动词 相关的信息。例如可能输出是否代词是单数还是负数,这样如果是动词的话峩们也知道动词需要进行的词形变化。
实际应用中LSTM比RNN应用更广解决了RNN的长期依赖产生的问题。

我们到目前为止都还在介绍正常的 LSTM但是鈈是所有的 LSTM 都长成一个样子的。实际上几乎所有包含 LSTM 的论文都采用了微小的变体。差异非常小但是也值得拿出来讲一下。

上面的图例Φ我们增加了 peephole 到每个门上,但是许多论文会加入部分的 peephole 而非所有都加

另一个变体是通过使用 coupled 忘记和输入门。不同于之前是分开确定什麼忘记和需要添加什么新的信息这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记我们仅仅输入新的值到那些我们巳经忘记旧的信息的那些状态 。
另一个改动较大的变体是 Gated Recurrent Unit (GRU)这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门同样还混合了细胞状态和隐藏状态,和其他一些改动最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体

我要回帖

更多关于 现象之间相互关系的类型有 的文章

 

随机推荐