深度学习之循环神经网络(Recurrent Neural Network,RNN)

递归神经网络和循环神经网络

  • 循环神经网络(recurrent neural network):时间上的展开,处理的是序列结构的信息,是有环图
  • 递归神经网络(recursive neural network):空间上的展开,处理的是树状结构的信息,是无环图
  • 二者简称都是 RNN,但是一般提到的RNN指的是循环神经网络(recurrent neural network)。

为什么有bp神经网络、CNN、还需要RNN?

  • BP神经网络和CNN的输入输出都是互相独立的;但是实际应用中有些场景输出内容和之前的内 容是有关联的。
  • RNN引入“记忆”的概念;递归指其每一个元素都执行相同的任务,但是输出依赖于输入和“记忆”

什么是循环神经网络 RNN

我们已经学习了前馈网络的两种结构——bp神经网络和卷积神经网络。这两种结构有一个特点,就是假设输入是一个独立的没有上下文联系的单位。但是对于一些有明显的上下文特征的序列化输入,比如预测视频中下一帧的播放内容,那么很明显这样的输出必须依赖以前的输入, 也就是说网络必须拥有一定的”记忆能力”。为了赋予网络这样的记忆力,一种特殊结构的神经网络——循环神经网络(Recurrent Neural Network)便应运而生了

循环神经网络RNN的应用场景

自然语言处理(NLP)

RNNs已经被在实践中证明对NLP是非常成功的。如词向量表达、语句合法性检查、词性标注等。在RNNs中,目前使用最广泛最成功的模型便是LSTMs(Long Short-Term Memory,长短时记忆模型)模型,该模型通常比vanilla RNNs能够更好地对长短时依赖进行表达,该模型相对于一般的RNNs,只是在隐藏层做了手脚。对于LSTMs,后面会进行详细地介绍。下面对RNNs在NLP中的应用进行简单的介绍。

自然语言处理(NLP)——语言模型与文本生成

给你一个单词序列,我们需要根据前面的单词预测每一个单词的可能性。语言模型能够一个语句正确的可能性,这是机器翻译的一部分,往往可能性越大,语句越正确。另一种应用便是使用生成模型预测下一个单词的概率,从而生成新的文本根据输出概率的采样。语言模型中,典型的输入是单词序列中每个单词的词向量(如 One-hot vector),输出时预测的单词序列。当在对网络进行训练时,如果,那么第步的输出便是下一步的输入。 
  下面是RNNs中的语言模型和文本生成研究的三篇文章:

  • Recurrent neural network based language model
  • Extensions of Recurrent neural network based language model
  • Generating Text with Recurrent Neural Networks

机器翻译

机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。与语言模型关键的区别在于,需要将源语言语句序列输入后,才进行输出,即输出第一个单词时,便需要从完整的输入序列中进行获取。机器翻译如下图所示: 

MT

RNN for Machine Translation. Image Source 。下面是关于RNNs中机器翻译研究的三篇文章:

  • A Recursive Recurrent Neural Network for Statistical Machine Translation
  • Sequence to Sequence Learning with Neural Networks
  • Joint Language and Translation Modeling with Recurrent Neural Networks

语音识别

语音识别是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的概率值。 

RNNs中的语音识别研究论文:

  • Towards End-to-End Speech Recognition with Recurrent Neural Networks

图像描述生成

和卷积神经网络(convolutional Neural Networks, CNNs)一样,RNNs已经在对无标图像描述自动生成中得到应用。将CNNs与RNNs结合进行图像描述自动生成。这是一个非常神奇的研究与应用。该组合模型能够根据图像的特征生成描述。如下图所示: 

GID

图像描述生成中的深度视觉语义对比. Image Source

文本相似度计算等 。。。。。

循环神经网络 RNN 结构

循环神经网络是一类用于处理序列数据的神经网络,就像卷积神经网络是专门用于处理网格化数据(如一张图像)的神经网络,循环神经网络时专门用于处理序列 x^{(1)},...,x^{(T)} 的神经网络。

同一个神经元在不同时刻的状态构成了RNN神经网络,简化版的RNN结构如下:

循环神经网络的结果相比于卷积神经网络较简单,通常循环神经网络只包含输入层、隐藏层和输出层,加上输入输出层最多也就5层

以样本 ‘我是谁’  为例,体会一下

