1.RNN

现实世界中,很多元素都是相互连接的,比如股票随时间的变化,小明说:我喜欢旅游,其中最喜欢的地方是云南,每当放假时我经常去______旅游.这里填空,人应该都知道是填“云南”。因为我们是根据上下文的内容推断出来的,但机器要做到这一步就相当得难了。因此,就有了现在的循环神经网络,他的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记忆。

循环神经网络是指一个随着时间的推移,重复发生的结构。在自然语言处理(NLP),语音图像等多个领域均有非常广泛的应用。RNN网络和其他网络最大的不同就在于RNN能够实现某种“记忆功能”,是进行时间序列分析时最好的选择。如同人类能够凭借自己过往的记忆更好地认识这个世界一样。RNN也实现了类似于人脑的这一机制,对所处理过的信息留存有一定的记忆,而不像其他类型的神经网络并不能对处理过的信息留存记忆。

 

2.RNN的网络结构及原理

TensorFlow 循环神经网络RNN

 

在上图网络结构中,对于矩形块 A 的那部分,通过输入Xt t时刻的特征向量),它会输出一个结果(t时刻的特征向量),它会输出一个结果t时刻的特征向量),它会输出一个结果 ht(t时刻的状态或者输出)。

RNN 可以被看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:

TensorFlow 循环神经网络RNN

LSTM 网络

长短期记忆网络(Long Short Term Memory networks) - 通常叫做 “LSTMs” —— 是 RNN 中一个特殊的类型。由Hochreiter & Schmidhuber (1997)提出,广受欢迎,之后也得到了很多人们的改进调整。LSTMs 被广泛地用于解决各类问题,并都取得了非常棒的效果。

明确来说,设计 LSTMs 主要是为了避免前面提到的 长时期依赖 (long-term dependency )的问题。它们的本质就是能够记住很长时期内的信息,而且非常轻松就能做到。

所有循环神经网络结构都是由完全相同结构的(神经网络)模块进行复制而成的。在普通的RNNs 中,这个模块结构非常简单,比如仅是一个单一的 tanh 层。

TensorFlow 循环神经网络RNN

LSTMs 也有类似的结构(译者注:唯一的区别就是中间部分)。但是它们不再只是用一个单一的 tanh 层,而是用了四个相互作用的层。

TensorFlow 循环神经网络RNN

在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取 ht-1和Xt ,输出一个在 0到 1之间的数值给每个在细胞状态 Ct-1中的数字。1 表示“完全保留”, 0表示“完全舍弃”。

TensorFlow 循环神经网络RNN

下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容,Ct 。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。

 

TensorFlow 循环神经网络RNN

更新 cell 状态了, 即把 Ct-1 更新为 Ct。 从结构图中应该能一目了然, 首先我们把旧的状态 Ct-1和 ft 相乘,把一些不想保留的信息忘掉。然后加上相乘, 把一些不想保留的信息忘掉。然后加上相乘,把一些不想保留的信息忘掉。然后加上 it * Ct。这部分信息就是我们要添加的新内容。

TensorFlow 循环神经网络RNN

 

最后,我们需要来决定输出什么值了。这个输出主要是依赖于 cell 的状态Ct,但是又不仅仅依赖于 Ct ,而是需要经过一个过滤的处理。首先,我们还是使用一个sigmoid层来(计算出)决定,而是需要经过一个过滤的处理。首先,我们还是使用一个 sigmoid 层来(计算出)决定,而是需要经过一个过滤的处理。首先,我们还是使用一个sigmoid层来(计算出)决定 Ct 中的哪部分信息会被输出。接着,我们把中的哪部分信息会被输出。接着,我们把中的哪部分信息会被输出。接着,我们把 Ct 通过一个 tanh 层(把数值都归到 -1 和 1 之间),然后把 tanh 层的输出和 sigmoid 层计算出来的权重相乘,这样就得到了最后输出的结果。

TensorFlow 循环神经网络RNN

层叠RNN网络

TensorFlow 循环神经网络RNN

TensorFlow 循环神经网络RNN

TensorFlow 循环神经网络RNN