常见循环神经网络概括

循环神经网络(recurrent neural network)是一类专门用于处理序列数据的神经网络,就像卷积神经网络是专门处理网格化数据(如图像)的神经网络,卷积神经网络是专门用于处理序列 x(1),⋯,x(τ)x^{(1)}, \cdots, x^{(\tau)}x(1),⋯,x(τ) 的神经网络。

本文主要介绍花书中提到的几种循环神经网络。

循环神经网络中的一些重要设计模式包括以下几种:

  1. 每个时间步都有输出,并且隐藏单元之间有循环连接的循环网络,如图

  2. 每个时间步都产生一个输出,只有当前时刻的输出到下个时刻的隐藏单元之间有循环连接的循环网络。

  3. 隐藏单元之间存在循环连接,但读取整个序列后产生单个输出的循环网络。

关于图 10.3 的前向传播公式解释如下

假设图中的隐藏单元的激活函数是 tanh,输出是离散的,表示离散变量的常规方式是把输出 ooo 作为每个离散变量可能值的非标准化对数概率,然后经过 softmaxsoftmaxsoftmax 函数后续处理后,获得标准化后概率输出向量 y^\hat{y}y^​,RNN 从特定的初始状态 h(0)h^{(0)}h(0) 开始前向传播。从 t=1t=1t=1 到 t=τt=\taut=τ 的每个时间步,我们用如下式子更新

a(t)=b+Wh(t−1)+Ux(t)a^{(t)}=b+Wh^{(t-1)}+Ux^{(t)}a(t)=b+Wh(t−1)+Ux(t)

h(t)=tanh(at)h^{(t)}=tanh(a^{t})h(t)=tanh(at)

o(t)=c+Vh(t)o^{(t)}=c+Vh^{(t)}o(t)=c+Vh(t)

y^=softmax(o(t))\hat{y}=softmax(o^{(t)})y^​=softmax(o(t))

其中的参数的偏置向量 b,cb, cb,c 连同权重矩阵 U,V,WU,V,WU,V,W ,分别对应于输入到隐藏、隐藏到输出和隐藏到隐藏的连接。这个循环网络将一个输入序列映射到相同长度的输出序列。与 xxx 序列配对的 yyy 的总损失就是所有时间步的损失之和。例如, L(t)L^{(t)}L(t) 为给定的 x(1),⋯,x(τ)x^{(1)} ,\cdots,x^{(\tau)}x(1),⋯,x(τ) 后 y(t)y^{(t)}y(t) 的负对数似然。(实际应用中对于分类问题一般使用交叉熵损失函数)

L({x(1),⋯,x(τ)},{y(1),⋯,y(τ)})=∑tL(t)=−∑tlog⁡pmodel(y(t)∣x(1),⋯,x(t))L(\{x^{(1)} ,\cdots,x^{(\tau)}\}, \{y^{(1)} ,\cdots,y^{(\tau)}\})=\sum_{t}L^{(t)}=-\sum_t\log p_{model}(y^{(t)}|x^{(1)} ,\cdots,x^{(t)})L({x(1),⋯,x(τ)},{y(1),⋯,y(τ)})=t∑​L(t)=−t∑​logpmodel​(y(t)∣x(1),⋯,x(t))

其中 pmodel(y(t)∣x(1),⋯,x(t))p_{model}(y^{(t)}|x^{(1)} ,\cdots,x^{(t)})pmodel​(y(t)∣x(1),⋯,x(t)) 需要读取模型输出向量 y^(t)\hat{y}^{(t)}y^​(t) 对应 y(t)y^{(t)}y(t) 的项。关于循环神经网络的反向传播算法称为通过时间反向传播(back-propagation through time, BPTT)。关于其各个参数的求导可以参考RNN 公式及其推导_CZWin32768的博客-CSDN博客_rnn公式推导

关于 RNN 的梯度消失

1. 导师驱动过程和输出循环网络

对于图 10.4 所展示的神经网络,只有在一个实践部的输出和下一个时间步的隐藏单元间存在循环连接的网络没有那么强大,因为输出单元明确地训练成匹配训练集的目标,它们不太能捕获关于过去输入历史的必要信息,除非用户知道如何描述系统的全部状态,并将它作为训练目标的一部分。但是消除隐藏到隐藏单元的优点在于,任何基于比较时刻 ttt 的预测和时刻 ttt 的训练目标的损失函数的所有时间步都解耦了,因此我们可以让训练并行化。