将一个神经元序列按时间展开就可以得到RNN的结构

  • 网络某一时刻 t 的输入X_t,和之前介绍的 bp 神经网络的输入一样,X_t 是一个n维向量,不同的是递归网络的输入将是一整个序列,也就是X=[X_1,…,X_{t-1},X_t,X_{t+1},…X_t]。对于语言模型,每一个 X_t 代表一个词向量,一整个序列就代表一句话
  • h_t 代表时刻 t 隐神经元对于线性转换值
  • S_t 是时间 t 处的“记忆”,S_t = f(UX_t + WS_{t-1}),f() 可以是非线性转换函数,比如 tanh 等, 通常我们把 S_t 叫做一个细胞,它有两个输出
  • o_t 代表时刻t的输出(神经元激活后的输出结果),比如是预测下一个词的话,可能是 sigmoid(softmax) 输出的属于每个候选词的概率,O_t = softamx(VS_t)
  • 输入层到隐藏层直接的权重由U表示,它将我们的原始输入进行抽象作为隐藏层的输入
  • 隐藏层到隐藏层的权重W,它是网络的记忆控制者,负责调度记忆。
  • 隐藏层到输出层的权重V,从隐藏层学习到的表示将通过它再一次抽象,并作为最终输出

循环神经网络RNN-BPTT 

RNN 的训练和 CNN/ANN 训练一样,同样适用 BP算法误差反向传播算法。区别在于:RNN中的参数U\V\W是共享的,并且在随机梯度下降算法中,每一步的输出不仅仅依赖当前步的网络,并且还需要前若干步网络的状态,那么这种BP改版的算法叫做Backpropagation Through Time(BPTT);BPTT算法和BP算法一样,在多层训练过程中(长时依赖<即当前的输出和前面很长的一段序列有关,一般超过10步>),可能产生梯度消失和梯度爆炸的问题。

BPTT和BP算法思路一样,都是求偏导,区别在于需要考虑时间对step的影响。

RNN正向传播阶段

在t=1的时刻,U,V,W都被随机初始化好,h0通常初始化为0,然后进行如下计算:

\begin{aligned} h_1 &= Ux_1+Ws_0 \\ s_1 &= f(h_1) \\ o_1 &= g(Vs_1) \end{aligned}

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

\begin{aligned} h_2 &= Ux_2 + Ws_1 \\ s_2 &= f(h_2) \\ o_2 &= g(Vs_2) \end{aligned}

以此类推,可得任意时刻t,神经元的计算过程

\begin{aligned} h_t &= Ux_t + Ws_{t-1} \\ s_t &= f(h_t) \\ o_t &= g(Vs_t) \end{aligned}

其中 f 可以是 tanh,relu,sigmoid 等激活函数, g 通常是 softmax,也可以是其他。 值得注意的是,我们说循环神经网络拥有记忆能力,而这种能力就是通过 W 将以往的输入状态进行总结,而作为下次输入的辅助,可以这样理解隐藏状态:h=f(现有的输入+过去记忆总结)

RNN反向传播阶段

bp神经网络用到 误差反向传播 方法将输出层的误差总和,对各个权重的梯度 ∇U,∇V,∇W,求偏导数,然后利用梯度下降法更新各个权重。

对于每一时刻 t 的 RNN 网络,网络的输出 o_t 都会产生一定误差 e_t ,误差的损失函数,可以是交叉熵也可以是平方误差等等。那么总的误差为E=\sum_te_t,我们的目标就是要求取各个权重(U、V、W)对总误差的偏导

\begin{aligned} \bigtriangledown U &= \frac{\partial E }{\partial U} = \sum_t \frac{\partial e_t }{\partial U} \\ \bigtriangledown V &= \frac{\partial E }{\partial V} = \sum_t \frac{\partial e_t }{\partial V} \\ \bigtriangledown W &= \frac{\partial E }{\partial W} = \sum_t \frac{\partial e_t }{\partial W} \end{aligned}

求V的偏导

对于输出 o_t = g(Vs_t),任意损失函数,求∇V是非常简单的,我们可以直接求取每个时刻的 \frac{\partial e_t }{\partial V},由于它不存在和之前的状态依赖,可以直接求导取得,然后简单地求和即可。对于∇W、∇U的计算不能直接求导,需要用链式求导法则。

求w的偏导

\begin{aligned} s_t &= f(Ux_t + Wh_{t-1}) \\ o_t &= g(Vs_t) \\ E &= \sum_t E_t\\ \frac{\partial E}{\partial W} &= \sum_t \frac{\partial E_t}{\partial W} \end{aligned}

求U的偏导

RNN 缺点

假如 t = 0 时刻的值,到 t = 100  时,由于前面的 W 次数过大,又可能会使其忘记 t = 0 时刻的信息,我们称之为 RNN梯度消失,但是不是真正意思上的消失,因为梯度是累加的过程,不可能为0,只是在某个时刻的梯度太小,忘记了前面时刻的内容

