rnn_rnn lstm - CSDN
rnn 订阅
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) [1]  。对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一 [2]  ,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的的循环神经网络 [3]  。循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势 [4]  。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convoutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。 展开全文
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) [1]  。对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一 [2]  ,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的的循环神经网络 [3]  。循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势 [4]  。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convoutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。
信息
外文名
Recurrent Neural Network, RNN
提出时间
1986-1990年
提出者
M. I. Jordan,Jeffrey Elman
类    型
机器学习算法,神经网络算法
中文名
循环神经网络
应    用
自然语言处理,计算机视觉
所属学科
人工智能
循环神经网络历史
1933年,西班牙神经生物学家Rafael Lorente de Nó发现大脑皮层(cerebral cortex)的解剖结构允许刺激在神经回路中循环传递,并由此提出反响回路假设(reverberating circuit hypothesis) [5]  。该假说在同时期的一系列研究中得到认可,被认为是生物拥有短期记忆的原因 [6-7]  。随后神经生物学的进一步研究发现,反响回路的兴奋和抑制受大脑阿尔法节律(α-rhythm)调控,并在α-运动神经(α-motoneurones )中形成循环反馈系统(recurrent feedback system) [8-9]  。在二十世纪70-80年代,为模拟循环反馈系统而建立的一些数学模型为RNN带来了启发 [10-12]  。1982年,美国学者John Hopfield基于Little (1974) [12]  的神经数学模型使用二元节点建立了具有结合存储(content-addressable memory)能力的神经网络,即Hopfield神经网络 [13]  。Hopfield网络是一个包含递归计算和外部记忆(external memory)的神经网络,其内部所有节点都相互连接,并使用能量函数进行非监督学习 [14]  。1986年,Michael I. Jordan在分布式并行处理(parallel distributed processing)理论下提出了Jordan网络 [15]  。Jordan网络的每个隐含层节点都与一个状态单元(state units)相连以实现延时输入,并使用logistic函数作为激励函数 [15]  。Jordan网络使用反向传播算法(Back-Probagation, BP)进行学习,并在测试中提取了给定音节的语音学特征 [15]  。之后在1990年,Jeffrey Elman提出了第一个全连接的RNN,即Elman网络 [16]  。Jordan网络和Elman网络都从单层前馈神经网络出发构建递归连接,因此也被称为简单循环网络(Simple Recurrent Network, SRN) [4]  。在SRN出现的同一时期,RNN的学习理论也得到发展。在反向传播算法被提出后 [17]  ,学界开始尝试在BP框架下对循环神经网络进行训练 [15]  [2]  [18]  。1989年,Ronald Williams和David Zipser提出了RNN的实时循环学习(Real-Time Recurrent Learning, RTRL) [19]  。随后Paul Werbos在1990年提出了随时间反向传播算法(BP Through Time,BPTT) [20]  。1991年,Sepp Hochreiter发现了循环神经网络的长期依赖问题(long-term dependencies problem),即在对长序列进行学习时,循环神经网络会出现梯度消失(gradient vanishing)和梯度爆炸(gradient explosion)现象,无法掌握长时间跨度的非线性关系 [21-22]  。为解决长期依赖问题,RNN的改进不断出现,较重要的包括Jurgen Schmidhuber及其合作者在1992和1997年提出的神经历史压缩器(Neural History Compressor, NHC) [23]  和长短期记忆网络(Long Short-Term Memory networks, LSTM) [24]  ,其中包含门控的LSTM受到了关注。同在1997年,M. Schuster和K. Paliwal提出了具有深度结构的双向循环神经网络(Bidirectional RNN, BRNN),并对其进行了语音识别试验 [25]  。双向和门控构架的出现提升了RNN的学习表现,在一些综述性研究中,被认为是RNN具有代表性的研究成果 [2]  。十一世纪后,随着深度学习理论的出现和数值计算能力的提升,拥有更高复杂度的RNN开始在自然语言处理问题中得到关注。2005年,Alex Graves等将双向LSTM应用于语音识别,并得到了优于隐马尔可夫模型(Hidden Markov Model, HMM)的表现 [26]  。2014年,K. Cho提出了门控循环单元网络(Gated Recurrent Unit networks, GRU),该方法是LSTM之后另一个受到关注的RNN门控构架 [27]  。2010年,Tomas Mikolov及其合作者提出了基于RNN的语言模型 [28]  [29]  。2013-2015年, Y. Benjo、D. Bahdanau等提出了编码器-解码器、自注意力层等一系列RNN算法,并将其应用于机器翻译问题 [30-31]  。为语言模型设计的RNN算法在随后的研究中启发了包括ransformers、XLNet、ELMo、BERT等复杂构筑 [32-34]  。
收起全文
精华内容
参与话题
  • 课程讲解深度学习中RNN与LSTM网络结构特点,实例演示如何使用Tensorflow构造网络模型。并且讲解了如何基于唐诗数据集去建立LSTM模型进行序列预测。代码示例演示如何使用Tensorflow从零开始训练唐诗生成网络模型。 ...
  • RNN介绍,较易懂

    万次阅读 多人点赞 2017-11-20 16:58:39
    Recurrent Neural Networks 人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部...



    Recurrent Neural Networks

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

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

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

    [译] 理解 LSTM 网络
    RNN 包含循环

    在上面的示例图中,神经网络的模块,A,正在读取某个输入 x_i,并输出一个值 h_i。循环可以使得信息可以从当前步传递到下一步。这些循环使得 RNN 看起来非常神秘。然而,如果你仔细想想,这样也不比一个正常的神经网络难于理解。RNN 可以被看做是同一神经网络的多次赋值,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:

    [译] 理解 LSTM 网络
    展开的 RNN

    链式的特征揭示了 RNN 本质上是与序列和列表相关的。他们是对于这类数据的最自然的神经网络架构。

    并且 RNN 也已经被人们应用了!在过去几年中,应用 RNN 在语音识别,语言建模,翻译,图片描述等问题上已经取得一定成功,并且这个列表还在增长。我建议大家参考 Andrej Karpathy 的博客文章—— The Unreasonable Effectiveness of Recurrent Neural Networks 来看看更丰富有趣的 RNN 的成功应用。

    而这些成功应用的关键之处就是 LSTM 的使用,这是一种特别的 RNN,比标准的 RNN 在很多的任务上都表现得更好。几乎所有的令人振奋的关于 RNN 的结果都是通过 LSTM 达到的。这篇博文也会就 LSTM 进行展开。

    长期依赖(Long-Term Dependencies)问题

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

    [译] 理解 LSTM 网络

    不太长的相关信息和位置间隔

    但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France... I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。

    [译] 理解 LSTM 网络

    相当长的相关信息和位置间隔

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

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

    LSTM 网络

    Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由 Hochreiter & Schmidhuber (1997) 提出,并在近期被 Alex Graves 进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。

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

    所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

    [译] 理解 LSTM 网络

    标准 RNN 中的重复模块包含单一的层

    LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

    [译] 理解 LSTM 网络

    LSTM 中的重复模块包含四个交互的层

    不必担心这里的细节。我们会一步一步地剖析 LSTM 解析图。现在,我们先来熟悉一下图中使用的各种元素的图标。

    [译] 理解 LSTM 网络
    LSTM 中的图标

    在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。

    LSTM 的核心思想

    LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

    [译] 理解 LSTM 网络

    Paste_Image.png

    LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。

    [译] 理解 LSTM 网络

    Paste_Image.png

    Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!

    LSTM 拥有三个门,来保护和控制细胞状态。

    逐步理解 LSTM

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

    让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前 主语 的类别,因此正确的 代词 可以被选择出来。当我们看到新的 代词 ,我们希望忘记旧的代词 。

    [译] 理解 LSTM 网络
    决定丢弃信息

    下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量,\tilde{C}_t,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。

    在我们语言模型的例子中,我们希望增加新的代词的类别到细胞状态中,来替代旧的需要忘记的代词。

    [译] 理解 LSTM 网络
    确定更新的信息

    现在是更新旧细胞状态的时间了,C_{t-1}更新为C_t。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。

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

    在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的类别信息并添加新的信息的地方。

    [译] 理解 LSTM 网络
    更新细胞状态

    最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

    在语言模型的例子中,因为他就看到了一个 代词 ,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。

    [译] 理解 LSTM 网络
    输出信息

    LSTM 的变体

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

    其中一个流形的 LSTM 变体,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是说,我们让 门层 也会接受细胞状态的输入。

    [译] 理解 LSTM 网络
    peephole 连接

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

    另一个变体是通过使用 coupled 忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。

    [译] 理解 LSTM 网络

    coupled 忘记门和输入门

    另一个改动较大的变体是 Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。

    [译] 理解 LSTM 网络
    GRU

    这里只是部分流行的 LSTM 变体。当然还有很多其他的,如 Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如 Koutnik, et al. (2014) 提出的 Clockwork RNN。

    要问哪个变体是最好的?其中的差异性真的重要吗? Greff, et al. (2015) 给出了流行变体的比较,结论是他们基本上是一样的。 Jozefowicz, et al. (2015) 则在超过 1 万中 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。

    结论

    刚开始,我提到通过 RNN 得到重要的结果。本质上所有这些都可以使用 LSTM 完成。对于大多数任务确实展示了更好的性能!

    由于 LSTM 一般是通过一系列的方程表示的,使得 LSTM 有一点令人费解。然而本文中一步一步地解释让这种困惑消除了不少。

    LSTM 是我们在 RNN 中获得的重要成功。很自然地,我们也会考虑:哪里会有更加重大的突破呢?在研究人员间普遍的观点是:“Yes! 下一步已经有了——那就是 注意力 !” 这个想法是让 RNN 的每一步都从更加大的信息集中挑选信息。例如,如果你使用 RNN 来产生一个图片的描述,可能会选择图片的一个部分,根据这部分信息来产生输出的词。实际上, Xu, et al. (2015) 已经这么做了——如果你希望深入探索 注意力 可能这就是一个有趣的起点!还有一些使用注意力的相当振奋人心的研究成果,看起来有更多的东西亟待探索……

    注意力也不是 RNN 研究领域中唯一的发展方向。例如, Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起来也是很有钱途。使用生成模型的 RNN,诸如 Gregor, et al. (2015) Chung, et al.(2015) 和 Bayer & Osendorfer (2015) 提出的模型同样很有趣。在过去几年中,RNN 的研究已经相当的燃,而研究成果当然也会更加丰富!

    致谢

    I’m grateful to a number of people for helping me better understand LSTMs, commenting on the visualizations, and providing feedback on this post.

    I’m very grateful to my colleagues at Google for their helpful feedback, especially Oriol Vinyals , Greg Corrado , Jon Shlens , Luke Vilnis , and Ilya Sutskever . I’m also thankful to many other friends and colleagues for taking the time to help me, including Dario Amodei, and Jacob Steinhardt . I’m especially thankful to Kyunghyun Cho for extremely thoughtful correspondence about my diagrams.

    Before this post, I practiced explaining LSTMs during two seminar series I taught on neural networks. Thanks to everyone who participated in those for their patience with me, and for their feedback.


    原文  http://www.jianshu.com/p/9dc9f41f0b29



    e421083458
    shashoudouhenleng
    qq_25892947
    • qq_25892947

      2017-03-29 16:321楼
    • 你这搬运有点不合格啊,原文是《理解 LSTM 网络》,你的标题是RNN介绍,较易懂

    相关文章推荐

    循环神经网络(RNN, Recurrent Neural Networks)介绍

    循环神经网络(RNN, Recurrent Neural Networks)介绍   这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neura...

    人人都能用Python写出LSTM-RNN的代码![你的神经网络学习最佳起步]

    我的最佳学习法就是通过玩具代码,一边调试一边学习理论。这篇博客通过一个非常简单的python玩具代码来讲解循环神经网络。 那么依旧是废话少说,放‘码’过来!...
    • zzukun
    • zzukun
    • 2015年11月21日 22:22
    • 39614

    成为前端高手的路上,我避开了哪些坑?

    大学毕业后我成为前端开发者,从一开始的小白到现在的“高手”,我把一些感想记录下来...

    循环神经网络(RNN)

    1.NN & RNN在神经网络从原理到实现一文中已经比较详细地介绍了神经网络,下面用一张图直观地比较NN与RNN地不同。从图1中可以看出,RNN比NN多了指向自己的环,即图1中的7,8,9,10节点及...

    RNN 调参经验

    作者:萧瑟 链接:https://www.zhihu.com/question/41631631/answer/94816420 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 调...

    循环神经网络(RNN, Recurrent Neural Networks)介绍

    循环神经网络(RNN, Recurrent Neural Networks)介绍   循环神经网络(Recurrent Neural Networks,RNNs)已经在众多自然语言处理(Natu...

    TensorFlow on Android:物体识别

    如何在 Android 上面运行 TensorFlow,并利用基于 TensorFlow 的 Object Detection API 来实现一个可以识别静态图片中的物体的应用?

    深度学习(十一)RNN入门学习

    RNN中文名又称之为:递归神经网络。在计算机视觉里面用的比较少,我目前看过很多篇计算机视觉领域的相关深度学习的文章,就除了2015 ICCV的一篇图像语意分割文献《Conditional Random...
    • hjimce
    • hjimce
    • 2015年10月13日 10:46
    • 12188

    RNN-RBM for music composition 网络架构及程序解读

    RNN(recurrent neural network)是神经网络的一种,主要用于时序数据的分析,预测,分类等。 RNN的general介绍请见下一篇文章《Deep learning From I...

    RNN以及LSTM的介绍和公式梳理

    前言好久没用正儿八经地写博客了,csdn居然也有了markdown的编辑器了,最近花了不少时间看RNN以及LSTM的论文,在组内『夜校』分享过了,再在这里总结一下发出来吧,按照我讲解的思路,理解RNN...

    RNN

    在深度学习领域,传统的前馈神经网络(feed-forward neural net,简称FNN)具有出色的表现,取得了许多成功,它曾在许多不同的任务上——包括手写数字识别和目标分类上创造了记录。甚至到...

    RNN的通俗讲解(初级篇)

    程序媛的处女作,主要介绍机器学习中的RNN语言模型。用十分通俗的讲法讲解RNN理解中可能遇到的令人困惑的概念和计算。 (RNN初级篇)...
    • soiliml
    • soiliml
    • 2015年08月11日 15:50
    • 2492

    循环神经网络(RNN, Recurrent Neural Networks)学习笔记:基础理论

    RNN(Recurrent Neuron Network)是一种对序列数据建模的神经网络。继Bengio提出基于神经网络的概率语言模型并获得成功之后,Mikolov于2010年提出利用RNN建模语言模...

    通俗理解RNN

    全连接神经网络和卷积神经网络他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如,当我们在理...

    DeepLearning之RNN和LSTM详解及实现

    RNN1. 什么是RNNs RNNs的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问...

    RNN学习笔记(五)-RNN 代码实现

    RNN学习笔记(五)-RNN 代码实现

    序列标注问题中将分类标签引入RNN网络结构的尝试

    本文讲了讲我们在解决序列标注问题中将分类标签引入RNN网络结构的一次不成功的尝试。

    深度学习(Deep Learning)读书思考六:循环神经网络一(RNN)

    概述 循环神经网络(RNN-Recurrent Neural Network)是神经网络家族中的一员,擅长于解决序列化相关问题。包括不限于序列化标注问题、NER、POS、语音识别等。RNN内容比较多...

    LSTM模型理论总结(产生、发展和性能等)

    从LSTM模型原文开始,对LSTM模型提出的动机,所采取的机制、设计的模型、算法进行了梳理。对现今采用的主流的LSTM进行了介绍,对LSTM的性能进行了阐述和总结。

    深度学习应用于时间序列数据的异常检测

    本文关键点 神经网络是一种模仿生物神经元的机器学习模型,数据从输入层进入并流经激活阈值的多个节点。 递归性神经网络一种能够对之前输入数据进行内部存储记忆的神经网络,所以他们能够学习到数据流中的...

    关于RNN(Seq2Seq)的一点个人理解与感悟

    自己在这近三个月的深度网络学习中的一点小感悟,希望对自己的后面学习和实验能有所启发。

    深度学习(Deep Learning)读书思考八:循环神经网络三(RNN应用)

    概述 通过前两小节的介绍,可以清楚的了解RNN模型的网络结构以及LSTM。本小节主要介绍RNN其他变形以及应用,包括 1.GRU单元 2.序列到序列(Seq2Seq)模型 3.注...

    深度学习之六,基于RNN(GRU,LSTM)的语言模型分析与theano代码实现

    引言前面已经介绍过RNN的基本结构,最基本的RNN在传统的BP神经网络上,增加了时序信息,也使得神经网络不再局限于固定维度的输入和输出这个束缚,但是从RNN的BPTT推导过程中,可以看到,传统RNN在...

    LightRNN:高效利用内存和计算的循环神经网络

    选自arXiv.org机器之心编译摘要循环神经网络(RNN)已经在许多自然语言处理任务上取得了最出色的表现,比如语言建模和机器翻译。然而当词汇量很大时,RNN 模型会变得很大(可能超过 GPU 最大的...

    循环神经网络(一般RNN)推导

    本文章的例子来自于WILDMLvanillaRNN是相比于LSTMs和GRUs简单的循环神经网络,可以说是最简单的RNN。RNN结构RNN的一个特点是所有的隐层共享参数(U,V,W)(U, V, W)...

    使用RNN解决NLP中序列标注问题的通用优化思路

    序列标注问题应该说是自然语言处理中最常见的问题,而且很可能是最而没有之一。在深度学习没有广泛渗透到各个应用领域之前,传统的最常用的解决序列标注问题的方案是最大熵、CRF等模型,尤其是CRF,基本是最主...

    递归神经网络(RNN)简介

    在此之前,我们已经学习了前馈网络的两种结构——多层感知器和卷积神经网络,这两种结构有一个特点,就是假设输入是一个独立的没有上下文联系的单位,比如输入是一张图片,网络识别是狗还是猫。但是对于一些有明显的...

    BP神经网络和RNN神经网络的学习和实现。

    一直在研究神经网络和深度学习。所以写下一些心得。无奈总是不记得反向更新的公式,所以记下来。神经网络和深度学习并不是想象中的那么不平易近人。只要掌握两点那么自己都可以写出来了。只要注意一个前向是怎么传播...

    王小草【深度学习】笔记第七弹--RNN与应用案例:注意力模型与机器翻译

    标签(空格分隔): 王小草深度学习笔记1. 注意力模型1.2 注意力模型概述注意力模型(attention model)是一种用于做图像描述的模型。在笔记6中讲过RNN去做图像描述,但是精准度可能差强...

    RNN记忆特性

    RNN与语义分析 RNN的祖先是1982年提出的Hopfield网络。 Hopfield网络因为实现困难,外加没有合适应用,被86年后的前馈网络取代。 90年代恰逢神经网络衰落期,前馈MLP在O...

    RNN浅析(上)

    A Survey on Recurrent Neural Network

    RNN训练过程详解

    Hinton 第七课 。这里先说下RNN有recurrent neural network 和 recursive neural network两种,是不一样的,前者指的是一种人工神经网络,后者指的是...

    从最初rnn 到lstm 演变, lstm各个控制门的实现过程

    自剪枝神经网络 Simple RNN从理论上来看,具有全局记忆能力,因为T时刻,递归隐层一定记录着时序为1的状态 但由于Gradient Vanish问题,T时刻向前反向传播的Gradie...

    RNN的历史(from Deep Learning RNNaissance with Dr. Juergen Schmidhuber)

    看一个视频,Deep Learning RNNaissance。最早开始Deep Learning的是这位同志:现在的乌克兰,以前的苏联人。 最早发明Back Propagation的: 然后是L...

    RNN介绍,较易懂

    原文  http://www.jianshu.com/p/9dc9f41f0b29 Recurrent Neural Networks 人类并不是每时每刻都从一片空白的大脑开始他们的思...

    RNN学习笔记

    RNN学习笔记参考cs224d Lecture 7:Recurrent Neural NetworksRNN层数RNN不是单隐层的神经网络,对于xt−1 x_{t-1}来说,其到输出yt+1y_{t+...

    端到端的OCR:基于CNN的实现

    端到端的OCR:基于CNN的实现 OCR是一个古老的问题。这里我们考虑一类特殊的OCR问题,就是验证码的识别。传统做验证码的识别,需要经过如下步骤: 1. 二值化 2. 字符分割 3. 字符识...

    深度学习之OCR(二)——RNN/LSTM/GRU + CTC

    待研究。

    从循环神经网络(RNN)到LSTM网络

    从循环神经网络(RNN)到LSTM网络  通常,数据的存在形式有语音、文本、图像、视频等。因为我的研究方向主要是图像识别,所以很少用有“记忆性”的深度网络。怀着对循环神经网络的兴趣,在看懂了有关它的理...

    TensorFlow中RNN样例代码详解

    关于RNN的理论部分已经在上一篇文章中讲过了,本文主要讲解RNN在TensorFlow中的实现。与theano不同,TensorFlow在一个更加抽象的层次上实现了RNN单元,所以调用tensorfl...

    深度学习与自然语言处理(7)_斯坦福cs224d 语言模型,RNN,LSTM与GRU

    说明:本文为斯坦福大学CS224d课程的中文版内容笔记,已得到斯坦福大学课程@Richard Socher教授的授权翻译与发表 1.语言模型 语言模型用于对特定序列的一系列词汇的出现概率进行计算。...

    Intel系列处理器的三种工作模式

    Intel系列处理器的三种工作模式 微机中常用的Intel系列微处理器的主要发展过程是:8080,8086/8088,80186, 80286,80386,80486,Pentium,Pen...

    Matlab中image、imagesc和imshow函数用法解析

    原文转自:http://blog.csdn.net/zhupananhui/article/details/16340345 1、显示RGB图像 相同点:这三个函数都是把m*n*3的矩阵中...

    form表单的两种提交方式,submit和button的用法

    1.当输入用户名和密码为空的时候,需要判断。这时候就用到了校验用户名和密码,这个需要在jsp的前端页面写;有两种方法,一种是用submit提交。一种是用button提交。 方法一: 在jsp的...

    怎么使用jquery判断一个元素是否含有一个指定的类(class)

    在jquery中可以使用2种方法来判断一个元素是否包含一个确定的类(class)。两种方法有着相同的功能。2种方法如下: 1.           is(‘.classname’) 2....
    • taiyb
    • taiyb
    • 2014-10-15 23:02
    • 121869

    strcpy、sprintf、memcpy的区别

    最近在做远程升级的内容,通过实践才真正体会到不同拷贝函数的作用 char*strcpy(char *dest, const char *src); 其对字符串进行操作,完成从源字符串到目的字符串的...

    Http请求中Content-Type讲解以及在Spring MVC中的应用

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值...

    jquery获取所有选中的checkbox

    获取所有name为spCodeId的checkbox      var spCodesTemp = "";       $("input:checkbox[name=...

    Hbase中多版本(version)数据获取办法

    前言:本文介绍2种获取列的多版本数据的方式:shell和spring data hadoop 一、hbase shell中如何获取     1、在shell端创建一个Hbase表 creat...

    将Web项目War包部署到Tomcat服务器基本步骤

    参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html   1. 常识: 1.1 War包 War包一...

    十大Intellij IDEA快捷键

    Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按...
    • dc_726
    • dc_726
    • 2015-01-16 21:31
    • 397366

    Google Brain讲解注意力模型和增强RNN

    深度学习能力的拓展,Google Brain讲解注意力模型和增强RNN
    • jdbc
    • jdbc
    • 2016-11-22 22:10
    • 1195

    给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

    给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B >...

    利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

    K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

    Radon变换理论介绍与matlab实现--经验交流

    本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

    CT图像重建技术

    由于csdn贴图不方便,并且不能上传附件,我把原文上传到了资源空间CT图像重建技术 1.引言 计算机层析成像(Computed Tomography,CT)是通过对物体进行不同角度的射线投影测量而...

    Matlab绘图-很详细,很全面

    Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...

    linux查找目录下的所有文件中是否含有某个字符串

    查找目录下的所有文件中是否含有某个字符串  find .|xargs grep -ri "IBM"  查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名  find .|xargs g...

    Radon变换入门matlab CT原理

    http://hi.baidu.com/hi9394/blog/item/0d492b8bfd714700c8fc7aa9.html 简介 图像投影,就是说将图像在某一方向上做线性积分(或理解为累...

    Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法

    上午新建excel工作表时,发现新建完之后居然打不开 提示: 尼玛这坑爹的,难道我的Excel坏了?? 排查问题之后发现 只有新建“Microsoft Excel 工作表”时...

    js弹出框、对话框、提示框、弹窗总结

    js弹出框、对话框、提示框、弹窗总结 一、JS的三种最常见的对话框 [javascript] view plaincopy //=...

    详细:idea如何设置类头注释和方法注释

    idea和eclipse的注释还是有一些差别的。idea:类头注释:打开file->setting->Editor->Filr and Code Templates->Includes->File H...

    js中获取 table节点各tr及td的内容方法

    第一行 第二行 第三行 ...

    Kmeans算法详解及MATLAB实现

    首先要来了解的一个概念就是聚类,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它“这个东西被分为某某类”这样一些例子...

    聚类分析--k中心点算法

    k中心点算法思想:k-means是每次选簇的均值作为新的中心,迭代直到簇中对象分布不再变化。其缺点是对于离群点是敏感的,因为一个具有很大极端值的对象会扭曲数据分布。那么我们可以考虑新的簇中心不选择均值...

    springmvc接收前台(可以是ajax)传来的数组list,map,set等集合,复杂对象集合等图文详解

    前言:         相信很人都被springmvc接收数组问题折磨过,查过几个解决方案,都不能很好的解决。那些方法一般存在一个问题:把接收到的数据类型转换成你想要的类型时,不好处理。为什么说不好...

    matlab实现一元线性回归和多元线性回归

    在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。 ...

    matlab实现fbp算法

    matlab提供大量函数,可以方便的完成fbp算法 fbp

    【图像处理】平行线投影radon变换

    从一个角度,用光源照射对象物体,屏幕上会形成对象物体的影子;如果物体是半透明的,那么影子便有灰度而不是纯黑的,这说明屏幕上的像可以反映物体内部对可见光的衰减作用。我们从落于[0~π\pi]的一系列连续...

    spring mvc 请求转发和重定向

    spring mvc3中的addFlashAttribute方法 url: http://www.software8.co/wzjs/java/2943.html   记得在spring mvc...
    • jackpk
    • jackpk
    • 2014-02-12 16:15
    • 312547

    xcode 经常出现的警告问题解决方法ld: warning: directory not found for option '-L/Users/

    解决引入第三方又删除之后xcode出现的警告问题

    Unity Shader-后处理:简单的颜色调整(亮度,饱和度,对比度)

    好久没坚持写blog了,是时候开始撸一波新博文了!学习Unity有一段时间了,关于Shader的书也看了几本《Unity Shader入门精要》,《Unity 3D ShaderLab 开发实战详解》...

    [Git高级教程(二)] 远程仓库版本回退方法

    1 简介最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客。2 问题 如果提交了一个错误的版本,怎么回退版本? 如果提交了一个错误的版本到远程分支,怎么回...

    【C++】String类中的运算符重载

    模块化设计: 头文件: #ifndef operator_operator_h #define operator_operator_h #include #include ...

    使用redis存储Java对象

    Java序列化为byte数组方式。在Jedis开发中,我们很多时候希望直接把一个对象放到Redis中,然后在需要的时候取出来。Redis的key和value都支持二进制安全的字符串,存储Java对象不...

    Android 系统字体

    0、对Android字库的认识:Android系统对字体的载入和Linux桌面很像,有一个Priority Order(优先级顺序)的,当然先是西方字符,然后是一些符号字体(包括emoji字体),再就...

    .net中连接各种数据库的connection string的格式

    SQL Server ODBC Standard Security: "Driver={SQL Server};Server=Aron1;Database=pubs;Uid=sa;Pwd=asdasd...

    es6 数组对象新增方法 Array.from()将两类对象转为真正的数组

    Array.from方法用于将两类对象转为真正的数组:类似数组的对象( array-like object )和可遍历( iterable )的对象(包括 ES6 新增的数据结构 Set 和Map )...

    【数据结构】-线性表-顺序表-1787:求最大值(竟然这么水的题.....)

    1787: 求最大值题目描述输入10个数,要求输出其中的最大值。输入测试数据有多组,每组10个数。输出对于每组输入,请输出其最大值(有回车)。样例输入10 22 23 152 65 79 85 96 ...

    Android自定义控件系列一:如何测量控件尺寸

    测量控件尺寸(宽度、高度)是开发自定义控件的第一步,只有确定尺寸后才能开始画(利用canvas在画布上画,我们所使用的控件实际上都是这样画上去的)。当然,这个尺寸是需要根据控件的各个部分计算出来的,比...

    js 字符串转换成数字的三种方法

    在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形...

    Webstorm常用快捷键

    常用快捷键—Webstorm入门指南 提高代码编写效率,离不开快捷键的使用,Webstorm拥有丰富的代码快速编辑功能,你可以自由配置功能快捷键。 快捷键配置 点击“File”-> “set...

    JSONObject、JSONArray

    最近两个星期接触最多的就是json和map了。    之前用到的json,就是一个键对应一个值,超级简单的一对一关系。现在用到的json那可以层层嵌套啊,刚开始接触的时候,确实有种崩溃的赶脚,不想去...

    计算地球上两经纬度点 A B 间距离

    在 GIS 应用中,计算两点之间距离的公式非常重要,这里仅列出几种计算方法。 假设地球是一个标准球体,半径为 R, 并且假设东经为正,西经为负,北纬为正,南纬为负, 则 A(...

    js 实时监听input中值变化

    RunJS 实时监测input中值的变化

    Matlab画热度图,某地人流密度热力图

    最近帮一位朋友做可视化统计,需要统计某地铁站的人流密度,将统计好的数据用matlab作数据可视化处理,形成热度图。 一下变为实现的效果,分别有二维和三维两种视角 参数说明:X轴和Y轴建立在二维...

    Mysql字符串字段判断是否包含某个字符串的3种方法

    方法一: SELECT * FROM users WHERE emails like "%b@email.com%"; 方法二: 利用mysql 字符串函数 find...

    caffe参数理解

    solver.prototxt net: "vggface_mycmd/vggface_train_test.prototxt" test_iter: 365 test_interval: ...

    Android Accessibility 的简单用法

    Accessbility 又叫做辅助功能,是Android官方推出帮助身体不便或者操作不灵活的人来辅助操作的,也可以用来干一些别的事,比如自动抢红包啊,静默安装点击啊等已知或者未知的应用。出于某种需求...

    在Eclipse里使用JSHint 检查 js代码

    在 Eclipse 中使用 JSHint 检查 JavaScript 代码   之前使用 JSlint 来校验 JavaScript 代码,发现灵活性不够,因此改用 JSHint。按照官方的说法,JS...

    ios之正则表达式的匹配参数详解

    引言     正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 'a' 和...

    微信公众平台开发教程(十)Scope参数错误或没有Scope权限解决方法

    一 报错信息: 二 出现原因分析: 出现这种错误网上查出现有的原因是: 1. 订阅号没有相关的权限 2. 账号没有认证,没有相关的权限 那么这里遇到问题两种都...

    Oracle sqlplus 登录命令

    1、运行SQLPLUS工具   C:\Users\wd-pc>sqlplus 2、直接进入SQLPLUS命令提示符   C:\Users\wd-pc>sqlplus /nolog 3、以O...

    Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法

    Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法 Linux下c/c++开发程序崩溃(Segment fault)通常都是指针错误引起...

    sql server 备份失败[上加载的介质已格式化为支持 1 个介质簇,但根据指定的备份设备,应支持 2 个介质簇]

    ....上加载的介质已格式化为支持 1 个介质簇,但根据指定的备份设备,应支持 2 个介质簇。 这句话的意思是,我的C:\Program Files (x86)\Microsoft SQL Serv...

    linq学习(Last和First)

    比如一个学生类 class Student { public string Name { get; set; } pu...

    Java数据结构——循环链表的实现

    一、描述 循环链表:表中的最后一个节点的指针域指向头结点,整个链表形成一个环。循环链表判空条件:有的说是判断p或p->next是否等于头指针,有的说判断tail是否等于head,有的说判断head是...

    shader:最简单的改变颜色

    Shader //抬头"FixedShader/Test" //unity中选择shader的路径 //shader名字 { Properties //变量块 { MainColor( "Main_C...

    关于C#和ASP.NET中对App.config和Web.config文件里的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作

    最近我做的一些项目,经常需要用到对应用程序的配置文件操作,如app.config和web.config的配置文件,特别是对配置文件中的[appSettings]和[connectionStrings]...
    • ruijc
    • ruijc
    • 2013-04-10 17:50
    • 3622
    没有更多内容了,返回首页
    展开全文
  • 深度学习之RNN(循环神经网络)

    万次阅读 多人点赞 2018-08-12 09:31:08
    RNN概述  前面我们叙述了BP算法, CNN算法, 那么为什么还会有RNN呢?? 什么是RNN, 它到底有什么不同之处? RNN的主要应用领域有哪些呢?这些都是要讨论的问题.  1) BP算法,CNN之后, 为什么还有RNN?  细想BP算法...

    一 RNN概述

        前面我们叙述了BP算法, CNN算法, 那么为什么还会有RNN呢?? 什么是RNN, 它到底有什么不同之处? RNN的主要应用领域有哪些呢?这些都是要讨论的问题.

        1) BP算法,CNN之后, 为什么还有RNN?

        细想BP算法,CNN(卷积神经网络)我们会发现, 他们的输出都是只考虑前一个输入的影响而不考虑其它时刻输入的影响, 比如简单的猫,狗,手写数字等单个物体的识别具有较好的效果. 但是, 对于一些与时间先后有关的, 比如视频的下一时刻的预测,文档前后文内容的预测等, 这些算法的表现就不尽如人意了.因此, RNN就应运而生了.

        2) 什么是RNN?

        RNN是一种特殊的神经网络结构, 它是根据"人的认知是基于过往的经验和记忆"这一观点提出的. 它与DNN,CNN不同的是: 它不仅考虑前一时刻的输入,而且赋予了网络对前面的内容的一种'记忆'功能.

        RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。

        3) RNN的主要应用领域有哪些呢?

        RNN的应用领域有很多, 可以说只要考虑时间先后顺序的问题都可以使用RNN来解决.这里主要说一下几个常见的应用领域:

        ① 自然语言处理(NLP): 主要有视频处理文本生成, 语言模型, 图像处理

        ② 机器翻译, 机器写小说

        ③ 语音识别

        ④ 图像描述生成

        ⑤ 文本相似度计算

        ⑥ 音乐推荐网易考拉商品推荐Youtube视频推荐等新的应用领域.

     

    二 RNN(循环神经网络)

        1) RNN模型结构

        前面我们说了RNN具有时间"记忆"的功能, 那么它是怎么实现所谓的"记忆"的呢?

                                                                                          图1 RNN结构图 

        如图1所示, 我们可以看到RNN层级结构较之于CNN来说比较简单, 它主要有输入层,Hidden Layer, 输出层组成.

    并且会发现在Hidden Layer 有一个箭头表示数据的循环更新, 这个就是实现时间记忆功能的方法.

        如果到这里你还是没有搞懂RNN到底是什么意思,那么请继续往下看!

                                                                                   图2 Hidden Layer的层级展开图

        如图2所示为Hidden Layer的层级展开图. t-1, t, t+1表示时间序列. X表示输入的样本. St表示样本在时间t处的的记忆,St = f(W*St-1 +U*Xt). W表示输入的权重, U表示此刻输入的样本的权重, V表示输出的样本权重.

        在t =1时刻, 一般初始化输入S0=0, 随机初始化W,U,V, 进行下面的公式计算:

                                                        

        其中,f和g均为激活函数. 其中f可以是tanh,relu,sigmoid等激活函数,g通常是softmax也可以是其他。

        时间就向前推进,此时的状态s1作为时刻1的记忆状态将参与下一个时刻的预测活动,也就是:

                                                                              

        以此类推, 可以得到最终的输出值为:

                                                                              

        注意: 1. 这里的W,U,V在每个时刻都是相等的(权重共享).

                 2. 隐藏状态可以理解为:  S=f(现有的输入+过去记忆总结

        2) RNN的反向传播

        前面我们介绍了RNN的前向传播的方式, 那么RNN的权重参数W,U,V都是怎么更新的呢?

        每一次的输出值Ot都会产生一个误差值Et, 则总的误差可以表示为:.

        则损失函数可以使用交叉熵损失函数也可以使用平方误差损失函数.

        由于每一步的输出不仅仅依赖当前步的网络,并且还需要前若干步网络的状态,那么这种BP改版的算法叫做Backpropagation Through Time(BPTT) , 也就是将输出端的误差值反向传递,运用梯度下降法进行更新.(不熟悉BP的可以参考这里)

        也就是要求参数的梯度:

                                                               

        首先我们求解W的更新方法, 由前面的W的更新可以看出它是每个时刻的偏差的偏导数之和. 

        在这里我们以 t = 3时刻为例, 根据链式求导法则可以得到t = 3时刻的偏导数为:

                                                                               

        此时, 根据公式我们会发现, S3除了和W有关之外, 还和前一时刻S2有关.

        对于S3直接展开得到下面的式子:

                                                                         

     

        对于S2直接展开得到下面的式子:

     

                                                                         

     

        对于S1直接展开得到下面的式子:

     

                                                                          

        将上述三个式子合并得到:

                                                                          

        这样就得到了公式:

                                                                        

        这里要说明的是:表示的是S3对W直接求导, 不考虑S2的影响.(也就是例如y = f(x)*g(x)对x求导一样)

        其次是对U的更新方法. 由于参数U求解和W求解类似,这里就不在赘述了,最终得到的具体的公式如下:

                                                                       

        最后,给出V的更新公式(V只和输出O有关):

                                                                         

    三 RNN的一些改进算法

        前面我们介绍了RNN的算法, 它处理时间序列的问题的效果很好, 但是仍然存在着一些问题, 其中较为严重的是容易出现梯度消失或者梯度爆炸的问题(BP算法长时间依赖造成的). 注意: 这里的梯度消失和BP的不一样,这里主要指由于时间过长而造成记忆值较小的现象.

        因此, 就出现了一系列的改进的算法, 这里介绍主要的两种算法: LSTM GRU.

        LSTM 和 GRU对于梯度消失或者梯度爆炸的问题处理方法主要是:

     

        对于梯度消失: 由于它们都有特殊的方式存储”记忆”,那么以前梯度比较大的”记忆”不会像简单的RNN一样马上被抹除,因此可以一定程度上克服梯度消失问题。

        对于梯度爆炸:用来克服梯度爆炸的问题就是gradient clipping,也就是当你计算的梯度超过阈值c或者小于阈值-c的时候,便把此时的梯度设置成c或-c。 

        1) LSTM算法(Long Short Term Memory, 长短期记忆网络 ) --- 重要的目前使用最多的时间序列算法

                                

                                                                                     图3 LSTM算法结构图

        如图3为LSTM算法的结构图. 

        和RNN不同的是: RNN中,就是个简单的线性求和的过程. 而LSTM可以通过“”结构来去除或者增加“细胞状态”的信息,实现了对重要内容的保留和对不重要内容的去除. 通过Sigmoid层输出一个0到1之间的概率值,描述每个部分有多少量可以通过,0表示“不允许任务变量通过”,1表示“运行所有变量通过 ”.

        用于遗忘的门叫做"遗忘门", 用于信息增加的叫做"信息增加门",最后是用于输出的"输出门". 这里就不展开介绍了.

        此外,LSTM算法的还有一些变种.

         如图4所示, 它增加“peephole connections”层 , 让门层也接受细胞状态的输入.

                                                         

                                                                                  图4 LSTM算法的一个变种

        如图5所示为LSTM的另外一种变种算法.它是通过耦合忘记门和更新输入门(第一个和第二个门);也就是不再单独的考虑忘记什么、增加什么信息,而是一起进行考虑。

                                                         

                                                                                    图5 LSTM算法的一个变种

     

        2) GRU算法

        GRU是2014年提出的一种LSTM改进算法. 它将忘记门和输入门合并成为一个单一的更新门, 同时合并了数据单元状态和隐藏状态, 使得模型结构比之于LSTM更为简单.

                                                           

        其各个部分满足关系式如下:

                                                                         

    四 基于Tensorflow的基本操作和总结

        使用tensorflow的基本操作如下:

    # _*_coding:utf-8_*_
    
    import tensorflow as tf
    import numpy as np
    
    '''
        TensorFlow中的RNN的API主要包括以下两个路径:
            1) tf.nn.rnn_cell(主要定义RNN的几种常见的cell)
            2) tf.nn(RNN中的辅助操作)
    '''
    # 一 RNN中的cell
    # 基类(最顶级的父类): tf.nn.rnn_cell.RNNCell()
    # 最基础的RNN的实现: tf.nn.rnn_cell.BasicRNNCell()
    # 简单的LSTM cell实现: tf.nn.rnn_cell.BasicLSTMCell()
    # 最常用的LSTM实现: tf.nn.rnn_cell.LSTMCell()
    # RGU cell实现: tf.nn.rnn_cell.GRUCell()
    # 多层RNN结构网络的实现: tf.nn.rnn_cell.MultiRNNCell()
    
    # 创建cell
    # cell = tf.nn.rnn_cell.BasicRNNCell(num_units=128)
    # print(cell.state_size)
    # print(cell.output_size)
    
    # shape=[4, 64]表示每次输入4个样本, 每个样本有64个特征
    # inputs = tf.placeholder(dtype=tf.float32, shape=[4, 64])
    
    # 给定RNN的初始状态
    # s0 = cell.zero_state(4, tf.float32)
    # print(s0.get_shape())
    
    # 对于t=1时刻传入输入和state0,获取结果值
    # output, s1 = cell.call(inputs, s0)
    # print(output.get_shape())
    # print(s1.get_shape())
    
    # 定义LSTM cell
    lstm_cell = tf.nn.rnn_cell.LSTMCell(num_units=128)
    # shape=[4, 64]表示每次输入4个样本, 每个样本有64个特征
    inputs = tf.placeholder(tf.float32, shape=[4, 48])
    # 给定初始状态
    s0 = lstm_cell.zero_state(4, tf.float32)
    # 对于t=1时刻传入输入和state0,获取结果值
    output, s1 = lstm_cell.call(inputs, s0)
    print(output.get_shape())
    print(s1.h.get_shape())
    print(s1.c.get_shape())

        当然, 你可能会发现使用cell.call()每次只能调用一个得到一个状态, 如有多个状态需要多次重复调用较为麻烦, 那么我们怎么解决的呢? 可以参照后面的基于RNN的手写数字识别单词预测的实例查找解决方法.

     

        本文主要介绍了一种时间序列的RNN神经网络及其基础上衍生出来的变种算法LSTM和GRU算法, 也对RNN算法的使用场景作了介绍. 

     

        当然, 由于篇幅限制, 这里对于双向RNNs和多层的RNNs没有介绍. 另外, 对于LSTM的参数更新算法在这里也没有介绍, 后续补上吧!

        最后, 如果你发现了任何问题, 欢迎一起探讨, 共同进步!!

    展开全文
  • 循环神经网络(RNN)原理通俗解释

    万次阅读 多人点赞 2018-07-24 21:21:44
    1.RNN怎么来的? 2.RNN的网络结构及原理 3.RNN的改进1:双向RNN 4.RNN的改进2:深层双向RNN 4.1 Pyramidal RNN 5.RNN的训练-BPTT 6.RNN与CNN的结合应用:看图说话 7.RNN项目练手 1.RNN怎么来的? 循环神经...

    1.RNN怎么来的?

    循环神经网络的应用场景比较多,比如暂时能写论文,写程序,写诗,但是,(总是会有但是的),但是他们现在还不能正常使用,学习出来的东西没有逻辑,所以要想真正让它更有用,路还很远。

    这是一般的神经网络应该有的结构:
    这里写图片描述

    既然我们已经有了人工神经网络和卷积神经网络,为什么还要循环神经网络?
    原因很简单,无论是卷积神经网络,还是人工神经网络,他们的前提假设都是:元素之间是相互独立的,输入与输出也是独立的,比如猫和狗。
    但现实世界中,很多元素都是相互连接的,比如股票随时间的变化,一个人说了:我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去_____.这里填空,人应该都知道是填“云南“。因为我们是根据上下文的内容推断出来的,但机会要做到这一步就相当得难了。因此,就有了现在的循环神经网络,他的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记忆。

    2.RNN的网络结构及原理

    它的网络结构如下:
    这里写图片描述
    其中每个圆圈可以看作是一个单元,而且每个单元做的事情也是一样的,因此可以折叠呈左半图的样子。用一句话解释RNN,就是一个单元结构重复使用

    RNN是一个序列到序列的模型,假设xt1,xt,xt+1是一个输入:“我是中国“,那么ot1,ot就应该对应”是”,”中国”这两个,预测下一个词最有可能是什么?就是ot+1应该是”人”的概率比较大。

    因此,我们可以做这样的定义:

    Xt:tot:tSt:t
    。因为我们当前时刻的输出是由记忆和当前时刻的输入决定的,就像你现在大四,你的知识是由大四学到的知识(当前输入)和大三以及大三以前学到的东西的(记忆)的结合,RNN在这点上也类似,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此就定义了RNN的基础:
    St=f(UXt+WSt1)
    大家可能会很好奇,为什么还要加一个f()函数,其实这个函数是神经网络中的激活函数,但为什么要加上它呢?
    举个例子,假如你在大学学了非常好的解题方法,那你初中那时候的解题方法还要用吗?显然是不用了的。RNN的想法也一样,既然我能记忆了,那我当然是只记重要的信息啦,其他不重要的,就肯定会忘记,是吧。但是在神经网络中什么最适合过滤信息呀?肯定是激活函数嘛,因此在这里就套用一个激活函数,来做一个非线性映射,来过滤信息,这个激活函数可能为tanh,也可为其他。

    假设你大四快毕业了,要参加考研,请问你参加考研是不是先记住你学过的内容然后去考研,还是直接带几本书去参加考研呢?很显然嘛,那RNN的想法就是预测的时候带着当前时刻的记忆St去预测。假如你要预测“我是中国“的下一个词出现的概率,这里已经很显然了,运用softmax来预测每个词出现的概率再合适不过了,但预测不能直接带用一个矩阵来预测呀,所有预测的时候还要带一个权重矩阵V,用公式表示为:

    ot=softmax(VSt)
    其中ot就表示时刻t的输出。

    RNN中的结构细节:
    1.可以把St当作隐状态,捕捉了之前时间点上的信息。就像你去考研一样,考的时候记住了你能记住的所有信息。
    2.ot是由当前时间以及之前所有的记忆得到的。就是你考研之后做的考试卷子,是用你的记忆得到的。
    3.很可惜的是,St并不能捕捉之前所有时间点的信息。就像你考研不能记住所有的英语单词一样。
    4.和卷积神经网络一样,这里的网络中每个cell都共享了一组参数(U,V,W),这样就能极大的降低计算量了。
    5.ot在很多情况下都是不存在的,因为很多任务,比如文本情感分析,都是只关注最后的结果的。就像考研之后选择学校,学校不会管你到底怎么努力,怎么心酸的准备考研,而只关注你最后考了多少分。

    3.RNN的改进1:双向RNN

    在有些情况,比如有一部电视剧,在第三集的时候才出现的人物,现在让预测一下在第三集中出现的人物名字,你用前面两集的内容是预测不出来的,所以你需要用到第四,第五集的内容来预测第三集的内容,这就是双向RNN的想法。如图是双向RNN的图解:
    这里写图片描述

    St1=f(U1Xt+W1St1+b1)
    :St2=f(U2Xt+W2St1+b2)
    ot=softmax(V[St1;St2])
    这里的[St1;St2]做的是一个拼接,如果他们都是1000X1维的,拼接在一起就是1000X2维的了。

    双向RNN需要的内存是单向RNN的两倍,因为在同一时间点,双向RNN需要保存两个方向上的权重参数,在分类的时候,需要同时输入两个隐藏层输出的信息。

    4.RNN的改进2:深层双向RNN

    深层双向RNN 与双向RNN相比,多了几个隐藏层,因为他的想法是很多信息记一次记不下来,比如你去考研,复习考研英语的时候,背英语单词一定不会就看一次就记住了所有要考的考研单词吧,你应该也是带着先前几次背过的单词,然后选择那些背过,但不熟的内容,或者没背过的单词来背吧。

    深层双向RNN就是基于这么一个想法,他的输入有两方面,第一就是前一时刻的隐藏层传过来的信息ht1(i),和当前时刻上一隐藏层传过来的信息ht(i1)=[ht(i1);ht(i1)],包括前向和后向的。
    这里写图片描述

    我们用公式来表示是这样的:
    这里写图片描述
    然后再利用最后一层来进行分类,分类公式如下:
    这里写图片描述

    4.1 Pyramidal RNN

    其他类似的网络还有Pyramidal RNN:
    这里写图片描述
    我们现在有一个很长的输入序列,可以看到这是一个双向的RNN,上图是谷歌的W.Chan做的一个测试,它原先要做的是语音识别,他要用序列到序列的模型做语音识别,序列到序列就是说,输入一个序列然后就输出一个序列。

    由图我们发现,上一层的两个输出,作为当前层的输入,如果是非常长的序列的话,这样做的话,每一层的序列都比上一层要短,但当前层的输入f(x)也会随之增多,貌似看一起相互抵消,运算量并没有什么改进。

    但我们知道,对于一层来说,它是从前往后转的,比如要预测一个股市的变化,以天为单位,假如要预测明天的股市变化,你就要用今天,以及今天之前的所有数据,我们暂时无法只用昨天的数据,不用今天的数据,预测明天的数据,也即是说,预测必须具有连续性。
    但每一层的f运算是可以并行的,从这个角度来看,运算量还是可以接受的,特别是在原始输入序列较短的时候还是有优势的。

    5.RNN的训练-BPTT

    如前面我们讲的,如果要预测t时刻的输出,我们必须先利用上一时刻(t-1)的记忆和当前时刻的输入,得到t时刻的记忆:

    st=tanh(Uxt+Wst1)
    然后利用当前时刻的记忆,通过softmax分类器输出每个词出现的概率:
    y^t=softmax(Vst)
    为了找出模型最好的参数,U,W,V,我们就要知道当前参数得到的结果怎么样,因此就要定义我们的损失函数,用交叉熵损失函数:
    tEt(yt,y^t)=ytlogy^t
    其中ytt时刻的标准答案,是一个只有一个是1,其他都是0的向量;y^t是我们预测出来的结果,与yt的维度一样,但它是一个概率向量,里面是每个词出现的概率。因为对结果的影响,肯定不止一个时刻,因此需要把所有时刻的造成的损失都加起来:
    E(yt,y^t)=tEt(yt,y^t)=tytlogy^t

    如图所示,你会发现每个cell都会有一个损失,我们已经定义好了损失函数,接下来就是熟悉的一步了,那就是根据损失函数利用SGD来求解最优参数,在CNN中使用反向传播BP算法来求解最优参数,但在RNN就要用到BPTT,它和BP算法的本质区别,也是CNN和RNN的本质区别:CNN没有记忆功能,它的输出仅依赖与输入,但RNN有记忆功能,它的输出不仅依赖与当前输入,还依赖与当前的记忆。这个记忆是序列到序列的,也就是当前时刻收到上一时刻的影响,比如股市的变化。

    因此,在对参数求偏导的时候,对当前时刻求偏导,一定会涉及前一时刻,我们用例子看一下:

    假设我们对E3的W求偏导:它的损失首先来源于预测的输出y^3,预测的输出又是来源于当前时刻的记忆s3,当前的记忆又是来源于当前的输出和截止到上一时刻的记忆:s3=tanh(Ux3+Ws2)
    因此,根据链式法则可以有:

    E3W=E3y^3y^3s3s3W
    但是,你会发现,s2=tanh(Ux2+Ws1),也就是s2里面的函数还包含了W,因此,这个链式法则还没到底,就像图上画的那样,所以真正的链式法则是这样的:
    这里写图片描述
    我们要把当前时刻造成的损失,和以往每个时刻造成的损失加起来,因为我们每一个时刻都用到了权重参数W。和以往的网络不同,一般的网络,比如人工神经网络,参数是不同享的,但在循环神经网络,和CNN一样,设立了参数共享机制,来降低模型的计算量。

    6.RNN与CNN的结合应用:看图说话

    在图像处理中,目前做的最好的是CNN,而自然语言处理中,表现比较好的是RNN,因此,我们能否把他们结合起来,一起用呢?那就是看图说话了,这个原理也比较简单,举个小栗子:假设我们有CNN的模型训练了一个网络结构,比如是这个

    最后我们不是要分类嘛,那在分类前,是不是已经拿到了图像的特征呀,那我们能不能把图像的特征拿出来,放到RNN的输入里,让他学习呢?

    之前的RNN是这样的:

    St=tanh(UXt+WSt1)
    我们把图像的特征加在里面,可以得到:
    St=tanh(UXt+WSt1+VX)
    其中的X就是图像的特征。如果用的是上面的CNN网络,X应该是一个4096X1的向量。

    注:这个公式只在第一步做,后面每次更新就没有V了,因为给RNN数据只在第一次迭代的时候给。

    7.RNN项目练手

    RNN可以写歌词,写诗等,这有个项目可以玩玩,还不错。
    Tensorflow实现RNN

    展开全文
  • RNN详解(Recurrent Neural Network)

    千次阅读 2019-07-21 12:06:19
    RNN用于处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词...

    一.概述

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

    RNN重要特点:每一步的参数共享

    二.RNN 多结构详解

    RNN 有多种结构,如下所示:

    1. one-to-one

                          

     最基本的单层网络,输入是x,经过变换Wx+b和激活函数f得到输出y。 

    2. one-to-n

                 

     还有一种结构是把输入信息X作为每个阶段的输入:

              

    下图省略了一些X的圆圈,是一个等价表示:

                     

    这种 one-to-n 的结构可以处理的问题有:

    • 从图像生成文字(image caption),此时输入的X就是图像的特征,而输出的y序列就是一段句子,就像看图说话等
    • 从类别生成语音或音乐等

    3.n-to-n

    最经典的RNN结构,输入、输出都是等长的序列数据。

                     

    假设输入为X=(x1, x2, x3, x4),每个x是一个单词的词向量。

    为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。先从h1的计算开始看:

                        

     h2的计算和h1类似。要注意的是,在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,一定要牢记。

                     

    依次计算剩下来的(使用相同的参数U,W,b):

               

    这里为了方便起见,只画出序列长度为4的情况,实际上,这个计算过程可以无限地持续下去。得到输出值的方法就是直接通过h进行计算:

                            

    正如之前所说,一个箭头就表示对对应的向量做一次类似于f(Wx+b)的变换,这里的这个箭头就表示对h1进行一次变换,得到输出y1。

    剩下的输出类似进行(使用和y1同样的参数V和c):

                    

    这就是最经典的RNN结构,它的输入是x1, x2, …..xn,输出为y1, y2, …yn,也就是说,输入和输出序列必须要是等长的。由于这个限制的存在,经典RNN的适用范围比较小,但也有一些问题适合用经典的RNN结构建模,如:

    • 计算视频中每一帧的分类标签。因为要对每一帧进行计算,因此输入和输出序列等长。
    • 输入为字符,输出为下一个字符的概率。这就是著名的Char RNN(详细介绍请参考http://karpathy.github.io/2015/05/21/rnn-effectiveness/,Char RNN可以用来生成文章,诗歌,甚至是代码,非常有意思)。

    4.n-to-one

    要处理的问题输入是一个序列,输出是一个单独的值而不是序列,应该怎样建模呢?实际上,我们只在最后一个h上进行输出变换就可以了:

                      

    这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。

    5.Encoder-Decoder

    n-to-m:

    还有一种是 n-to-m,输入、输出为不等长的序列。

    这种结构是Encoder-Decoder,也叫Seq2Seq,是RNN的一个重要变种。原始的n-to-n的RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。为此,Encoder-Decoder结构先将输入数据编码成一个上下文语义向量c:

                       

    语义向量c可以有多种表达方式,最简单的方法就是把Encoder的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到c,也可以对所有的隐状态做变换。

    拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。Decoder的RNN可以与Encoder的一样,也可以不一样。具体做法就是将c当做之前的初始状态h0输入到Decoder中:

                   

     还有一种做法是将c当做每一步的输入:

                         

     Encoder-Decoder 应用

    由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:

    • 机器翻译:Encoder-Decoder的最经典应用,事实上这结构就是在机器翻译领域最先提出的。
    • 文本摘要:输入是一段文本序列,输出是这段文本序列的摘要序列。
    • 阅读理解:将输入的文章和问题分别编码,再对其进行解码得到问题的答案。
    • 语音识别:输入是语音信号序列,输出是文字序列。

    Encoder-Decoder 框架

    Encoder-Decoder 不是一个具体的模型,是一种框架。

    • Encoder:将 input序列 →转成→ 固定长度的向量
    • Decoder:将 固定长度的向量 →转成→ output序列
    • Encoder 与 Decoder 可以彼此独立使用,实际上经常一起使用

    因为最早出现的机器翻译领域,最早广泛使用的转码模型是RNN。其实模型可以是 CNN /RNN /BiRNN /LSTM /GRU /…

    Encoder-Decoder 缺点

    • 最大的局限性:编码和解码之间的唯一联系是固定长度的语义向量c
    • 编码要把整个序列的信息压缩进一个固定长度的语义向量c
    • 语义向量c无法完全表达整个序列的信息
    • 先输入的内容携带的信息,会被后输入的信息稀释掉,或者被覆盖掉
    • 输入序列越长,这样的现象越严重,这样使得在Decoder解码时一开始就没有获得足够的输入序列信息,解码效果会打折扣

    因此,为了弥补基础的 Encoder-Decoder 的局限性,提出了attention机制。

    6.Attention Mechanism

    注意力机制(attention mechanism)是对基础Encoder-Decoder的改良。Attention机制通过在每个时间输入不同的c来解决问题,下图是带有Attention机制的Decoder:

                       

    每一个c会自动去选取与当前所要输出的y最合适的上下文信息。具体来说,我们用aij衡量Encoder中第j阶段的hj和解码时第i阶段的相关性,最终Decoder中第i阶段的输入的上下文信息 ci就来自于所有 hj 对 aij 的加权和。

    以机器翻译为例(将中文翻译成英文):

                          

    输入的序列是“我爱中国”,因此,Encoder中的h1、h2、h3、h4就可以分别看做是“我”、“爱”、“中”、“国”所代表的信息。在翻译成英语时,第一个上下文c1应该和 “我” 这个字最相关,因此对应的 a11 就比较大,而相应的 a12、a13、a14 就比较小。c2应该和“爱”最相关,因此对应的 a22 就比较大。最后的c3和h3、h4最相关,因此 a33、a34 的值就比较大。

    至此,关于Attention模型,只剩最后一个问题了,那就是:这些权重 aij 是怎么来的?

    事实上,aij 同样是从模型中学出的,它实际和Decoder的第i-1阶段的隐状态、Encoder第j个阶段的隐状态有关。

    同样还是拿上面的机器翻译举例, a1j 的计算(此时箭头就表示对h’和 hj 同时做变换):

                      

     a2j 的计算:

                     

    a3j 的计算:

                     

     以上就是带有Attention的Encoder-Decoder模型计算的全过程。

    Attention 的优点:

    • 在机器翻译时,让生词不只是关注全局的语义向量c,增加了“注意力范围”。表示接下来输出的词要重点关注输入序列种的哪些部分。根据关注的区域来产生下一个输出。
    • 不要求编码器将所有信息全输入在一个固定长度的向量中。
    • 将输入编码成一个向量的序列,解码时,每一步选择性的从序列中挑一个子集进行处理。
    • 在每一个输出时,能够充分利用输入携带的信息,每个语义向量Ci不一样,注意力焦点不一样。

    Attention 的缺点

    • 需要为每个输入输出组合分别计算attention。50个单词的输出输出序列需要计算2500个attention。
    • attention在决定专注于某个方面之前需要遍历一遍记忆再决定下一个输出是以什么。

    Attention的另一种替代方法是强化学习,来预测关注点的大概位置。但强化学习不能用反向传播算法端到端的训练。

    7.Multilayer RNNs

      RNNs也可以有多个隐层。

                                            

                                                                                          h_t^l=tanhW^l\begin{pmatrix} h_t^{l-1} & \\ h_{t-1}^l & \end{pmatrix}

                                                                                         h\in{R^n}            W^l[n\times 2n]

    三.RNN数学原理

    给出一个典型的RNN:

                          è¿éåå¾çæè¿°

    在图中:有一条单向流动的信息流是从输入单元到达隐藏单元的,与此同时另一条单向流动的信息流从隐藏单元到达输出单元。在某些情况下,RNNs会打破后者的限制,引导信息从输出单元返回隐藏单元,这些被称为“Back Projections”,并且隐藏层的输入还包括上一隐藏层的状态,即隐藏层内的节点可以自连也可以互连。(这实际上就是LSTM)

    右侧为计算时便于理解记忆而产开的结构。简单说,x为输入层,o为输出层,s为隐含层,而t指第几次的计算;V,W,U为权重,其中计算第t次的隐含层状态时为: 
                                                                s_{t} = f(U*x_t + W*s_{t-1})

    实现当前输入结果与之前的计算挂钩的目的。

    表达得更直观的图有: 

                                          è¿éåå¾çæè¿°

                                                è¿éåå¾çæè¿°

    按照上图所示,可知道RNN网络前向传播过程中满足下面的公式:                                                                                                  
                                                               è¿éåå¾çæè¿°
    其代价函数可以是重构的误差: 
                                                                    è¿éåå¾çæè¿°
    也可以是交叉熵: 

                                         è¿éåå¾çæè¿°

     

    四.LSTM

    由于RNN模型如果需要实现长期记忆的话需要将当前的隐含态的计算与前n次的计算挂钩,即:                                                                                                        s_t=f(U*x_t+W_1*s_{t-1}+W_2*s_{t-2}+...W_n*s_{t-n})

    那样的话计算量会呈指数式增长,导致模型训练的时间大幅增加,因此RNN模型一般不直接用来进行长期记忆计算。另外,传统RNN处理不了长期依赖问题,这是个致命伤。但LSTM解决了这个问题。

    Long Short Term网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由 Hochreiter & Schmidhuber (1997) 提出,并在近期被 Alex Graves 进行了改良和推广。对于很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。

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

    所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的RNN中,这个重复的模块只有一个非常简单的结构,例如一个 tanh层。 

                         è¿éåå¾çæè¿°

    标准 RNN 中的重复模块包含单一的层。

    LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

                             

    LSTM 中的重复模块包含四个交互的层。

                              è¿éåå¾çæè¿°

    在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。

    LSTM 的关键就是细胞状态(cell),水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。 

                       è¿éåå¾çæè¿°

    LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。 

    è¿éåå¾çæè¿°

    Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!

    LSTM中有3个控制门:输入门,输出门,记忆门。

    (1)forget gate:选择忘记过去某些信息:

                           

    (2)input gate:记忆现在的某些信息:

                       

    (3) 将过去与现在的记忆进行合并:

                           

    (4)output gate:输出

                          

    公式总结:

                                                              \begin{pmatrix} i\\ f\\ o\\ g \end{pmatrix}=\begin{pmatrix} \sigma \\ \sigma\\ \sigma\\ tanh \end{pmatrix}W\begin{pmatrix} h_{t-1}\\ x_t \end{pmatrix}

                                                                  c_t=f\odot c_{t-1}+i\odot g

                                                                     h_t=o\odot tanh(c_t)

     

    展开全文
  • 学习(配置基础环境,下载开发IDE) 配置环境 ...(python 2+ 官方停止更新了,所以还是下载python 3+的吧) Anaconda下载安装好了之后,就可以用这个工具来下载其他的工具了,包括python其他版本。...
  • RNN&LSTM学习笔记

    2020-04-15 10:37:18
    深度学习-RNN&LSTM学习笔记 RNN中的关键词: 时序数据:有前后依赖关系的数据序列。例如:对一个包含 3 个单词的语句,那么展开的网络便是一个有 3 层神经网络,每一层代表一个单词。 循环:RNN 之所以称为循环...
  • RNN

    万次阅读 多人点赞 2020-04-15 18:17:59
    RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络。首先我们要明确什么是序列数据,摘取百度百科词条:时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化...
  • 循环神经网络(RNN)简介

    万次阅读 2018-09-01 17:19:22
    人工神经网络介绍参考: https://blog.csdn.net/fengbingchun/article/details/50274471  ... 这里在以上两篇基础上整理介绍循环神经网络: 前馈网络可以分为若干”层”,各层按信号传输先后顺序依次排列...
  • 循环神经网络(RNN, Recurrent Neural Networks)介绍

    万次阅读 多人点赞 2017-09-10 14:04:53
    循环神经网络(RNN, Recurrent Neural Networks)介绍   这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/,在这篇文章中,加入了一些新的...
  • CNN和RNN区别

    万次阅读 2017-09-07 11:25:16
    CNN和RNN区别 CNN主要用于图像;RNN主要用于时序和NLP。 当CNN、RNN都用于NLP时,它们的区别在于: RNN(循环神经网络),当前节点的输入包含之前所有节点信息。 RNN(递归神经网络),当前节点的输入以树结构...
  • CNN+RNN

    万次阅读 2015-08-25 14:12:24
    CNN,RNN(recurrent, 下同)结合到一起可以建立一个更好的model 1. CRNN(先CNN,后RNN) References: An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to ...
  • 多层RNN的网络结构示意图

    千次阅读 2017-03-08 16:43:59
    说明:多层RNN其实跟多层NN是一样的。 1、输入层都会接入隐层。 2、每个RNN隐层神经元都会接收该神经元前一时刻的状态,以及其他神经元前一时刻的状态。 3、多层的RNN跟多层的NN其实,就是输入不仅接收当前的输入,...
  • LSTM与RNN的比较

    万次阅读 多人点赞 2018-04-14 17:11:12
    之前提到了RNN,也提到了RNN在处理long term memory的时候存在缺陷,因此LSTM应运而生。LSTM是一种变种的RNN,它的精髓在于引入了细胞状态这样一个概念,不同于RNN只考虑最近的状态,LSTM的细胞状态会决定哪些状态...
  • 使用Keras进行深度学习:RNN

    万次阅读 2018-04-27 20:41:55
    RNN---循环神经网络,在这里主要将它用在处理与预测序列数据方面.1.RNN网络结构与原理详解: 该图的左边是未展开的RNN模型,展开后的RNN模型在右边详细的进行了展示.RNN网络的最为重要的一点就是其具有时序性,该...
  • RNN:几张图搞懂RNN模型构建

    千次阅读 2018-03-01 11:26:23
    循环神经网络(RNN, Recurrent Neural Networks)介绍:http://blog.csdn.net/u014365862/article/details/50896554
  • TensorFlow 学习笔记 - 几种 LSTM 对比

    千次阅读 2018-05-04 19:26:18
    TensorFlow 学习笔记 - 几种 ...tf.nn.rnn_cell.BasicLSTMCell tf.nn.static_rnn tf.nn.static_rnn tf.nn.dynamic_rnn tf.contrib.cudnn_rnn tf.contrib.rnn.LSTMBlockCell tf.contrib.rnn.LSTMBlockFusedCell tf....
  • 你要的答案或许都在这里:小鹏的博客目录我的GitHub:https://github.com/MachineLP/train_cnn-rnn-attention 自己搭建的一个框架,包含模型有:vgg(vgg16,vgg19), resnet(resnet_v2_50,resnet_v2_101,resnet_v2_...
  • 基于RNN的文本分析及预测

    千次阅读 2017-05-05 22:10:20
    一、RNN简要介绍 RNN(RecurrentNeural Networks):循环神经网络。 CNN是一个典型的空间上深度的神经网络,RNN是在时间上深度的神经网络 语言模型和文本生成研究: Recurrentneural network based ...
  • RNN模型

    千次阅读 多人点赞 2018-07-27 21:19:59
    RNN模型 我们先来看一个RNN经典结构,图1展示了一个典型按时间展开后的RNN结构。 从图1可以看出,RNN在每一个时刻都有一个输入Xt,然后根据当前节点的状态At计算输出值ht,而At是根据上一时刻的状态At-1和当前的...
1 2 3 4 5 ... 20
收藏数 52,157
精华内容 20,862
关键字:

rnn