由图 10.4 那种连接方式构成的循环神经网络可以使用导师驱动过程(teacher forcing) 进行训练。示意图

这样的训练方式在测试时可能会出现问题,因为训练期间网络看到的输入和测时期间的输入有不同,减轻此问题的一种办法是同时使用导师驱动过程和自由运行的输入进行训练,例如展开循环的输出到输入路径上预测几个步骤正确目标值。另一种方式是通过随意选择生成值或真实的数据值作为输入以减小训练时和测试时看到的输入之间的差别。

这类 RNN 的特点:输入是向量序列,输入是等长的向量序列

2.基于上下文的 RNN 序列建模

和前面讨论的将输入 xxx 看作向量序列不同,也可以将 xxx 看作单个向量作为输入。当 xxx 是一个固定大小的向量时,我们可以简单地将其看作产生 yyy 序列 RNN 的额外输入,将额外输入提供到 RNN 的一些常见方法是:

  1. 在每个时刻作为一个额外输入,或
  2. 作为初始状态 h(0)h^{(0)}h(0) ,或
  3. 结合两种方式

此时 y(t),⋯,y(t+n)y^{(t)},\cdots,y^{(t+n)}y(t),⋯,y(t+n) 之间独立,如果不想它们独立,可以使用下图的连接方法

这类 RNN 的特点:输入是一个向量,输入是任意长的的向量序列

3.双向RNN

前面考虑的循环神经网络只考虑了右边的使用左边的信息,而没有考虑到左边的也需要右边的信息,所以引申出了双向的 RNN 如图

这个想法也可以拓展到二维输入,如图像,由 4 个 RNN 组成,分别计算 上下左右 四个方向的信息,相比于卷积,可以记住更长期的信息。

4.Sequence to sequence

特点:将输入向量序列映射到不一定等长的向量序列。如语音识别、机器翻译等场景都有应用。

网络是基于编码-解码架构的,编码器处理输入序列,输出上下文信息 CCC (可以使用最后一个隐藏层输出),解码器用基于上下文的 RNN 序列建模方法(图 10.9),这样就达到了让输入和输出不一定等长的目的。

5.渗透单元和其他多时间尺度的策略

因为普通的 RNN 会造成梯度消失等问题(RNN 的梯度消失和 DNN 的梯度消失不是一个意思),关键在于通过时间反向传播算法中有一项乘积会导致其趋于 0 或者无穷,我们需要想一些办法使其导数乘积接近 1 。

获得导数乘积接近 1 的一种方式是设置线性自连接单元,并且这些连接的权重接近 1 。我们对某些 vvv 值应用更新 v←αμ(t−1)+(1−α)v(t)v \leftarrow \alpha \mu^{(t-1)}+(1-\alpha)v^{(t)}v←αμ(t−1)+(1−α)v(t) 去累积一个滑动平均值,这种单元被称为渗透单元。

6.LSTM 长短时记忆网络

https://www.zhihu.com/question/34878706

7.GRU

考虑 LSTM 中哪些门控是必要的,哪些是不必要的,GRU 将 LSTM 的遗忘因子和更新状态单元用单个门控单元代替了。更新方式如下

hi(t)=ui(t−1)hi(t−1)+(1−ui(t−1))σ(bi+∑jUi,jxj(t)+∑jWi,jrj(t−1)hj(t−1))h_{i}^{(t)}=u_i^{(t-1)}h_i^{(t-1)}+(1-u_i^{(t-1)})\sigma(b_i+\sum_jU_{i, j}x_j^{(t)}+\sum_jW_{i, j}r_j^{(t-1)}h_j^{(t-1)})hi(t)​=ui(t−1)​hi(t−1)​+(1−ui(t−1)​)σ(bi​+j∑​Ui,j​xj(t)​+j∑​Wi,j​rj(t−1)​hj(t−1)​)

其中 uuu 代表“更新门”,rrr 代表“复位门”, 他们的值就像前面的那样

ui(t)=σ(biu+∑jUi,juxj(t)+∑jWi,juhj(t))u_i^{(t)}=\sigma(b_i^u+\sum_jU_{i, j}^ux_j^{(t)}+\sum_jW_{i, j}^uh_j^{(t)})ui(t)​=σ(biu​+j∑​Ui,ju​xj(t)​+j∑​Wi,ju​hj(t)​)