为了克服梯度消失的问题,LSTM和GRU模型便后续被推出了,LSTM和GRU都有特殊的方式存储”记忆”,以前梯度比较大的”记忆”不会像RNN一样马上被抹除,因此可以一定程度上克服梯度消失问题。

另一个简单的技巧 gradient clipping(梯度截取) 可以用来克服梯度爆炸的问题,也就是当你计算的梯度超过阈值c的或者小于阈值−c时候,便把此时的梯度设置成c或−c

下图所示是RNN的误差平面,可以看到RNN的误差平面要么非常陡峭,要么非常平坦,如果不采取任何措施,当你的参数在某一次更新之后,刚好碰到陡峭的地方,此时梯度变得非常大,那么你的参数更新也会非常大,很容易导致震荡问题。而如果你采取了gradient clipping,那么即使你不幸碰到陡峭的地方,梯度也不会爆炸,因为梯度被限制在某个阈值c

双向RNN Bidirectional RNN

Bidirectional RNN(双向RNN)假设当前t的输出不仅仅和之前的序列有关,并且还与之后的序列有关,例如:预测一个语句中缺失的词语那么需要根据上下文进行预测;Bidirectional RNN是一个相对简单的RNNs,由两个RNNs上下叠加在 一起组成。输出由这两个RNNs的隐藏层的状态决定

或者如下图

深度双向 RNN

Deep Bidirectional RNN(深度双向RNN)类似Bidirectional RNN,区别在于每个每一步的输入有多层网络,这样的话该网络便具有更加强大的表达能力和学习能力,但是复杂性也提高了,同时需要训练更多的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从北京回来的年轻人,我该告诉你点什么?

前言 就在上周末&#xff0c;我与公众号里的一个当地粉丝见面了&#xff0c;一起吃了顿饭&#xff0c;顺便聊了聊。先来简单交代下我们这位粉丝&#xff08;以下简称小L&#xff09;的经历以及诉求。 小L之前在北京八维研修学院培训的PHP&#xff0c;因为家庭原因&#xff0c;没…

Linphone编译【转载】

Linphone依赖太多的库&#xff0c;以致于稍有疏失&#xff0c;就会在编译&#xff0c;运行出错&#xff0c;都是由于依赖库安装的问题。 1 基础知识 1.1 动态库的连接 很多人安装完库后&#xff0c;configure依然报告这个库没有。这是对linux动态库知识匮乏造成&#xff0c;也就…

python助教的面试题_python面试题----持续更新中

为什么学习Python&#xff1f;通过什么途径学习的Python&#xff1f;Python和Java、PHP、C、C#、C等其他语言的对比&#xff1f;python 解释型语言&#xff0c;语法简洁优雅。C C 编译型语言&#xff0c;先编译后运行&#xff0c;偏底层。简述解释型和编译型编程语言&#xff1…

python3模块: requests

Python标准库中提供了&#xff1a;urllib等模块以供Http请求&#xff0c;但是&#xff0c;它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作&#xff0c;甚至包括各种方法覆盖&#xff0c;来完成最简单的任务。 发送GET请求 import urllib.requestf…

SUSE12系统安装及LVM设置详解

SUSE12自定义安装跟以往版本差不多&#xff0c;只是调整了一些功能安装顺序&#xff0c;例如网络设置放到很靠前&#xff0c;SUSE11的时候几乎是在后半部分&#xff0c;自定义分区也调整到网络设置之后&#xff0c;入口设置也隐秘&#xff0c;如果是熟悉suse11安装&#xff0c;…

在windows下编译FFMPEG-最新2009版本

转】在windows下编译FFMPEG-最新2009版本2010-11-17 18:50大家可以看到&#xff0c;此篇之前有很多个版本的“在windows下编译FFMPEG”&#xff0c;那些都是我在网上搜罗来的&#xff0c;在看了无数篇那些过期的、有借鉴价值的文章后&#xff0c;我终于成功在windows下编译出了…

CentOS7 安装nginx

1、官网下载安装包 官网&#xff1a;http://nginx.org/en/download.html 选择适合Linux的版本&#xff0c;这里选择最新的版本&#xff0c;下载到本地后上传到服务器或者centos下直接wget命令下载。 切换到/usr/local目录&#xff0c;下载软件包 # cd /usr/local # wget htt…

dvwa如何打开_DVWA详细 安装

Wamp就是Windows Apache Mysql PHP集成安装环境&#xff0c;即在window下的apache、php和mysql的服务器软件。PHP扩展、Apache模块&#xff0c;开启/关闭鼠标点点就搞定&#xff0c;再也不用亲自去修改配置文件了&#xff0c;WAMP它会去做。再也不用到处询问php的安装问题了&am…

CentOS7安装OpenFire