ri(t)=σ(bir+∑jUi,jrxj(t)+∑jWi,jrhj(t))r_i^{(t)}=\sigma(b_i^r+\sum_jU_{i, j}^rx_j^{(t)}+\sum_jW_{i, j}^rh_j^{(t)})ri(t)​=σ(bir​+j∑​Ui,jr​xj(t)​+j∑​Wi,jr​hj(t)​)

常见循环神经网络概括相关推荐

  1. 常见的五种神经网络(3)-循环神经网络(上)篇

    转载请注明出处:https://thinkgamer.blog.csdn.net/article/details/100600661 博主微博:http://weibo.com/234654758 G ...

  2. 循环神经网络(RNN)相关知识

    文章目录 RNN概述 前向传播公式 通过时间反向传播(BPTT) RNN确定序列长度方式 其他RNN结构 基于RNN的应用 1,序列数据的分析 2,序列数据的转换 3,序列数据的生成 RNN的不足 1 ...

  3. rnn神经网络模型_一文读懂序列建模(deeplearning.ai)之循环神经网络(RNNs)

    作者:Pulkit Sharma,2019年1月21日 翻译:陈之炎 校对:丁楠雅 本文为你详细介绍序列模型,并分析其在不同的真实场景中的应用. 简介 如何预测一个序列中接下来要发生什么事情是一个非常 ...

  4. Recurrent Neural Networks(RNN) 循环神经网络初探

    1. 针对机器学习/深度神经网络"记忆能力"的讨论 0x1:数据规律的本质是能代表此类数据的通用模式 - 数据挖掘的本质是在进行模式提取 数据的本质是存储信息的介质,而模式(pat ...

  5. 【动手学深度学习】李沐——循环神经网络

    本文内容目录 序列模型 文本预处理 语言模型和数据集 循环神经网络 RNN的从零开始实现 RNN的简洁实现 通过时间反向传播 门控循环单元GRU 长短期记忆网络(LSTM) 深度循环神经网络 双向循环 ...

  6. 深度学习与计算机视觉教程(11) | 循环神经网络及视觉应用(CV通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/37 本文地址:https://www.showmeai.tech/article-d ...

  7. 深度学习 -- TensorFlow(9)循环神经网络RNN

    目录 一.循环神经网络RNN介绍 二.Elman network && Jordan network 三.RNN的多种架构 1.一对一 2.多对一 3.多对多 4. 一对多 5.Seq ...

  8. 吴恩达老师深度学习视频课笔记:循环神经网络

    Why sequence models?:序列数据例子,如下图:(1).语音识别(speech recognition):给定一个输入音频片段X,并要求输出片段对应的文字记录Y,这里输入和输出都是序列 ...

  9. 循环神经网络(RNN)简介

    人工神经网络介绍参考: https://blog.csdn.net/fengbingchun/article/details/50274471 卷积神经网络介绍参考: https://blog.csd ...

最新文章

  1. js数组中forEach/some/every/map/filter/reduce的区别
  2. 统计学习方法|支持向量机(SVM)原理剖析及实现
  3. next_permutation函数
  4. javascript 数组对象中的迭代方法
  5. Java 之 JavaScript (一)
  6. useGeneratedKeys的用法
  7. 输出字符串引用名java_将方法名称作为字符串给出时,如何调用Java方法?
  8. Linux学习之linux下文件目录的了解及总结
  9. Qt安装配置及连接MySQL
  10. Python 转 exe
  11. 算法---LeetCode 113. 路径总和 II
  12. LeetCode第 252 场周赛 之5187. 收集足够苹果的最小花园周长
  13. opencv Mat指针读取、修改像素值
  14. jquery自定义插件_创建一个自定义jQuery插件
  15. win32 应用程序更换icon图标
  16. C++ 学习记录(18) NVI
  17. WorldFirst如何注册?WorldFirst收款账号注册流程!
  18. 图神经网络学习(一)
  19. android native方法调用
  20. 冯 诺依曼与计算机的故事,计算机之父冯·诺依曼的故事

热门文章

  1. 干货 | 产品经理如何画脑图
  2. 骥遇伯乐,关键的一点是人与事的匹配
  3. 手机chrome禁止加载图片
  4. 黑苹果制作Clover开机引导脱离U盘,小新Pro13详细教程
  5. mysql 查询view_MySQL之视图(VIEW)
  6. Android EditText简单自定义边框样式
  7. react获取当前路由
  8. 修复鼠标单击变双击的问题
  9. 打印大的打印机打印不出来
  10. JAVA生成椭圆形签章