下载openfire wget http://download.igniterealtime.org/openfire/openfire-3.9.3-1.i386.rpm安装openfire yum install -y /home/openfire-3.9.3-1.i386.rpm安装运行库 yum install -y glibc.i686添加开启启动 chkconfig openfire on启动openfire服务 systemctlstart openfire…

CentOS 安装 php

大致步骤&#xff1a;下载–解压–编译–安装–配置 php官网&#xff1a; https://www.php.net/releases/ php5.6连接地址 http://hk1.php.net/get/php-5.6.36.tar.gz/from/this/mirror http://hk2.php.net/get/php-5.6.36.tar.gz/from/this/mirror 1.安装php 所依赖的软件 yu…

怎么利用ffmpeg和AviSynth给在windows下面为flv文件加水印

之前一直在找怎么为flv文件加上自己的水印,ffmpeg和vhook是在linux下面支持.在windows下面不支持.所以我就选择用ffmpeg和AviSynth为flv文件加水印.详细步骤如下: 1 首先当然下载ffmpeg和AviSynth了.具体的地址自己google一下就能找到很多.这里就不再详细介绍了. 一般情况ffm…

【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存/乐观悲观锁等优化算法)...

1. 循环分页或者循环进行部分读取处理数据的时候&#xff0c;使用 session.clear() ; 2. 对应1N&#xff08;N1&#xff09;问题使用如下解决方式&#xff1a; 1&#xff09;&#xff1a; 使用createCriteria进行查询(join fetch) 2&#xff09;&#xff1a;HQL -> joi…

vscode中安装webpack_VSCode下手动构建webpack项目(示例代码)

1.执行npm install nrm -g&#xff0c;安装nrm&#xff0c;此模块主要用于切换npm镜像源&#xff0c;简化手动配置步骤2.执行 nrm ls&#xff0c;可以看到npm源地址列表&#xff0c;当前使用的是默认源&#xff0c;npm https://registry.npmjs.org/3.执行 nrm use taobao&#…

Python html 代码转成 word(docx)

安装 sudo apt install pandoc pip3 install pypandoc示例代码 import pypandochtml """ <h3>This is a title</h3> <p><img src"http://placehold.it/150x150" alt"I go below the image as a caption"></p…

最新ffmpeg编译和用eclipse进行源码调试

最近由于项目需要&#xff0c;必须修改ffmpeg的源码进行修改才能满足项目的需求&#xff0c;但以前我从来没有自己去编译和使用ffmpeg的源代码&#xff0c;一直都是用别人编译好了的sdk&#xff0c;再加上习惯了vs方便的编译环境&#xff0c;要在linux下对如此多的源代码进行编…

Django补充知识点——用户管理

内容概要 1、Form表单2、Ajax3、布局&#xff0c;Django母板4、序列化5、Ajax相关6、分页7、XSS攻击8、CSRF9、CBV、FBV 10、类中用装饰器的两种方法 11、上传文件 12、数据库正向查询、反向查询、多对多查询 13、jQuery对象和DOM对象可以互相转换 14、cookie和session 用户管理…

easypoi导出excel 效率_Spring Boot 入门(十二):报表导出,对比poi、jxl和esayExcel的效率...

关于poi、jxl和esayExcel的介绍自行百度。jxl最多支持03版excel&#xff0c;所以单个sheet页面最多只能导出65536条数据。我直接将excel导入到浏览器并打开&#xff0c;以下统计导出时长指将数据从数据库查询&#xff0c;并写入到excel的过程。不包括打开excel所消耗的时间为了…

Python html 代码转成图片、PDF

一、下载 1、python的imgkit、pdfkit库 pip install imgkit pip install pdfkit 2、wkhtmltopdf工具包 下载地址&#xff1a;https://wkhtmltopdf.org/downloads.html 下载之后安装&#xff0c;安装完成会生成两个程序&#xff0c;分别用来转图片和pdf&#xff1a; 二、使…

SpringEL expression:

2019独角兽企业重金招聘Python工程师标准>>> 这个异常有下面几种情况 1、你写的 EL 表达式有语法错误。 2、再者就是你取得变量是多级的话比如 student.address.prevince 属性model 关联有问题。 3、还有就是你取得值为空&#xff08;null&#xff09; 比如 Thymel…

利用qt和ffmpeg软件来制作视频裁剪工具

0 什么是ffmpeg? Libav&#xff08;旧称&#xff1a;FFmpeg&#xff09;是一个自由软件&#xff0c;可以运行音频和视频多种格式的录影、转档、流功能[1]&#xff0c;包含了libavcodec ─这是一个用于多个专案中音频和视频的解码器库&#xff0c;以及 libavformat ——一个音频…